LCD12864.jpg (354.49 KB, 下載次數: 46)
下載附件
2018-10-9 06:32 上傳
- ;================================================
- ;LCD12864串行通信例程(匯編語言)
- ;楊小強 2018年10月
- ;MCU:STC15F104W,內部R/C時鐘,頻率11.0492MHz
- ;LCM:帶中文字庫的LCD12864(控制芯片為ST7920)
- ;
- ;LCM字符顯示RAM的地址與字符顯示區域的對應關系
- ;第一行 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復位懸空
- ;背光電源A和K分別接到VCC、VSS
- ;R/W:接P3.2
- ; E:接P3.3
- ;
- ;==============LCD接口定義==============
- SID EQU P3.2 ;第5根線,串行數據 RW
- SCK EQU P3.3 ;第6根線,串行同步時鐘 E
- ORG 0000H
- LJMP START
- ORG 0100H ;程序代碼開始地址安排在100H
- START: MOV SP,#050H ;設置堆棧指針
- LCALL LcmInit ;LCM初始化
- LCALL LcmClearTXT ;清屏
- MOV R4,#80H ;LCM屏幕地址,第一行第一個
- MOV DPTR,#DAB1 ;顯示DAB1處的字符串
- LCALL Display ;調用顯示子程序
- MOV R4,#90H ;LCM屏幕地址,第二行第一個
- MOV DPTR,#DAB2 ;顯示DAB2處的字符串
- LCALL Display
- MOV R4,#88H ;LCM屏幕地址,第三行第一個
- MOV DPTR,#DAB3 ;顯示DAB3處的字符串
- LCALL Display
- MOV R4,#98H ;LCM屏幕地址,第四行第一個
- MOV DPTR,#DAB4 ;顯示DAB4處的字符串
- LCALL Display
- ;**** 在屏幕右下角顯示數字從0到9,間隔一秒 ****
- START1: MOV R2,#30H ;把初始值0的ASCII碼30H放入R2
- START2: MOV R4,#9FH ;屏幕右下角最后一個位置
- LCALL WriteCommand
- MOV R4,#20H ;先顯示一個空格
- LCALL WriteData
- MOV A,R2 ;把R2內容傳到R4
- MOV R4,A ;把R2內容傳到R4
- LCALL WriteData ;顯示R4內容
- INC R2 ;R2增1
- LCALL Delay ;延時1秒
- CJNE R2,#3AH,START2 ;如果R2不等于3AH則跳轉到START2
- LJMP START1 ;等于3AH,跳轉到START1,又從0開始
- ;================================================
- ;子 程 序:在屏幕指定位置顯示字符串一行(16個字符)
- ;入口參數:R4=LCM屏幕地址,DPTR=字符串地址
- ;出口參數:無
- ;================================================
- 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
- ;===================================
- ;子 程 序:接收一個字節
- ;入口參數:無
- ;出口參數:R7=接收到的內容
- ;===================================
- 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
- ;===================================
- ;子 程 序:讀數據 ReadData
- ;入口參數:無
- ;出口參數:R7=接收到的數據
- ;===================================
- ReadData:
- LCALL CheckBusy ;忙狀態檢測
- MOV R7,#0FEH ;FE(讀數據)
- LCALL _SendByte
- LJMP ReceiveByte
- ;===========忙狀態檢測==============
- CheckBusy:
- MOV R7,#0FCH ;FC(讀狀態)
- LCALL _SendByte ;發送R7內容到LCM
- LCALL ReceiveByte ;從LCM讀出一個字節到R7
- MOV A,R7
- JB ACC.7,CheckBusy ;忙檢測
- RET
- ;===================================
- ;子 程 序:寫指令 WriteCommand
- ;入口參數:R4=待傳輸的指令
- ;出口參數:無
- ;===================================
- WriteCommand:
- LCALL CheckBusy ;忙狀態檢測
- MOV R7,#0F8H ;F8(寫指令)
- LJMP SendByte
- ;===================================
- ;子 程 序:寫數據 WriteData
- ;入口參數:R4=待傳輸的數據
- ;出口參數:無
- ;===================================
- WriteData:
- LCALL CheckBusy ;忙狀態檢測
- MOV R7,#0FAH ;FA(寫數據)
- ;******** 向LCM發送串行數據 SendByte ********
- ;發送方法:每次都由三個字節組成,
- ;第一個字節(放在R7)向控制器發送命令控制字(寫指令F8,寫數據FA,讀狀態FC,讀數據FE),
- ;第二個字節(放在R4)的高4位為發送指令或數據的高4位,低4位補0
- ;第三個字節(放在R4)的低4位為發送指令或數據的高4位,高4位補0
- SendByte:
- LCALL _SendByte ;發送R7內容到LCM(第一個字節)
- MOV A,R4
- ANL A,#0F0H ;"與"操作,執行完后高4位不變,低4位為0
- MOV R7,A
- LCALL _SendByte ;(發送第二個字節)
- MOV A,R4 ;(以下發送第三個字節)
- SWAP A ;高4位與低4位交換
- ANL A,#0F0H ;位與運算
- MOV R7,A
- _SendByte:
- CLR A ;發送R7內容到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 ;功能設置,一次送8位數據,基本指令集
- LCALL WriteCommand
- MOV R4,#03H ;地址歸位
- LCALL WriteCommand
- MOV R4,#0CH ;0000,1100 整體顯示,游標off,游標位置
- LCALL WriteCommand
- MOV R4,#01H ;0000,0001 清DDRAM
- LCALL WriteCommand
- MOV R4,#06H ;光標右移,畫面不移動,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
- ;============ 延時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
|