📄 test1.asm
字号:
POP DPL
RET
;=============写数据子程序(E1)===========================
PR2: PUSH DPL
PUSH DPH
MOV DPTR,#CRADD1 ; 设置读状态字地址
PR21: MOVX A,@DPTR ; 读状态字
JB ACC.7,PR21 ; 判"忙"标志为"0"否, 否再读
MOV DPTR,#DWADD1 ; 设置写显示数据地址
MOV A,DAT1 ; 取数据
MOVX @DPTR,A ; 写数据
POP DPH
POP DPL
RET
;=============读数据子程序(E1)===========================
PR3: PUSH DPL
PUSH DPH
MOV DPTR,#CRADD1 ; 设置读状态字地址
PR31: MOVX A,@DPTR ; 读状态字
JB ACC.7,PR31 ; 判"忙"标志为"0"否, 否再读
MOV DPTR,#DRADD1 ; 设置读显示数据地址
MOVX A,@DPTR ; 读数据
MOV DAT1,A ; 存数据
POP DPH
POP DPL
RET
;=============写指令子程序(E2)===========================
PR4: PUSH DPL
PUSH DPH
MOV DPTR,#CRADD2 ; 设置读状态字地址
PR41: MOVX A,@DPTR ; 读状态字
JB ACC.7,PR41 ; 判"忙"标志为"0"否, 否再读
MOV DPTR,#CWADD2 ; 设置写指令代码地址
MOV A,COM ; 取指令代码
MOVX @DPTR,A ; 写指令代码
POP DPH
POP DPL
RET
;=============写数据子程序(E2)===========================
PR5: PUSH DPL
PUSH DPH
MOV DPTR,#CRADD2 ; 设置读状态字地址
PR51: MOVX A,@DPTR ; 读状态字
JB ACC.7,PR51 ; 判"忙"标志为"0"否, 否再读
MOV DPTR,#DWADD2 ; 设置写显示数据地址
MOV A,DAT1 ; 取数据
MOVX @DPTR,A ; 写数据
POP DPH
POP DPL
RET
;=============读数据子程序(E2)===========================
PR6: PUSH DPL
PUSH DPH
MOV DPTR,#CRADD2 ; 设置读状态字地址
PR61: MOVX A,@DPTR ; 读状态字
JB ACC.7,PR61 ; 判"忙"标志为"0"否, 否再读
MOV DPTR,#DRADD2 ; 设置读显示数据地址
MOVX A,@DPTR ; 读数据
MOV DAT1,A ; 存数据
POP DPH
POP DPL
RET
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
; 初始化子程序INT
; 内部调用子程序:PR1,PR4
; 程序调用入口: INT
; 程序调用变量:无
INT: MOV COM,#0E2H ; 复位
LCALL PR1
LCALL PR4
MOV COM,#0A4H ; 关闭等待状态
LCALL PR1
LCALL PR4
MOV COM,#0A9H ; 设置1/32占空比
LCALL PR1
LCALL PR4
MOV COM,#0A0H ; 正向排序设置
LCALL PR1
LCALL PR4
MOV COM,#0C0H ; 设置显示起始行为第一行
LCALL PR1
LCALL PR4
MOV COM,#0AFH ; 开显示设置
LCALL PR1
LCALL PR4
RET
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
; 清显示RAM 区(清屏)子程序CLEAR
; 占用内部寄存器:R3,R4
; 内部调用子程序:PR1,PR2,PR4,PR5
; 程序调用入口:CLEAR
CLEAR: MOV R4,#00H ; 页面地址暂存器设置
CLEAR1: MOV A,R4 ; 取页地址值
ORL A,#0B8H ; "或"页面地址设置代码
MOV COM,A ; 页面地址设置
LCALL PR1
LCALL PR4
MOV COM,#00H ; 列地址设置为"0"
LCALL PR1
LCALL PR4
MOV R3,#50H ; 一页清80个字节
CLEAR2: MOV DAT1,#00H ; 显示数据为"0"
LCALL PR2
LCALL PR5
DJNZ R3,CLEAR2 ; 页内字节清零循环
INC R4 ; 页地址暂存器加1
CJNE R4,#04H,CLEAR1 ; RAM 区清零循环
RET
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
; 西文字符写入子程序CW_PR
; 程序参数选择:PARA1
; 占用内部资源: 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,#03H ; 取页地址值
ORL A,#0B8H ; "或"页地址指令代码
MOV COM,A ; 写页地址指针
LCALL PR1
LCALL PR4
MOV A,O_XL ; 读列地址寄存器
CLR C
SUBB A,#PARA1 ; 列地址-模块参数
JC CW_3 ; 〈0为左半屏显示区域(E1)
MOV O_XL,A ; ≥0为右半屏显示区域(E2)
MOV A,O_YL
SETB ACC.3 ; 设置区域标志位.
MOV O_YL,A ; "0"为E1,"1"为E2
CW_3: MOV COM,O_XL ; 设置列地址值
MOV A,O_YL ; 判区域标志以确定设置哪个控制器
JNB ACC.3,CW_4
LCALL PR4 ; 区域E2
LJMP CW_5
CW_4: LCALL PR1 ; 区域E1
CW_5: MOV A,CODE ; 取间址寄存器值
MOVC A,@A+DPTR ; 取字符字模数据
MOV DAT1,A ; 写数据
MOV A,O_YL ; 判区域标志
JNB ACC.3,CW_6
LCALL PR5 ; 区域E2
LJMP CW_7
CW_6: LCALL PR2 ; 区域E1
CW_7: INC CODE ; 间址加1
INC O_XL ; 列地址加1
MOV A,O_XL ; 判列地址是否超出区域范围
CJNE A,#PARA1,CW_8
CW_8: JC CW_9 ; 未超出则继续
MOV A,O_YL ; 超出则判是否在区域E2
JB ACC.3,CW_9 ; 在区域E2则退出
SETB ACC.3 ; 在区域E1则修改成区域E2
MOV O_YL,A
MOV COM,#00H ; 设置列地址为"0"
LCALL PR4
CW_9: DJNZ COUNT1,CW_5 ; 循环
RET
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
;16*16点阵中文写入子程序CCW_PR
; 程序参数选择:PARA1
; 占用内部资源:O_XL,O_YL,CODE,COUNT1,A,DPTR
; 内部调用子程序:PR1,PR2,PR4,PR5
; 连接字库: CCTAB
; 程序调用入口: CCW_PR
; 程序输入变量: O_XL,O_YL,CODE
CCW_PR: MOV DPTR,#CCTAB ; 确定字符字模块首地址
MOV A,CODE ; 取代码
MOV B,#20H ; 字模块宽度为32个字节
MUL AB ; 代码x32
ADD A,DPL ; 字符字模块首地址
MOV DPL,A ; = 字模库首地址 + 代码x 32
MOV A,B
ADDC A,DPH
MOV DPH,A
PUSH O_XL ; 列地址入栈
PUSH O_XL ; 列地址入栈
MOV CODE,#00H ; 代码寄存器借用为间址寄存器
CCW_1: MOV COUNT1,#10H ; 计数器设置为16
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 CCW_2 ; 〈0为左半屏显示区域(E1)
MOV O_XL,A ; ≥0为右半屏显示区域(E2)
MOV A,O_YL
SETB ACC.3 ; 设置区域标志位.
MOV O_YL,A ; "0"为E1,"1"为E2
CCW_2: MOV COM,O_XL ; 设置列地址值
MOV A,O_YL ; 判区域标志以确定设置哪个控制器
JNB ACC.3,CCW_3
LCALL PR4 ; 区域E2
LJMP CCW_4
CCW_3: LCALL PR1 ; 区域E1
CCW_4: MOV A,CODE ; 取间址寄存器值
MOVC A,@A+DPTR ; 取汉字字模数据
MOV DAT1,A ; 写数据
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -