雖然是兩百來行的程序,但是今天我調試了一天才弄出來什麼地方錯了,呵呵。
原來是在讀P0口的時候沒有向P0口寫#0ffh。弄的我忙了半天,最後在CSDN上找了個C的proteus仿真程序和keil的C程序。堅定了我的電路圖是沒有問題的,最後我一步一步的聯合keil和proteus將錯誤找出來了,挺高興的,呵呵。
想回報一下上傳C源程序和proteus仿真程序的朋友,不過,今天沒能傳上去,只有在這發個圖和彙編的程序了。等到可以上傳資源了,我上傳一下,弄點積分,好在學習點東西啊!
呵呵,祝大家好運!
RS BIT P2.5 ;寄存器選擇信號
RorW BIT P2.6 ;讀、寫選擇信號
E BIT P2.7 ;使能控制
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV SP,#60H ;設堆棧指針
LCALL INIT ;調LCM初始化程序
LCALL FIRST ;調設定顯示地址爲第1行,第1個位置子程序
MOV DPTR,#TAB1 ;設置第1行字符的首地址
LCALL DISPLAY ;調用顯示字符子程序
LCALL SECOND ;調設定顯示地址爲第2行,第1個位置子程序
MOV DPTR,#TAB2 ;設置第2行字符的首地址
LCALL DISPLAY ;調用顯示字符子程序
SJMP $ ;主程序結束
;LCM初始化程序(本程序採用了熱啓動的指令段)
;熱啓動操作步驟:1,寫入指令代碼,30H或38H。2,延時時間>4.1ms。
; 3,寫入指令代碼,30H或38H。4,延時時間>100us。
; 5,寫入指令代碼,30H或38H。
INIT:
LCALL DELAY1 ;調延時5ms的子程序
LCALL DELAY1 ;延時,等待電源穩定
MOV A,#38H ;可以寫30H或38H,我感覺,這是寫工作方式的字節吧,
;工作方式:0 0 1 DL N F * *,
;DL=1,採用8位數據總線,N=1,顯示雙行字符行,F=0,採用5*&點陣字符體
MOV P2,#00011111B ;E,RS,RorW爲0
NOP
SETB E ;E爲高,使能
MOV P0,A ;寫入指令代碼
CLR E
LCALL DELAY1 ;延時5ms
MOV A,#38H
MOV P2,#00011111B
NOP
SETB E
MOV P0,A
CLR E
LCALL DELAY2 ;延時120us子程序
MOV A,#38H
MOV P2,#00011111B
NOP
SETB E
MOV P0,A
CLR E
LCALL DELAY2 ;延時120us子程序
;熱啓動程序到此結束
;下面是初始化程序
MOV A,#38H ;工作方式設置爲2行顯示,8爲數據總線,5*7點陣字符體
ACALL WRC ;判斷BF和寫命令
MOV A,#01H ;清除顯示
ACALL WRC
MOV A,#06H ;設置輸入方式爲AC加1,光標右移,畫面不動
ACALL WRC
MOV A,#0EH ;設置顯示狀態爲開顯示,顯示光標,不閃爍
ACALL WRC
RET
;初始化程序到此結束
;判讀BF和寫指令
WRC:
ACALL BUSY ;調判讀BF子程序
MOV P2,#00011111B ;E,RorW,RS爲0,準備寫
NOP
SETB E ;使能
MOV P0,A ;寫指令代碼
CLR E ;E爲低
RET
;判斷忙程序,不忙則返回
BUSY:
PUSH ACC
W: MOV P2,#01011111B ;RS=0,RorW=1,E=0,準備讀數據
NOP
mov P0,#0FFh ;將P0口設置爲輸入口
SETB E
// mov P0,0FFH
NOP
NOP
MOV A,P0 ;讀BF和AC值
JB ACC.7,W ;BF不爲0,等待
CLR E
POP ACC
RET
;寫顯示數據子程序
WRTD:
ACALL BUSY
MOV P2,#00111111B ;RS=1,RorW=0,E=0,準備寫數據
SETB E
MOV P0,A
CLR E
LCALL DELAY2
RET
;顯示字符程序
DISPLAY:
MOV R1,#00
NEXT:
MOV A,R1
MOVC A,@A+DPTR ;將DPTR所指的字符碼逐一送到LCD顯示
CJNE A,#21H,DSL ;到結束符“!”時返回,否則繼續顯示
RET
DSL:
LCALL WRTD ;調顯示子程序
INC R1
SJMP NEXT
FIRST:
MOV A,#10000000B ;DDRAM的地址設爲80H,即要顯示的字符從第1行第1個位置開始
CALL WRC
RET
SECOND:
MOV A,#11000000B ;DDRAM的地址設爲C0H,即要顯示的字符從第2行第1個位置開始
CALL WRC
RET
DELAY1:
MOV R7,#05H ;毫秒數
DL1:
MOV R6,#0FAH ;12MHz,1ms延時預設值
DL2:
NOP
NOP
DJNZ R1,DL2
DJNZ R7,DL1
RET
DELAY2:
MOV R7,#0CH ;10us的倍數
DL3:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R7,DL3
RET
TAB1:
DB ' WELCOME TO' ;LCD第1行顯示的字符
DB '!' ;結束碼爲“!”
TAB2:
DB ' OUR UNIVERSITY' ;LCD第2行顯示的字符
DB '!' ;結束碼爲“!”
END