|
LCD12864.jpg (354.49 KB, 下載次數(shù): 46)
下載附件
2018-10-9 06:32 上傳
- ;================================================
- ;LCD12864串行通信例程(匯編語(yǔ)言)
- ;楊小強(qiáng) 2018年10月
- ;MCU:STC15F104W,內(nèi)部R/C時(shí)鐘,頻率11.0492MHz
- ;LCM:帶中文字庫(kù)的LCD12864(控制芯片為ST7920)
- ;
- ;LCM字符顯示RAM的地址與字符顯示區(qū)域的對(duì)應(yīng)關(guān)系
- ;第一行 80H 81H 82H 83H 84H 85H 86H 87H
- ;第二行 90H 91H 92H 93H 94H 95H 96H 97H
- ;第三行 88H 89H 8AH 8BH 8CH 8DH 8EH 8FH
- ;第四行 98H 99H 9AH 9BH 9CH 9DH 9EH 9FH
- ;
- ;接線方法,共4根線:VCC、VSS、R/W(SID)、E(SCK)
- ;PSB接電源地(H:并口方式,L:串口方式)
- ;CS(RS)接電源正(片選,高電平有效)
- ;/RESET復(fù)位懸空
- ;背光電源A和K分別接到VCC、VSS
- ;R/W:接P3.2
- ; E:接P3.3
- ;
- ;==============LCD接口定義==============
- SID EQU P3.2 ;第5根線,串行數(shù)據(jù) RW
- SCK EQU P3.3 ;第6根線,串行同步時(shí)鐘 E
- ORG 0000H
- LJMP START
- ORG 0100H ;程序代碼開(kāi)始地址安排在100H
- START: MOV SP,#050H ;設(shè)置堆棧指針
- LCALL LcmInit ;LCM初始化
- LCALL LcmClearTXT ;清屏
- MOV R4,#80H ;LCM屏幕地址,第一行第一個(gè)
- MOV DPTR,#DAB1 ;顯示DAB1處的字符串
- LCALL Display ;調(diào)用顯示子程序
- MOV R4,#90H ;LCM屏幕地址,第二行第一個(gè)
- MOV DPTR,#DAB2 ;顯示DAB2處的字符串
- LCALL Display
- MOV R4,#88H ;LCM屏幕地址,第三行第一個(gè)
- MOV DPTR,#DAB3 ;顯示DAB3處的字符串
- LCALL Display
- MOV R4,#98H ;LCM屏幕地址,第四行第一個(gè)
- MOV DPTR,#DAB4 ;顯示DAB4處的字符串
- LCALL Display
- ;**** 在屏幕右下角顯示數(shù)字從0到9,間隔一秒 ****
- START1: MOV R2,#30H ;把初始值0的ASCII碼30H放入R2
- START2: MOV R4,#9FH ;屏幕右下角最后一個(gè)位置
- LCALL WriteCommand
- MOV R4,#20H ;先顯示一個(gè)空格
- LCALL WriteData
- MOV A,R2 ;把R2內(nèi)容傳到R4
- MOV R4,A ;把R2內(nèi)容傳到R4
- LCALL WriteData ;顯示R4內(nèi)容
- INC R2 ;R2增1
- LCALL Delay ;延時(shí)1秒
- CJNE R2,#3AH,START2 ;如果R2不等于3AH則跳轉(zhuǎn)到START2
- LJMP START1 ;等于3AH,跳轉(zhuǎn)到START1,又從0開(kāi)始
- ;================================================
- ;子 程 序:在屏幕指定位置顯示字符串一行(16個(gè)字符)
- ;入口參數(shù):R4=LCM屏幕地址,DPTR=字符串地址
- ;出口參數(shù):無(wú)
- ;================================================
- Display:
- LCALL WriteCommand
- MOV R3,#0
- Display1:
- CLR A
- MOVC A,@A+DPTR
- INC R3
- INC DPTR
- MOV R4,A
- LCALL WriteData
- CJNE R3,#16,Display1
- RET
- ;===================================
- ;子 程 序:接收一個(gè)字節(jié)
- ;入口參數(shù):無(wú)
- ;出口參數(shù):R7=接收到的內(nèi)容
- ;===================================
- ReceiveByte:
- CLR A
- MOV R7,A
- MOV R6,A
- MOV R5,A
- ReB1: MOV A,R7
- ADD A,ACC
- MOV R7,A
- CLR SCK
- SETB SCK
- CLR SCK
- JNB SID,ReB2
- INC R7
- ReB2: INC R5
- CJNE R5,#08H,ReB1
- CLR A
- MOV R5,A
- ReB3: MOV A,R6
- ADD A,ACC
- MOV R6,A
- CLR SCK
- SETB SCK
- CLR SCK
- JNB SID,ReB4
- INC R6
- ReB4: INC R5
- CJNE R5,#08H,ReB3
- MOV A,R6
- ANL A,#0FH
- MOV R6,A
- MOV A,R7
- ANL A,#0F0H
- ADD A,R6
- MOV R7,A
- RET
- ;===================================
- ;子 程 序:讀數(shù)據(jù) ReadData
- ;入口參數(shù):無(wú)
- ;出口參數(shù):R7=接收到的數(shù)據(jù)
- ;===================================
- ReadData:
- LCALL CheckBusy ;忙狀態(tài)檢測(cè)
- MOV R7,#0FEH ;FE(讀數(shù)據(jù))
- LCALL _SendByte
- LJMP ReceiveByte
- ;===========忙狀態(tài)檢測(cè)==============
- CheckBusy:
- MOV R7,#0FCH ;FC(讀狀態(tài))
- LCALL _SendByte ;發(fā)送R7內(nèi)容到LCM
- LCALL ReceiveByte ;從LCM讀出一個(gè)字節(jié)到R7
- MOV A,R7
- JB ACC.7,CheckBusy ;忙檢測(cè)
- RET
- ;===================================
- ;子 程 序:寫(xiě)指令 WriteCommand
- ;入口參數(shù):R4=待傳輸?shù)闹噶?li>;出口參數(shù):無(wú)
- ;===================================
- WriteCommand:
- LCALL CheckBusy ;忙狀態(tài)檢測(cè)
- MOV R7,#0F8H ;F8(寫(xiě)指令)
- LJMP SendByte
- ;===================================
- ;子 程 序:寫(xiě)數(shù)據(jù) WriteData
- ;入口參數(shù):R4=待傳輸?shù)臄?shù)據(jù)
- ;出口參數(shù):無(wú)
- ;===================================
- WriteData:
- LCALL CheckBusy ;忙狀態(tài)檢測(cè)
- MOV R7,#0FAH ;FA(寫(xiě)數(shù)據(jù))
- ;******** 向LCM發(fā)送串行數(shù)據(jù) SendByte ********
- ;發(fā)送方法:每次都由三個(gè)字節(jié)組成,
- ;第一個(gè)字節(jié)(放在R7)向控制器發(fā)送命令控制字(寫(xiě)指令F8,寫(xiě)數(shù)據(jù)FA,讀狀態(tài)FC,讀數(shù)據(jù)FE),
- ;第二個(gè)字節(jié)(放在R4)的高4位為發(fā)送指令或數(shù)據(jù)的高4位,低4位補(bǔ)0
- ;第三個(gè)字節(jié)(放在R4)的低4位為發(fā)送指令或數(shù)據(jù)的高4位,高4位補(bǔ)0
- SendByte:
- LCALL _SendByte ;發(fā)送R7內(nèi)容到LCM(第一個(gè)字節(jié))
- MOV A,R4
- ANL A,#0F0H ;"與"操作,執(zhí)行完后高4位不變,低4位為0
- MOV R7,A
- LCALL _SendByte ;(發(fā)送第二個(gè)字節(jié))
- MOV A,R4 ;(以下發(fā)送第三個(gè)字節(jié))
- SWAP A ;高4位與低4位交換
- ANL A,#0F0H ;位與運(yùn)算
- MOV R7,A
- _SendByte:
- CLR A ;發(fā)送R7內(nèi)容到LCM
- MOV R6,A
- Se1: CLR SCK
- MOV A,R7
- ADD A,ACC
- MOV R7,A
- MOV SID,C
- SETB SCK
- CLR SCK
- INC R6
- CJNE R6,#08H,Se1
- RET
- ;=============== LCM初始化 LcmInit ================
- LcmInit:
- MOV R4,#030H ;功能設(shè)置,一次送8位數(shù)據(jù),基本指令集
- LCALL WriteCommand
- MOV R4,#03H ;地址歸位
- LCALL WriteCommand
- MOV R4,#0CH ;0000,1100 整體顯示,游標(biāo)off,游標(biāo)位置
- LCALL WriteCommand
- MOV R4,#01H ;0000,0001 清DDRAM
- LCALL WriteCommand
- MOV R4,#06H ;光標(biāo)右移,畫(huà)面不移動(dòng),AC加1
- LJMP WriteCommand
- ;============ 清屏 ============
- LcmClearTXT:
- MOV R4,#30H
- LCALL WriteCommand
- MOV R4,#80H
- LCALL WriteCommand
- CLR A
- MOV R3,A
- LCT1: MOV R4,#20H
- LCALL WriteData
- INC R3
- CJNE R3,#64,LCT1
- RET
- ;============ 延時(shí)1秒(11.0592MHz) ===============
- Delay: PUSH 30H
- PUSH 31H
- PUSH 32H
- MOV 30H,#34
- MOV 31H,#159
- MOV 32H,#56
- NEXT: DJNZ 32H,NEXT
- DJNZ 31H,NEXT
- DJNZ 30H,NEXT
- POP 32H
- POP 31H
- POP 30H
- RET
- ;========== 要顯示的字符串 ==========
- DAB1: DB 04CH,043H,044H,031H,032H,038H,036H,034H,0B4H,0AEH,0D0H,0D0H,0CDH,0A8H,0D0H,0C5H
- DAB2: DB 0C0H,0FDH,0B3H,0CCH,0A3H,0A8H,0BBH,0E3H,0B1H,0E0H,0D3H,0EFH,0D1H,0D4H,0A3H,0A9H
- DAB3: DB 020H,020H,020H,020H,0D1H,0EEH,0D0H,0A1H,0C7H,0BFH,020H,020H,020H,020H,020H,020H
- DAB4: DB 020H,020H,032H,030H,031H,038H,0C4H,0EAH,031H,030H,0D4H,0C2H,020H,020H,020H,020H
- END
|
|