📄 lcd.asm
字号:
DAT1 EQU 30H ;第一参数单元
DAT2 EQU 31H ;第二参数/数据单元
COM EQU 32H ;指令代码单元
C_ADD EQU 8100H ;指令通道地址
D_ADD EQU 8000H ;数据通道地址
;直接访问方式驱动子程序
;读状态字子程序
LCDRDST:MOV DPTR,#C_ADD ;设置指令通道地址
MOVX A,@DPTR
RET
;判状态位STA1,STA0子程序
LCDST01:LCALL LCDRDST
JNB ACC.0,LCDST01
JNB ACC.1,LCDST01
RET
;判状态位STA2子程序
LCDSTA2:LCALL LCDRDST
JNB ACC.2,LCDSTA2
RET
;判状态位STA3子程序
LCDSTA3:LCALL LCDRDST
JNB ACC.3,LCDSTA3
RET
;判状态位STA6子程序
LCDSTA6:LCALL LCDRDST
JB ACC.6,LCDSERR
RET
LCDSERR:LJMP LCDSTA6 ;出错处理程序
;写指令和写数据子程序
LCDPRL1:LCALL LCDST01 ;双字节参数指令写入入口
MOV A,DAT1 ;取第一参数单元数据
LCALL LCDPR13 ;写入参数
LCDPR11:LCALL LCDST01 ;单字节 参数指令写入入口
MOV A,DAT2 ;取第二参数单元数据
LCALL LCDPR13 ;写入参数
LCDPR12:LCALL LCDST01 ;无参数指令写入入口
MOV A,COM ;取指令代码单元数据
LJMP LCDPR14 ;写入指令代码
LCDPR13:MOV DPTR,#D_ADD ;设置数据通道地址/数据写入入口
LCDPR14:MOVX @DPTR,A ;写入操作
RET
;读数据子程序
LCDPRL2:LCALL LCDST01 ;判状态位
MOV DPTR,#D_ADD ;设置数据通道地址
MOVX A,@DPTR ;读数据操作
MOV DAT2,A ;数据存入第二参数/数据单元
RET
;子程序
;读状态字子程序
LCDRDST:MOV P1,#0FFH ;P1口置1
SETB CD ;CD=1
CLR RD ;RD=0
MOV A,P1 ;读操作
SETB RD ;RD=1
RET
;写指令和写数据子程序
LCDPRL1:LCALL LCDST01 ;双字节 参数指令写入入口
MOV A,DAT1 ;取第一参数单元数据
LCALL LCDPR13 ;写入参数
LCDPR11:LCALL LCDST01 ;单字节 参数指令写入入口
MOV A,DAT2 ;取第二参数单元数据
LCALL LCDPR13 ;写入参数
LCDPR12:LCALL LCDST01 ;无参数指令写入入口
MOV A,COM ;取指令代码单元数据
LJMP LCDPR14 ;写入指令代码
LCDPR13:CLR CD ;数据写入入口
LCDPR14:MOV P1,A ;设置数据
CLR WR ;WR=0
SETB WR ;WR=1
RET
;读数据子程序
LCDPRL2:LCALL LCDST01 ;判状态位
CLR CD ;C/D=0
MOV P1,#0FFH ;P1 口置1
CLR RD ;RD=0
MOV A,P1 ;读取数据
SETB RD ; RD=1
MOV DAT2,A ;数据存入第二参数/数据单元
RET
;初始化设置主要是对显示区域和显示方式的设置.
LCDLINT:MOV DAT1,#00H ;设置文本显示区域首地址
MOV DAT2,#00H
MOV COM,#40H
LCALL LCDPRL1
MOV DAT1,#20H ;设置文本显示区域宽度
MOV DAT2,#00H ;即一行显示所占字节数
MOV COM,#41H
LCALL LCDPRL1
MOV DAT1,#00H ;设置图形显示区域首地址
MOV DAT2,#08H ;或为文本属性区域首地址
MOV COM,#42H
LCALL LCDPRL1
MOV DAT1,#20H ;设置图形显示区域宽度
MOV DAT2,00H ;或为文本属性区域宽度
MOV COM,#43H ;即一行显示所占字节数
LCALL LCDPRL1
MOV COM,#0A7H ;光标形状设置
LCALL LCDPR12
MOV COM,#80H ;显示方式设置逻辑或合成
LCALL LCDPR12
MOV COM,#9CH ;显示开关设置开文本和图形显示
LCALL LCDPR12
RET
;对显示存储器完全清零,不分显示区域性质
LCDCLER:MOV DAT1,#00H ;设置显示存储器首地址
MOV DAT2,#00H
MOV COM,#24H
LCALL LCDPRL1
MOV R3,#00H ;设置循环量
MOV R4,#20H
MOV COM,#0B0H
LCALL LCDPR12
LCDCLR1:LCALL LCDSTA3 ;判状态位 STA2
MOV A,#00H ;置数据0
LCALL LCDPR13 ;写入数据
DJNZ R3,LCDCLR1 ;循环
DJNZ R4,LCDCLR1
MOV COM,#0B2H ;设置自动写结束指令
LCALL LCDPR12
RET
;建立CGRAM子程序(地址设定在代码位80H起处)
COUNT EQU 34H ;西文字符个数
LCDGRAM:MOV DAT1,#03H ;设置CGRAM 偏置地址
MOV DAT2,#00H
MOV COM,#22H
LCALL LCDPRL1
MOV DAT1,#00H ;设置存储器地址指针
MOV DAT2,#1CH
MOV COM,#24H
LCALL LCDPRL1
MOV COM,#0B0H ;设置自动写方式
LCALL LCDPR12
MOV A,COUNT ;计算写入的字节数
MOV B,#08H
MUL AB
MOV COUNT,A ;计算器低8 位数据
INC B ;计算器高8 位数据
MOV DPTR,#LCDCTAB ;取字符库首地址
PUSH DPH ;存字符库指针
PUSH DPL
LCDRAM1:LCALL LCDSTA3 ;判自动写状态位
POP DPL ;取字符库指针
POP DPH
CLR A
MOVC A,@A+DPTR ;取数据
INC DPTR ;字符库指针加一
PUSH DPH ;存字符库指针
PUSH DPL
LCALL LCDPR13 ;写入数据
DJNZ COUNT,LCDRAM1 ;计数循环
DJNZ B,LCDRAM1
MOV COM,#0B2H ;写入结束自动写指令
LCALL LCDPR12
POP ACC ;修正栈指针
POP ACC
RET
;建立CGRAM 的步骤
;1. 在程序区内建立汉字字模表CGTAB
;2. 汉字代码定义(以液=80H为例)
;3. 写入一个汉字的字模数据,设置COUNT值位4
;4. 调用CGRAM 子程序
MOV COUNT,#08H
LCALL LCDGRAM
SJMP $
LCDCTAB:DB 000H,040H,037H,010H,081H,061H,022H,00AH; 液=80H
DB 016H,02BH,0E2H,022H,022H,022H,023H,022H
DB 080H,044H,0FEH,020H,020H,03CH,044H,064H
DB 098H,048H,050H,020H,050H,08EH,004H,000H
;汉字字模排列格式为1~16 字节为汉字作半部分自上而下排列的字模数据,第
;17~32字节为汉字右半部分自上而下排列的字模数据。
;示例四:汉字写入子程序(文本方式)
;在文本方式下显示汉字,首先要建立汉字CGRAM,要定义汉字代码。一个汉字
;需4 个代码。
CODE EQU 33H ;汉字字符代码
O_Y EQU 35H ;Y坐标(0_15)
O_X EQU 36H ;X坐标(0-29)
LCDLWRI:MOV A,O_Y ;计算显示RAM 地址
MOV B,#20H
MUL AB
ADD A,O_X
MOV O_X,A
MOV DAT1,A
MOV A,B
ADDC A,#00H ;文本显示区首地址为0000H
MOV O_Y,A
MOV DAT2,A ;设置显示RAM 地址
MOV COM,#24H
LCALL LCDPRL1
MOV A,CODE ;取汉字代码
MOV DAT2,A ;写入左上半部汉字代码
MOV COM,#0C0H
LCALL LCDPR11
MOV A,CODE
ADD A,#02H
MOV DAT2,A ;写入右上半部汉字代码
LCALL LCDPR11
MOV A,#20H ;显示RAM 地址修正
ADD A,O_X
MOV DAT1,A
CLR A
ADDC A,O_Y
MOV DAT2,A
MOV COM,#24H ;设置显示RAM 地址
LCALL LCDPRL1
MOV A,CODE
INC A
MOV DAT2,A ;写入左下半部汉字代码
MOV COM,#0C0H
LCALL LCDPR11
MOV A, CODE
ADD A,#03H
MOV DAT2,A ;写入右下半部汉字代码
LCALL LCDPR11
RET
;文本方式下汉字显示演示程序:
MOV CODE,#80H
MOV O_X,#03H
MOV O_Y,#02H
LCALL LCDLWRI
MOV CODE,#84H
MOV O_X,#07H
MOV O_Y,#02H
LCALL LCDLWRI
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -