📄 lcd12864_serial_char.asm
字号:
;12864的串行控制方式
;内置8192个16*16点阵字符,128个16*8个ASCII字符,可显示8*4行行16*16点汉字
;8位通讯的设置,PSB端要置1,E在通信过程中一直要有效
;显示图形时,先写入水平(0到15)与垂直(0到32)的坐标,再写入两个8位的资料
;注意:第0区的R5为LCD串行读写控制的RAM,不能在其程序的其他地方使用0区的R5,否则显示不正常
;控制位定义
CS EQU P2.0
SID EQU P2.1
SCLK EQU P2.2
PSB EQU P2.3
RST EQU P2.5
;--------------------------
ORG 0000H
AJMP MAIN
;--------------------------
ORG 0030H
MAIN:
MOV SP,#5FH
LCALL LCD12864_INI ;初始化LCD
LCALL LCD12864_CHRS ;将四行字都显示出来
AJMP $
;END OF MAIN
;*********************************LCD12864**********************************************
;初始化程序,写指令,写数据,写行,忙检测
;------------------------
LCD12864_INI:
;初始化
CLR PSB ;串口方式
SETB CS ;令LCD12864被选中,高电平有效
CLR SCLK ;时钟置于低电平
CLR RST ;复位
MOV R4,#60
LCALL DELAYMS
SETB RST
NOP
MOV B,#20H ;基本指令操作(当并行时是4位并口方式,如果8位就是30H)
LCALL LCD12864_WR_OP_NO_CHK
MOV A,#01H ;清屏
LCALL LCD12864_WR_OP
MOV A,#06H ;指定资料写入或读取时,光标移动方向,AC自加1
LCALL LCD12864_WR_OP
MOV A,#0CH ;开显示,关光标,不闪烁
LCALL LCD12864_WR_OP
CLR CS
RET
;-----------------------OK
LCD12864_CHRS:
;将表中的四行字都显示出来
MOV A,#80H
MOV DPTR,#CHR1
LCALL LCD12864_CHR
MOV A,#90H
MOV DPTR,#CHR2
LCALL LCD12864_CHR
MOV A,#88H
MOV DPTR,#CHR3
LCALL LCD12864_CHR
MOV A,#98H
MOV DPTR,#CHR4
LCALL LCD12864_CHR
RET
;----------------------OK
LCD12864_CHR:
;显示第一行字
LCALL LCD12864_WR_OP ;使DDRAM地址指到第n行首
MOV R1,#16
LC_LP:
CLR A
MOVC A,@A+DPTR
LCALL LCD12864_WR_DAT
INC DPTR
DJNZ R1,LC_LP
RET
;----------------------OK
LCD12864_WR_OP:
;将命令A写入LCD12864
MOV B,A ;先将A的值保存起来
LCALL LCD12864_CHK_BUSY ;忙状态检测
LCD12864_WR_OP_NO_CHK:
SETB CS ;令LCD被选中
MOV A,#0F8H
MOV R5,#8
LWO_LP1:
RLC A
MOV SID,C
SETB SCLK
NOP
NOP
CLR SCLK
DJNZ R5,LWO_LP1
MOV A,B
ANL A,#0F0H
MOV R5,#8
LWO_LP2:
RLC A
MOV SID,C
SETB SCLK
NOP
NOP
CLR SCLK
DJNZ R5,LWO_LP2
MOV A,B
SWAP A
ANL A,#0F0H
MOV R5,#8
LWO_LP3:
RLC A
MOV SID,C
SETB SCLK
NOP
NOP
CLR SCLK
DJNZ R5,LWO_LP3
CLR CS
RET
;----------------------OK
LCD12864_WR_DAT:
;将数据A写入LCD12864
MOV B,A
LCALL LCD12864_CHK_BUSY
SETB CS
MOV A,#0FAH
MOV R5,#8
LWD_LP1:
RLC A
MOV SID,C
SETB SCLK
NOP
NOP
CLR SCLK
DJNZ R5,LWD_LP1
MOV A,B
ANL A,#0F0H
MOV R5,#8
LWD_LP2:
RLC A
MOV SID,C
SETB SCLK
NOP
NOP
CLR SCLK
DJNZ R5,LWD_LP2
MOV A,B
SWAP A
ANL A,#0F0H
MOV R5,#8
LWD_LP3:
RLC A
MOV SID,C
SETB SCLK
NOP
NOP
CLR SCLK
DJNZ R5,LWD_LP3
CLR CS
RET
;-----------------------OK
LCD12864_CHK_BUSY:
;检测忙位
MOV R7,B
SETB CS
MOV A,#0FCH
MOV R5,#8
LCB_LP1:
RLC A
MOV SID,C
SETB SCLK
NOP
NOP
CLR SCLK
DJNZ R5,LCB_LP1
MOV R5,#8
LCB_LP2:
SETB SCLK
NOP
MOV C,SID
RLC A
CLR SCLK
DJNZ R5,LCB_LP2
MOV B,A
MOV R5,#8
LCB_LP3:
SETB SCLK
NOP
MOV C,SID
RLC A
CLR SCLK
DJNZ R5,LCB_LP3
SWAP A
ORL A,B
CLR CS
JB ACC.7,LCD12864_CHK_BUSY
MOV B,R7
RET
;----------
DELAYMS:
MOV R3,#185
DL:
NOP
NOP
NOP
DJNZ R3,DL
DJNZ R4,DELAYMS
RET
;----------------------
CHR1: DB "天降大任于斯人也"
CHR2: DB "必先苦其筋骨, 饿"
CHR3: DB "其体肤, 空泛其身"
CHR4: DB "行拂乱其所为...."
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -