📄 subprogram.asm
字号:
MOVX 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
MOV A,COUNT1
ADD A,#06H
MOV COUNT1,A
INC DPTR
; MOV A,COUNT1
CJNE A,#0F0H,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
MOVX A,@DPTR /*左边的字模*/
; MOV R7,A ;;;;;;;;;;;;
; MOV R6,#48H ;;;;;;;;;;;;;;;
LCALL _GRAY ; 调灰度生成子程序
INC DPTR
MOVX A,@DPTR /*中间的字模*/
; MOV R7,A ;;;;;;;;;;;;
; MOV R6,#48H ;;;;;;;;;;;;;;;
LCALL _GRAY ; 调灰度生成子程序
INC DPTR
MOVX 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 ; 计数器加一
INC COUNT1
INC COUNT1
INC DPTR
MOV A,COUNT1
CJNE A,#48H,CC24PR1; 循环
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 西文字符写入子程序C816_PR childprogram (3)
; 占用内部资源:O_XL,O_YL,O_YH,CODE,COUNT1,A,B,DPTR
; 内部调用子程序:PR1,PR2,GRAY
; 程序参数: PARA1
; 连接字库: CHTAB816
; 程序调用入口: CW_PR
; 程序输入变量: O_XL,O_YL,O_YH,CODE
; 我们得到的是8*16的字符
; 西文字符写入子程序如
_C816_PR: MOV O_XL,R7
MOV O_YL,R5
MOV O_YH,R4
MOV CODEE,R3
MOV COUNT1,#00H ; 计数器=0
MOV DPTR,#CHTAB816 ; 设置西文字库指针
MOV A,CODEE ; 取字符代码
MOV B,#10H ; 计算字符字模的首地址
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
C816_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
MOVX 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 ; 计数器加一
INC DPTR
MOV A,COUNT1
CJNE A,#10H,C816_PR1 ; 循环
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 西文写入子程序(16*16点阵字库)C1616_PR childprogra (5)m
; 占用内部资源:O_XL,O_YL,O_YH,CODE,COUNT1,A,B,DPTR
; 内部调用子程序:PR1,PR2,GRAY
; 连接字库: CCTAB
; 程序参数: PARA1
; 程序调用入口: CCW_PR
;
; 程序输入变量: O_XL,O_YL,O_YH,CODE ,之所以O_XL只用一个字节是因为横向是以字节为单位的640*480横向也就是60个字节
; 汉字写入子程序如下: 基本的过程就是首先计算地址而后取字模的数据
_C1616_PR:MOV A,R7 ;注意参数的传递的顺序奇数是低字节,而偶数是高字节
MOV O_XL,A
MOV A,R5
MOV O_YL,A
MOV A,R4
MOV O_YH,A
MOV A,R3
MOV CODEE,A
MOV COUNT1,#00H ; 计数器=0
MOV DPTR,#CHTAB1616 ; 设置汉字字库指针
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
C1616_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
MOVX A,@DPTR ; 取左半部字模数
;MOV R7,A ; ;;;;;;;;;;;
;MOV R6,#48H ;;;;;;;;;;;;;;;
LCALL _GRAY ; 调灰度生成子程序
INC COUNT1
INC DPTR
MOVX 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 ; 计数器加一
INC DPTR
MOV A,COUNT1
CJNE A,#20H,C1616_PR1; 循环
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 西文写入子程序(16*16点阵字库)_C1632_PR childprogra (5)m
; 占用内部资源:O_XL,O_YL,O_YH,CODE,COUNT1,A,B,DPTR
; 内部调用子程序:PR1,PR2,GRAY
; 连接字库: CCTAB
; 程序参数: PARA1 不断的修改子程序达到我们所期望的要求
; 程序调用入口: CCW_PR
; 16*32的效果,是通过拉伸来实现的
; 程序输入变量: O_XL,O_YL,O_YH,CODE ,之所以O_XL只用一个字节是因为横向是以字节为单位的640*480横向也就是60个字节
; 汉字写入子程序如下: 基本的过程就是首先计算地址而后取字模的数据
_C1632_PR:MOV A,R7 ;注意参数的传递的顺序奇数是低字节,而偶数是高字节
MOV O_XL,A
MOV A,R5
MOV O_YL,A
MOV A,R4
MOV O_YH,A
MOV A,R3
MOV CODEE,A
MOV COUNT1,#00H ; 计数器=0
MOV DPTR,#CHTAB1616 ; 设置汉字字库指针
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
C1632_PR0:
MOV R0,#00H
C1632_PR1:
PUSH DPL ;首先将地址入栈
PUSH DPH
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
MOVX A,@DPTR ; 取左半部字模数
;MOV R7,A ; ;;;;;;;;;;;
;MOV R6,#48H ;;;;;;;;;;;;;;;
LCALL _GRAY ; 调灰度生成子程序
INC DPTR
MOVX 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 R0
POP DPH ;将进入循环之前保存的地址再次弹出
POP DPL
CJNE R0,#02H,C1632_PR1
INC COUNT1 ; 计数器加一
INC DPTR
INC DPTR
MOV A,COUNT1
CJNE A,#10H,C1632_PR0; 循环
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,#CHTAB1616 ; 设置西文字库指针
MOV A,CODEE ; 取字符代码
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -