📄 text_display.asm
字号:
;将C/D接到单片机的P2.7口,将CS接到单片机的P2.6口,采用总线寻址方式
DATA1 EQU 30H;参数1单元
DATA2 EQU 31H;参数2单元
COM EQU 32H;指令代码单元
CODE0 EQU 33H;字符代码存放单元
ATTR0 EQU 34H;字符属性码存放单元
O_Y EQU 35H;Y坐标(0-15),128/8=16,即一列显示所占字节数
O_X EQU 36H;X坐标(0-29),240/8=30,即一行显示所占字节数
INDI_H EQU 37H;计算文本显示RAM地址的高位备份单元
INDI_L EQU 38H;计算文本显示RAM地址的低位备份单元
C_ADD EQU 07F00H;指令通道地址
D_ADD EQU 3F00H;数据通道地址
FS BIT P1.7;选择字体控制位
ORG 0000H
LJMP MAIN
; ORG 000BH
; LJMP IT0P
; ORG 001BH
; LJMP IT1P
ORG 0100H
MAIN: MOV SP,#60H
; MOV TMOD,#11H;晶振为11.0592HZ,T0,T1设置为方式1
; MOV TL0,#00H
; MOV TH0,#0DCH;设置T0定时为10ms
; MOV TL1,#00H
; MOV TH1,#0DCH;设置T1定时为10ms
MOV DPTR,#C_ADD;设置指令通道地址
MOVX A,@DPTR ;写入操作
LCALL LCD_INT
MOV O_Y,#07H;设置坐标初始值
MOV O_X,#02H
MOV R0,#00H;设查表的初值
MOV R2,#26
LOOP: LCALL CAL_ADD;计算文本显示RAM地址
MOV A,R0
MOV DPTR,#ASC_TAB;设置表首地址
MOVC A,@A+DPTR ;查表
MOV CODE0,A
LCALL T_DISP;显示字符
INC R0
INC O_X
DJNZ R2,LOOP
HERE: AJMP HERE
;LCD初始化子程序
LCD_INT: CLR FS;将字体设置成8*8dots
MOV DATA1,#00H
MOV DATA2,#00H
MOV COM,#40H;设置文本区首址为0000H
LCALL WR_CD0
MOV DATA1,#1EH
MOV DATA2,#00H;设置文本显示区域宽度,即一行显示所占字节数为30个
MOV COM,#41H
LCALL WR_CD0
MOV DATA1,#00H
MOV DATA2,#08H
MOV COM,#42H;设置图形区首址为0800H
LCALL WR_CD0
MOV DATA1,#1EH
MOV DATA2,#00H;设置图形显示区域宽度,即一行显示所占字节数为30个
MOV COM,#43H
LCALL WR_CD0
MOV COM,#0A2H;光标形状设置,8(列)*2(行)
LCALL WR_CD2
MOV COM,#80H;显示方式设置,逻辑“或”合成
LCALL WR_CD2
MOV COM,#9CH;显示开关设置,将光标显示以及闪烁禁用,文本和图形显示启用
LCALL WR_CD2
LCALL CLEAR
RET
;写指令和写数据子程序
WR_CD0: LCALL ST01;双字节参数指令写入入口
MOV A,DATA1;取第一个参数单元数据
MOV DPTR,#D_ADD;设置数据通道地址/数据写入地址
MOVX @DPTR,A;写入操作
WR_CD1: LCALL ST01;单字节参数指令写入入口
MOV A,DATA2;取第二个参数单元数据
MOV DPTR,#D_ADD;设置数据通道地址/数据写入地址
MOVX @DPTR,A;写入操作
WR_CD2: LCALL ST01;无参指数令写入入口
MOV A,COM;取指令代码单元数据
MOV DPTR,#C_ADD;设置指令通道地址/指令写入地址
MOVX @DPTR,A;写入操作
RET
;判断状态子程序STA0-STA7 ,即读状态子程序
;判断状态位STA1,STA0子程序(读写指令和读写数据状态),在写指令或者数据之前,这两个标志位
;必须同时位“1”
ST01: LCALL RE_CO;读指令
JNB ACC.0,ST01
JNB ACC.1,ST01
RET
;判断状态位STA2子程序(数据自动读状态),该位在数据自动读操作中取代STA1和STA0有效,
;在连续读过程中每读一次之前都要确认STA2为“1”
ST2: LCALL RE_CO;读指令
JNB ACC.2,ST2
RET
;判断状态位STA3子程序(数据自动写状态)
ST3: LCALL RE_CO;读指令
JNB ACC.3,ST3
RET
;判断状态位STA6子程序(屏读/屏拷贝状态)
ST6: LCALL RE_CO;读指令
JB ACC.6,ST6;判断STA6如果为1的话,出错
RET ;若STA6如果为0的话, 正确
;读指令子程序
RE_CO: ; MOV P0,#0FFH
MOV DPTR,#C_ADD;设置指令通道地址
MOVX A,@DPTR ;写入操作
RET
;清显示的RAM子程序
CLEAR: MOV DATA1,#00H
MOV DATA2,#00H
MOV COM,#24H;设置显示RAM首地址/地址指针位置
LCALL WR_CD0
MOV R3,#00H;设置循环量,每列 显示16个字符
MOV R4,#1EH;每行可以写三十个字符
MOV COM,#0B0H;设置自动写方式
LCALL WR_CD2
CLEAR0: LCALL ST3;判断自动写状态位STA3
MOV A,#00H;置数据0
MOV DPTR,#D_ADD;写入数据
MOVX @DPTR,A
DJNZ R4,CLEAR0
MOV R4,#1EH;重装每行字符数
DJNZ R3,CLEAR0
MOV COM,#0B2H;设置自动写结束命令
LCALL WR_CD2
RET
;计算文本显示RAM地址,通过Y坐标(0-15),128/8=16,即一列显示所占字节数
;X坐标(0-29),240/8=30,即一行显示所占字节数,通过这两个数计算文本显示RAM地址
CAL_ADD: MOV A,O_Y
MOV B,#1EH;文本显示宽度为1EH
MUL AB ;结果为BA
CLR C
ADD A,O_X
MOV INDI_L,A ;备份低位地址指针
MOV A,B
ADDC A,#00H
MOV INDI_H,A ;备份高位地址指针
RET
;文本显示子程序
T_DISP: MOV A,INDI_L
MOV DATA1,A ;存文本显示RAM地址低位
MOV A,INDI_H
MOV DATA2,A ;存文本显示RAM地址高位
MOV COM,#24H;设置地址指针
LCALL WR_CD0
MOV DATA2,CODE0;写入字符代码
MOV COM,#0C4H
LCALL WR_CD1
RET
ASC_TAB: DB 2CH,29H,35H,38H,29H,21H,2FH,2AH,29H,21H,00H,2CH,2FH,36H,25H
DB 00H,2DH,21H,2EH,3AH,21H,29H,27H,21H,2EH,27H
END
; CLR C ;计算图形显示RAM地址
; MOV A,INDI_H
; ADD A,#08H
; MOV DATA2,A
; MOV COM,#24H;设置地址指针
; LCALL WR_CD0
; MOV DATA2,ATTR0;写入字符代码
; MOV COM,#0C4H
; LCALL WR_CD1
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -