标题:
LCD12864串行通信(汇编语言)
[打印本页]
作者:
杨小强
时间:
2018-10-9 06:50
标题:
LCD12864串行通信(汇编语言)
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
LCD12864串行通信汇编程序.zip
(2.84 KB, 下载次数: 38)
2018-10-9 06:33 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
lanhua520
时间:
2020-4-18 10:51
感谢贡献!
值得学习!
作者:
lanhua520
时间:
2020-4-18 11:16
并行通讯的液晶屏可以当串口使用么?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1