登錄
|
立即注冊(cè)
|
使用QQ帳號(hào)登錄
論壇
>
51單片機(jī)
發(fā)帖
|
LCD12864串行通信(匯編語(yǔ)言)
看5042
|
回2
|
收藏
樓主
ID:396309
只看他
2018-10-9 06:50
;================================================
;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
LCD12864串行通信匯編程序.zip
(2.84 KB)
(下載次數(shù): 38, 2018-10-9 06:33 上傳)
下載積分: 黑幣 -5
沙發(fā)
ID:220748
只看他
2020-4-18 10:51
感謝貢獻(xiàn)!
值得學(xué)習(xí)!
板凳
ID:220748
只看他
2020-4-18 11:16
并行通訊的液晶屏可以當(dāng)串口使用么?
51黑電子論壇
Powered by
Discuz!
X3.1
首頁(yè)
|
標(biāo)準(zhǔn)版
|
觸屏版
|
電腦版