📄 cwprd.asm
字号:
; 西文字符写入子程序CW_PR(适应MGLS12864)
; 占用内部资源:O_XL,O_YL,CODE,COUNT1,A,B,DPTR
; 内部调用子程序:PR1,PR2,PR4,PR5
; 连接字库: CHTAB
; 程序调用入口: CW_PR
; 程序输入变量: O_XL,O_YL,CODE
CW_PR: MOV DPTR,#CHTAB ; 确定字符字模块首地址
MOV A,CODE ; 取代码
MOV B,#08H ; 字模块宽度为8个字节
MUL AB ; 代码x8
ADD A,DPL ; 字符字模块首地址
MOV DPL,A ; = 字模库首地址 + 代码x 8
MOV A,B
ADDC A,DPH
MOV DPH,A
MOV CODE,#00H ; 借用为间址寄存器
MOV A,O_YL ; 读页地址寄存器
JB ACC.7,CW_1 ; 判字符体
MOV COUNT1,#06H ; 6x8点阵
LJMP CW_2
CW_1: MOV COUNT1,#08H ; 8x8点阵
CW_2: ANL A,#07H ; 取页地址值
ORL A,#0B8H ; "或"页地址指令代码
MOV COM,A ; 写页地址指针
LCALL PR1
LCALL PR4
MOV A,O_XL ; 读列地址寄存器
CLR C
SUBB A,#40H ; 列地址-64
JC CW_3 ; 〈0为左屏显示区域
MOV O_XL,A ; ≥0为右屏显示区域
MOV A,O_YL
SETB ACC.5 ; 设置区域标志位.
MOV O_YL,A ; "00"为左,"10"为右
CW_3: MOV COM,O_XL ; 设置列地址值
ORL COM,#40H ; "或"列地址指令标志位
MOV A,O_YL ; 判区域标志以确定设置哪个控制器
ANL A,#30H
CW_31: CJNE A,#20H,CW_32 ; "10"为右区
LCALL PR4
LJMP CW_4
CW_32: LCALL PR1 ; "00"为左区
CW_4: MOV A,CODE ; 取间址寄存器值
MOVC A,@A+DPTR ; 取字符字模数据
MOV DAT1,A ; 写数据
MOV A,O_YL ; 判区域标志
ANL A,#30H
CW_41: CJNE A,#20H,CW_42 ; "10"为右区
LCALL PR5
LJMP CW_5
CW_42: LCALL PR2 ; "00"为左区
CW_5: INC CODE ; 间址加1
INC O_XL ; 列地址加1
MOV A,O_XL ; 判列地址是否超出区域范围
CJNE A,#40H,CW_6
CW_6: JC CW_9 ; 未超出则继续
MOV O_XL,#00H ;
MOV A,O_YL ; 超出则判在何区域
JB ACC.5,CW_91 ; 在右区域则退出
CW_61: SETB ACC.5 ; 在左区则转右区
MOV O_YL,A
MOV COM,#40H ; 设置右区列地址为"0"
LCALL PR4
CW_9: DJNZ COUNT1,CW_4 ; 循环
CW_91: RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -