📄 subprogram.asm
字号:
MOV DPTR,#CCTAB ; 设置汉字字库指针
MOV A,CODEE ; 取汉字代码
MOV B,#20H ; 计算字模首地址
MUL AB ;
ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A
MOV A,O_XL ; 8点占2个字节
RL A ; X*2(change the acc to a)
MOV O_XL,A
MOV A,O_YL ; XY坐标值转换成显示RAM 地址值
MOV B,#PARA1 ; 显示域宽度值
MUL AB ;所使用的正好是多字节乘法的内容
ADD A,O_XL
MOV O_XL,A
MOV A,B
ADDC A,#00H
MOV O_YL,A
MOV A,O_YH
MOV B,#PARA1
MUL AB
ADD A,O_YL
MOV O_YL,A ; 地址存入O_XL,O_YL和O_YH,也就是说显示的地址占用三个字节,由低到高依次排列,使用的是多字节乘法错位相加的思路
MOV A,B
ADDC A,#00H ;因为是128K所以必然要使用三个字节因为两个字节就是64K的地址
MOV O_YH,A
CCW_PR1:MOV A,O_YH
MOV C,ACC.0 ; 取A16值.因为一共是128K所以要判断A16的值来确定上低64K还是高64K
CLR A
MOV ACC.2,C
MOV COM,A
ORL COM,#08H ; 设置显示RAM单元地址
LCALL PR1
MOV DAT1,O_XL ;所以第三个字节仅仅就是一个标志位
LCALL PR2
INC COM
LCALL PR1
MOV DAT1,O_YL
LCALL PR2
INC COM ; 设置显示数据读写状态
LCALL PR1
MOV A,COUNT1
MOVC A,@A+DPTR ; 取左半部字模数
;MOV R7,A ;;;;;;;;;;;;
;MOV R6,#48H ;;;;;;;;;;;;;;;
LCALL _GRAY ; 调灰度生成子程序
MOV A,COUNT1
ORL A,#10H ; 计算右半部字模地址,这个偏移地址的确定与字模数据的存储的形式有关
MOVC A,@A+DPTR ; 取右半部字模数据
;MOV R7,A ;;;;;;;;;;;;
;MOV R6,#48H ;;;;;;;;;;;;;;;
LCALL _GRAY ; 调灰度生成子程序
MOV A,O_XL ; 修正地址
ADD A,#PARA1 ;相当于光标向下移动一行
MOV O_XL,A
MOV A,O_YL ;双字节加法的简单的应用
ADDC A,#00H
MOV O_YL,A
CLR A
ADDC A,O_YH ;防止进入下一个显示区域
MOV O_YH,A
INC COUNT1 ; 计数器加一
MOV A,COUNT1
CJNE A,#10H,CCW_PR1; 循环
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 汉字写入子程序(24*24点阵字库)CC24PR childpam(4)
; 占用内部资源:O_XL,O_YL,O_YH,CODE,COUNT1,A,B,DPTR
; 内部调用子程序:PR1,PR2
; 连接字库: CCTAB24
; 程序参数: PARA1
; 程序调用入口: CC24PR
; 程序输入变量: O_XL,O_YL,O_YH,CODE
; 汉字写入子程序如下:
_CC24PR: MOV O_XL,R7
MOV O_YL,R5
MOV O_YH,R4
MOV CODEE,R3
MOV COUNT1,#00H ; 计数器=0
MOV DPTR,#CCTAB24 ; 设置汉字字库指针
MOV A,CODEE ; 取汉字代码
MOV B,#48H ; 计算字模数据首地址
MUL AB
ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A
MOV A,O_XL ; 8点占2个字节
RL A ; X*2(change the acc to the a)
MOV O_XL,A
MOV A,O_YL ; XY坐标值转换成显示RAM 地址值
MOV B,#PARA1 ; 显示域宽度值
MUL AB
ADD A,O_XL
MOV O_XL,A
MOV A,B
ADDC A,#00H
MOV O_YL,A
MOV A,O_YH
MOV B,#PARA1
MUL AB
ADD A,O_YL
MOV O_YL,A ; 地址存入O_XL,O_YL和O_YH
MOV A,B
ADDC A,#00H
MOV O_YH,A
CC24PR1:MOV A,O_YH
MOV C,ACC.0 ; 取A16值
CLR A
MOV ACC.2,C
MOV COM,A
ORL COM,#08H ; 设置显示RAM单元地址
LCALL PR1
MOV DAT1,O_XL
LCALL PR2
INC COM
LCALL PR1
MOV DAT1,O_YL
LCALL PR2
INC COM ; 设置显示数据读写状态,真正的或读或写动作由后续的指令来完成
LCALL PR1
MOV A,COUNT1
MOVC A,@A+DPTR ; 取左半部字模数
; MOV R7,A ;;;;;;;;;;;;
; MOV R6,#48H ;;;;;;;;;;;;;;;
LCALL _GRAY ; 调灰度生成子程序
MOV A,COUNT1
ADD A,#18H ; 计算中部字模地址
MOVC A,@A+DPTR ; 取中部字模数据
; MOV R7,A ;;;;;;;;;;;;
; MOV R6,#48H ;;;;;;;;;;;;;;;
LCALL _GRAY ; 调灰度生成子程序
MOV A,COUNT1
ADD A,#30H ; 计算右半部字模地址
MOVC A,@A+DPTR ; 取右半部字模数据
; MOV R7,A ;;;;;;;;;;;;
; MOV R6,#48H ;;;;;;;;;;;;;;;
LCALL _GRAY ; 调灰度生成子程序
MOV A,O_XL ; 修正地址
ADD A,#PARA1 ; 显示地址向下移动一列
MOV O_XL,A
MOV A,O_YL
ADDC A,#00H
MOV O_YL,A
CLR A
ADDC A,O_YH
MOV O_YH,A
INC COUNT1 ; 计数器加一
MOV A,COUNT1
CJNE A,#18H,CC24PR1; 循环
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 西文字符写入子程序CW_PR childprogram (3)
; 占用内部资源:O_XL,O_YL,O_YH,CODE,COUNT1,A,B,DPTR
; 内部调用子程序:PR1,PR2,GRAY
; 程序参数: PARA1
; 连接字库: CHTAB
; 程序调用入口: CW_PR
; 程序输入变量: O_XL,O_YL,O_YH,CODE
; 西文字符写入子程序如
_CW_PR: MOV O_XL,R7
MOV O_YL,R5
MOV O_YH,R4
MOV CODEE,R3
MOV COUNT1,#00H ; 计数器=0
MOV DPTR,#CHTAB ; 设置西文字库指针
MOV A,CODEE ; 取字符代码
MOV B,#08H ; 计算字符字模的首地址
MUL AB ; 建立字模指针
ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A
MOV A,O_XL
RL A ; X*2(change the acc to a)
MOV O_XL,A
MOV A,O_YL ; 坐标值转换地址值计算
MOV B,#PARA1 ; 显示域宽度
MUL AB
ADD A,O_XL
MOV O_XL,A
MOV A,B
ADDC A,#00H
MOV O_YL,A
MOV A,O_YH
MOV B,#PARA1
MUL AB
ADD A,O_YL
MOV O_YL,A ; 地址存入O_XL,O_YL和O_YH
CLR A
ADDC A,#00H
MOV O_YH,A
CW_PR1: MOV A,O_YH
MOV C,ACC.0 ; 取A16值
CLR A
MOV ACC.2,C
MOV COM,A
ORL COM,#08H ; 设置显示RAM 单元地址
LCALL PR1
MOV DAT1,O_XL
LCALL PR2
INC COM
LCALL PR1
MOV DAT1,O_YL
LCALL PR2
INC COM ; 设置写入显示数据指令
LCALL PR1
MOV A,COUNT1 ; 取间址
MOVC A,@A+DPTR ; 取字模数据
; MOV R7,A ;;;;;;;;;;;;
;MOV R6,#48H ;;;;;;;;;;;;;;;
LCALL _GRAY ; 调灰度生成子程序
MOV A,O_XL ; 修正地址值
ADD A,#PARA1
MOV O_XL,A
MOV A,O_YL
ADDC A,#00H
MOV O_YL,A
MOV A,O_YH
ADDC A,#00H
MOV O_YH,A
INC COUNT1 ; 计数器加一
MOV A,COUNT1
CJNE A,#08H,CW_PR1 ; 循环
RET
;;this place i want to write 16*8 english charactors to display on the screen
;;I WANT IT TO WORKS ,LET us TEST IT!他的这个16*8是靠8*8拉长形成的.
_CW_PRR: MOV O_XL,R7
MOV O_YL,R5
MOV O_YH,R4
MOV CODEE,R3
MOV COUNT1,#00H ; 计数器=0
MOV DPTR,#CHTAB ; 设置西文字库指针
MOV A,CODEE ; 取字符代码
MOV B,#08H ; 计算字符字模的首地址
MUL AB ; 建立字模指针
ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A
MOV A,O_XL
RL A ; X*2(change the acc to a)
MOV O_XL,A
MOV A,O_YL ; 坐标值转换地址值计算
MOV B,#PARA1 ; 显示域宽度
MUL AB
ADD A,O_XL
MOV O_XL,A
MOV A,B
ADDC A,#00H
MOV O_YL,A
MOV A,O_YH
MOV B,#PARA1
MUL AB
ADD A,O_YL
MOV O_YL,A ; 地址存入O_XL,O_YL和O_YH
CLR A
ADDC A,#00H
MOV O_YH,A
PP:MOV R0,#00H
CW_PR51: MOV A,O_YH
MOV C,ACC.0 ; 取A16值
CLR A
MOV ACC.2,C
MOV COM,A
ORL COM,#08H ; 设置显示RAM 单元地址
LCALL PR1
MOV DAT1,O_XL
LCALL PR2
INC COM
LCALL PR1
MOV DAT1,O_YL
LCALL PR2
INC COM ; 设置写入显示数据指令
LCALL PR1
MOV A,COUNT1 ; 取间址
MOVC A,@A+DPTR ; 取字模数据
LCALL _GRAY ; 调灰度生成子程?
INC R0
MOV A,O_XL ; 修正地址值
ADD A,#PARA1
MOV O_XL,A
MOV A,O_YL
ADDC A,#00H
MOV O_YL,A
MOV A,O_YH
ADDC A,#00H
MOV O_YH,A
MOV A,R0
MOV B,#02H
DIV AB
MOV A,B
JNZ CW_PR51
INC COUNT1
;IF COUNT/2!=0; LCALL CW_PR51
; ELSE UNDER
MOV A,COUNT1
CJNE A,#08H,CW_PR51 ; 循环
RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;this place i want to wipe the 16*8 english charactors on the screen
_CLCW_PRR: MOV O_XL,R7
MOV O_YL,R5
MOV O_YH,R4
;MOV CODEE,R3
MOV COUNT1,#00H ; 计数器=0
MOV DPTR,#CHTAB ; 设置西文字库指针
MOV A,CODEE ; 取字符代码
MOV B,#08H ; 计算字符字模的首地址
MUL AB ; 建立字模指针
ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A
MOV A,O_XL
RL A ; X*2(change the acc to a)
MOV O_XL,A
MOV A,O_YL ; 坐标值转换地址值计算
MOV B,#PARA1 ; 显示域宽度
MUL AB
ADD A,O_XL
MOV O_XL,A
MOV A,B
ADDC A,#00H
MOV O_YL,A
MOV A,O_YH
MOV B,#PARA1
MUL AB
ADD A,O_YL
MOV O_YL,A ; 地址存入O_XL,O_YL和O_YH
CLR A
ADDC A,#00H
MOV O_YH,A
cPP:MOV R0,#00H
C_PR51: MOV A,O_YH
MOV C,ACC.0 ; 取A16值
CLR A
MOV ACC.2,C
MOV COM,A
ORL COM,#08H ; 设置显示RAM 单元地址
LCALL PR1
MOV DAT1,O_XL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -