📄 subprogram.asm
字号:
;SUBPROGRAM FOR LCD DISPLAY
;ASM FILE FOR LCD DISPLAY
;;;;.asm
; 直接访问方式地址定义,根据用户平台接口修改
CWADD1 EQU 0D000H ; 写指令代码地址
DWADD1 EQU 0D001H ; 写参数及显示数据地址
DRADD1 EQU 0D001H ; 读参数及显示数据地址
; 间接控制方式信号定义,根据用户平台接口修改
;//RS EQU P3.0 ; RS
;//RD EQU P3.1 ; /RD
;//WR EQU P3.2 ; /WR
;//DATBUS EQU P1 ; 数据总线
; 程序参数定义,根据用户选择的LCM型号修改
PARA1 EQU 0A0H ; 显示区域宽度
; 程序变量定义,根据用户平台提供的内部资源修改
COM EQU 50H ; 指令寄存器
DAT1 EQU 51H ; 参数及显示数据寄存器
COUNT1 EQU 52H ; 计数器1
COUNT2 EQU 53H ; 计数器2
O_XL EQU 54H ; X坐标低8位寄存器(字节)
; X坐标低8位寄存器(点列)
O_XH EQU 55H ; X坐标高8位寄存器(点列)
; D7位为绘点(D7=1)和消点(D7=0)标志位
O_YL EQU 56H ; Y坐标寄存器低8位(点行)
O_YH EQU 57H ; Y坐标寄存器高8位(点行)
CODEE EQU 58H ; 字符代码
GRAYB EQU 59H
; 00H-暗;01H-淡;
; 10H-深;11H-亮
GRAYH EQU 5AH ; 灰度数据寄存器高字节
GRAYL EQU 5BH ; 灰度数据寄存器低?
EXTRN XDATA (CCTAB16,CCTAB24,CHTAB816,CHTAB1616)
EXTRN XDATA (CCTAB48)
PUBLIC GRAYB
PUBLIC CLEAR,_ONEBYTE_PR,_CLCW_PR,_CL_DOT
PUBLIC _W_DOT,_CH1616_PR,_CH4840_PR,_CC24PR,_C816_PR,_C1632_PR,_CLCW_PRR,_C1616_PR
mypro segment code
rseg mypro ; 允许编译器重新定位
; 汉字(24x24点阵)演示程序 callby
;DISCH24:MOV GRAYB,#4CH ;灰度值设置: 正向显示
; MOV O_XL,#0CH
; MOV O_YL,#20H
; MOV O_YH,#00H
; MOV CODEE,#00H
; LCALL _CC24PR
;;; MOV GRAYB,#0C4H ;灰度值设置: 负向显示
; MOV O_XL,#15H
; MOV O_YL,#38H
; MOV O_YH,#01H
; MOV CODEE,#01H
; LCALL _CC24PR
; SJMP $
; 绘图演示程序段 callby
;DRAW: MOV GRAYB,#0C0H ;有灰度的显示将把所有显示都分成相应的灰度等级
; MOV R2,#00H
; MOV R3,#00H
; MOV R4,#00H
; MOV R5,#00H
; LOOP1: MOV O_XL,R2
; MOV O_XH,R3
; MOV O_YL,R4
; MOV O_YH,R5
; LCALL _W_DOT
; MOV A,R2
; MOV R2,A
; MOV A,R3
; ADDC A,#00H
; MOV R3,A
; MOV A,R4
; ADD A,#01H
; MOV R4,A
; MOV A,R5
; ADDC A,#00H
; MOV R5,A
; CJNE A,#01H,LOOP1
; SJMP $
;----------------------------------callby----------------
;WIPE: MOV GRAYB,#00H
; MOV R2,#00H
; MOV R3,#80H
; MOV R4,#00H
; MOV R5,#00H
; LOOP2: MOV O_XL,R2
; MOV O_XH,R3
; MOV O_YL,R4
; MOV O_YH,R5
; LCALL _W_DOT
; MOV A,R2
; ADD A,#01H
; MOV R2,A
; MOV A,R3
; ADDC A,#00H
; MOV R3,A
; MOV A,R4
; ADD A,#01H
; MOV R4,A
; MOV A,R5
; ADDC A,#00H
; MOV R5,A
; CJNE A,#01H,LOOP2
; SJMP $
;;;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
; 直接访问方式的驱动子程序
; 程序口地址设置CWADD1,DWADD1,DRADD1
; 占用内部资源DAT1,A,COM
; 程序输入变量: DAT1,,COM
;===============直接访问方式驱动子程序==================
; 写指令子程序 ////childprogram(7)
PR1: PUSH DPL
PUSH DPH
MOV DPTR,#CWADD1
MOV A,COM
MOVX @DPTR,A
POP DPH
POP DPL
RET
; 写数据子程序 childprogram(8)
PR2: PUSH DPL
PUSH DPH
MOV DPTR,#DWADD1
MOV A,DAT1
MOVX @DPTR,A
POP DPH
POP DPL
RET
; 读数据子程序 childprogram(9)
PR3: PUSH DPL
PUSH DPH
MOV DPTR,#DRADD1
MOVX A,@DPTR
MOV DAT1,A
POP DPH
POP DPL
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 灰度生成子程序(字节)GRAYt m childprogram//(6)//
; 占用内部资源:GRAYB,GRAYH,GRAYL,COUNT2,A
; 内部调用子程序:PR2
; 程序调用入口: GRAY
; 程序输入变量:GRAYB
; 灰度生成子程序(字节)如下:
_GRAY: ; MOV GRAYB,R7 ;用两个字节来描述一个字节的内容这一个字节的数据,1代表前景数据,0代表背景数据,但是
;MOV A,R6 ;前景数据是分等级的我们一定要注意这一点,这里似乎又是堆栈内存空间的不足造成了这样
;MOV GRAYB,#0CH ;的无法预知的错误
MOV GRAYH,#00H ; 灰度寄存器清零
MOV GRAYL,#00H
MOV COUNT2,#08H
GRAY1: RLC A ; 取数据位
PUSH ACC ; 存数据
MOV A,GRAYB ; 取灰度寄存器,首先得到前景和后景的灰度的等级.
JC GRAY3 ; 判数据位是否为"0" ,这一个跳转上选择显示前景还是显示后景
MOV C,ACC.3 ; 为"1" 取前景灰度数据
XCH A,GRAYL ; 生成灰度数据,前景和背景形成反差和0,1形成反差是一样的道理
RLC A
XCH A,GRAYL ;GRAYH<-GRAY_L 也就是说两个变量全部加入移位的过程,C位的隐含的使用
XCH A,GRAYH
RLC A
XCH A,GRAYH
MOV C,ACC.2 ; 取前景灰度数据
XCH A,GRAYL
RLC A
XCH A,GRAYL
XCH A,GRAYH
RLC A
XCH A,GRAYH
GRAY2: POP ACC ; 取数据
DJNZ COUNT2,GRAY1 ; 计数器计数
MOV DAT1,GRAYH ; 数据写入显示RAM
LCALL PR2
MOV DAT1,GRAYL ; 已经设好地址而后才写入数据.
LCALL PR2
RET
GRAY3: MOV C,ACC.7 ; 为"0"取背景灰度数据
XCH A,GRAYL ; 生成灰度数据
RLC A
XCH A,GRAYL
XCH A,GRAYH
RLC A
XCH A,GRAYH
MOV C,ACC.6 ; 取背景灰度数据
XCH A,GRAYL
RLC A
XCH A,GRAYL
XCH A,GRAYH
RLC A
XCH A,GRAYH
LJMP GRAY2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 汉字写入子程16*16点阵字库)CCW_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个字节
; 汉字写入子程序如下: 基本的过程就是首先计算地址而后取字模的数据
_CH1616_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,#CCTAB16 ; 设置汉字字库指针
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
CH1616_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 /*左边的字模*/
LCALL _GRAY ; 调灰度生成子程序
INC DPTR
MOVX A,@DPTR /*右边的字模*/
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,#02H
MOV COUNT1,A
INC DPTR
; MOV A,COUNT1
CJNE A,#20H,CH1616_PR1; 循环
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 汉字写入子程48*40点阵字库)CCW_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个字节
; 汉字写入子程序如下: 基本的过程就是首先计算地址而后取字模的数据
_CH4840_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,#CCTAB48 ; 设置汉字字库指针
MOV A,CODEE ; 取汉字代码
MOV B,#0F0H ; 计算字模首地址
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
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 ; 调灰度生成子程序
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -