📄 8乘16点阵字符写入子程序-cnw_pr.asm
字号:
;###########8*16点阵字符写入程序-CNW_PR #################
; 程序参数选择:PARA1 PARA1 EQU 3DH ;液晶模块参数 MGLS12232 用于判断在左半边显示还是在右半边显示
; 占用内部资源:O_XL,O_YL,CODE,COUNT1,A,DPTR
; 入口参数:列地址:O_XL,页地址的D0,D1: O_YL,字符字库偏移量:CODE
; 出口参数: 无
; 内部调用子程序:
; 1. 写指令代码子程序(左屏E1)PR1
; 2. 写显示数据子程序(左屏E1)PR2
; 3. 写指令代码子程序(右屏E2)PR4
; 4. 写显示数据子程序(右屏E2)PR5
; 连接字库:CCTAB
;###########################################################
CNW_PR: MOV DPTR,#CNTAB ;确定数字字符字模块首地址
MOV A,CODE ;取代码
MOV B,#10H ;字模块宽度为16个字节
MUL AB ;代码x16 乘除指令会自动清进位C
ADD A,DPL ;字符字模块首地址
MOV DPL,A ;=字模库首地址+代码x16
MOV A,B
ADDC A,DPH
MOV DPH,A
PUSH O_XL ;列地址入栈
PUSH O_XL ;列地址入栈
MOV CODE,#00H ;代码寄存器借用为间址寄存器
CNW_1: MOV COUNT1,#08H ;计数器设置为8
MOV A,O_YL ;读页地址寄存器
ANL A,#03H
ORL A,#0B8H ;"或"页地址设置代码
MOV COM,A ;写页地址设置指令
LCALL PR1
LCALL PR4
POP O_XL ;取列地址值
MOV A,O_XL ;读列地址寄存器
CLR C
SUBB A,#PARA1 ;列地址-模块参数
JC CNW_2 ;〈0为左半屏显示区域(E1)
MOV O_XL,A ;≥0为右半屏显示区域(E2)
MOV A,O_YL
SETB ACC.3 ;设置区域标志位.
MOV O_YL,A ;"0"为E1,"1"为E2
CNW_2: MOV COM,O_XL ;设置列地址值
MOV A,O_YL ;判区域标志以确定设置哪个控制器
JNB ACC.3,CNW_3
LCALL PR4 ;区域E2
LJMP CNW_4
CNW_3: LCALL PR1 ;区域E1
CNW_4: MOV A,CODE ;取间址寄存器值
MOVC A,@A+DPTR ;取汉字字模数据
JNB DISMOD,CNW_41
CPL A ;反白显示
CNW_41: MOV DAT1,A ;写数据
MOV A,O_YL
JNB ACC.3,CNW_5
LCALL PR5 ;区域E2
LJMP CNW_6
CNW_5: LCALL PR2 ;区域E1
CNW_6: INC CODE ;间址寄存器加1
INC O_XL ;列地址寄存器加1
MOV A,O_XL ;判列地址是否超出区域范围
CJNE A,#PARA1,CNW_7
CNW_7: JC CNW_8 ;未超出则继续
MOV A,O_YL ;超出则判是否在区域E2
JB ACC.3,CNW_8 ;在区域E2则退出
SETB ACC.3 ;在区域E1则修改成区域E2
MOV O_YL,A
MOV COM,#00H ;设置区域E2列地址为"0"
LCALL PR4
CNW_8: DJNZ COUNT1,CNW_4 ;当页循环
MOV A,O_YL ;读页地址寄存器
JB ACC.7,CNW_9 ;判完成标志D7位, "1"则完成退出
INC A ;否则页地址加1
SETB ACC.7 ;置完成位为"1"
CLR ACC.3
MOV O_YL,A
MOV CODE,#08H ;间址寄存器设置为16
LJMP CNW_1 ;大循环
CNW_9: RET
;==============================================================
;数字和符号字库
CNTAB:
;-- 文字: 0 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --
DB 000H,0E0H,010H,008H,008H,010H,0E0H,000H
DB 000H,00FH,010H,020H,020H,010H,00FH,000H
;-- 文字: 1 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --
DB 000H,010H,010H,0F8H,000H,000H,000H,000H
DB 000H,020H,020H,03FH,020H,020H,000H,000H
;-- 文字: 2 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --
DB 000H,070H,008H,008H,008H,088H,070H,000H
DB 000H,030H,028H,024H,022H,021H,030H,000H
;-- 文字: 3 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --
DB 000H,030H,008H,088H,088H,048H,030H,000H
DB 000H,018H,020H,020H,020H,011H,00EH,000H
;-- 文字: 4 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --
DB 000H,000H,0C0H,020H,010H,0F8H,000H,000H
DB 000H,007H,004H,024H,024H,03FH,024H,000H
;-- 文字: 5 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --
DB 000H,0F8H,008H,088H,088H,008H,008H,000H
DB 000H,019H,021H,020H,020H,011H,00EH,000H
;-- 文字: 6 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --
DB 000H,0E0H,010H,088H,088H,018H,000H,000H
DB 000H,00FH,011H,020H,020H,011H,00EH,000H
;-- 文字: 7 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --
DB 000H,038H,008H,008H,0C8H,038H,008H,000H
DB 000H,000H,000H,03FH,000H,000H,000H,000H
;-- 文字: 8 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --
DB 000H,070H,088H,008H,008H,088H,070H,000H
DB 000H,01CH,022H,021H,021H,022H,01CH,000H
;-- 文字: 9 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --
DB 000H,0E0H,010H,008H,008H,010H,0E0H,000H
DB 000H,000H,031H,022H,022H,011H,00FH,000H
;-- 文字: . --
;-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --
DB 000H,000H,000H,000H,000H,000H,000H,000H
DB 000H,030H,030H,000H,000H,000H,000H,000H
;==============================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -