📄 subprogram.asm
字号:
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
LCALL PR2
INC COM
LCALL PR1
MOV DAT1,O_YL
LCALL PR2
INC COM ;设置写入显示数据指令
LCALL PR1
MOV A,#00H ;因为有灰度等级所以稍显麻烦一些.
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 C_PR51
INC COUNT1
;IF COUNT/2!=0; LCALL CW_PR51
; ELSE UNDER
MOV A,COUNT1
CJNE A,#08H,C_PR51 ; 循环
RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 绘点子程序W_DOT childprogram (2) JINBEN 基本的思路都是由行列的抽象地址取得绝对
; 占用内部寄存器:O_XL,O_XH,O_YL,O_YH,A,B 地址
; 内部调用子程序:PR1,PR2,PR3
; 程序调用入口: W_DOT
; 程序参数:PARA1
; 程序输入变量: O_XL,O_XH,O_YL,O_YH 只有在点列中我们才会使用O_XH
;xh=r6,xl=r7,yl=r4,yh=r5;
_W_DOT: MOV O_XL,R7
MOV O_XH,R6
MOV O_YL,R5
MOV O_YH,R4
MOV A,O_XH ; XY坐标值转换成地址值
MOV B,#40H ; 256点占字节数(灰度)
MUL AB ; 由于LCD屏幕宽度的限制所以乘积的结果中B的值为零
MOV O_XH,A ; 低8位地址存O_XH
MOV B,#PARA1 ; 显示域宽度值
MOV A,O_YL ;
MUL AB
ADD A,O_XH
MOV O_XH,A
MOV A,B
ADDC A,#00H
MOV O_YL,A ; 高8位地址存O_YL
MOV A,O_YH
CLR ACC.7
MOV B,#PARA1
MUL AB
ADD A,O_YL ;
MOV O_YL,A
MOV A,B
ADDC A,#00H
MOV O_YH,A ; A16存O_YH,我们当前的应用中只有A16是有数值的
MOV A,O_XL
MOV B,#08H
DIV AB
MOV O_XL,B
MOV B,#02H ; 8位绘点数据占二个字节
MUL AB ; A中的数据就是商即整数个字节数
ADD A,O_XH
MOV O_XH,A ; 地址值暂存DISADDL和DISADDH
MOV A,O_YL
ADDC A,#00H
MOV O_YL,A
MOV A,O_YH
ADDC A,#00H
MOV O_YH,A
MOV B,O_XL ; 计算点位置值
INC B
CLR A
SETB C
W_DOT1: RRC A ; 从这里开始RESEARCH
DJNZ B,W_DOT1 ; C==0
MOV B,A ; 点位置数据暂存B
MOV A,O_YH
MOV C,ACC.0
CLR A
MOV ACC.2,C
ORL A,#08H ; 设置显示单元地址
MOV COM,A
LCALL PR1
MOV DAT1,O_XH
LCALL PR2
INC COM
LCALL PR1
MOV DAT1,O_YL
LCALL PR2
INC COM ;一个前导的读写指令可以后跟无数的读写操作.
LCALL PR1
MOV COUNT1,#02H
W_DOT2: LCALL PR3
MOV A,B ; 将点数据位再次取出
MOV COUNT2,#04H
W_DOT3: RLC A ; 取数据位C==0 ,其他位包括C都为零,只有相应的数据位为零
JC W_DOT5
XCH A,DAT1
RL A
RL A
XCH A,DAT1
W_DOT4: DJNZ COUNT2,W_DOT3
MOV B,A ;再次保存点数据位
LCALL PR2 ;由于写操作地址自动修正到下一个字节
DJNZ COUNT1,W_DOT2
RET
W_DOT5: XCH A,GRAYB
MOV C,ACC.7 ;取得背景数据值
XCH A,DAT1
RLC A
XCH A,DAT1
MOV C,ACC.6
XCH A,DAT1
RLC A
XCH A,DAT1
XCH A,GRAYB
LJMP W_DOT4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 清显示RAM 区(清屏)子程序CLEAR childprogram//(1)//
; 占用内部寄存器:COM,DAT1,A,R3,R4
; 内部调用子程序:PR1,PR2,GRAY
; 程序输入变量:无
; 程序调用入口:CLEAR
;---------------------------------------------
CLEAR: MOV R3,#00H ; 循环量
MOV R4,#0A0H
MOV COM,#00H ; 低位地址设置
LCALL PR1
MOV DAT1,#00H
LCALL PR2
MOV COM,#01H ; 高位地址设置
LCALL PR1
MOV DAT1,#00H
LCALL PR2
MOV COM,#0AH ; 选择数据通道
LCALL PR1
MOV A,GRAYB
SWAP A
ANL A,#0C0H
MOV DAT1,A
RR A
RR A
ORL A,DAT1
MOV DAT1,A
SWAP A
ORL A,DAT1
MOV DAT1,A ;一个字节全部变成统一的前景
CLR1: LCALL PR2 ; 写数据“0”
LCALL PR2 ;写入连续的两个地址
DJNZ R3,CLR1
DJNZ R4,CLR1
RET
;///////////////////////////////////////////////////////////////////////
;/// 以下是擦点的子程序
;;
;;
;;
;;//////////////////////////////////////////////////////////////////////
_CL_DOT: MOV O_XL,R7
MOV O_XH,R6
MOV O_YL,R5
MOV O_YH,R4
MOV A,O_XH ; XY坐标值转换成地址值
MOV B,#40H ; 256点占字节数(灰度)
MUL AB
MOV O_XH,A ; 低8位地址存O_XH
MOV B,#PARA1 ; 显示域宽度值
MOV A,O_YL ;
MUL AB
ADD A,O_XH
MOV O_XH,A
MOV A,B
ADDC A,#00H
MOV O_YL,A ; 高8位地址存O_YL
MOV A,O_YH
CLR ACC.7
MOV B,#PARA1
MUL AB
ADD A,O_YL ;
MOV O_YL,A
MOV A,B
ADDC A,#00H
MOV O_YH,A ; A16存O_YH
MOV A,O_XL
MOV B,#08H
DIV AB
MOV O_XL,B ;保存余数
MOV B,#02H ; 8位绘点数据占二个字节
MUL AB
ADD A,O_XH
MOV O_XH,A ; 地址值暂存DISADDL和DISADDH
MOV A,O_YL
ADDC A,#00H
MOV O_YL,A
MOV A,O_YH
ADDC A,#00H
MOV O_YH,A
MOV B,O_XL ; 计算点位置值
INC B
CLR A
SETB C
WW_DOT1: RRC A
DJNZ B,WW_DOT1
MOV B,A ; 点位置数据暂存B
MOV A,O_YH
MOV C,ACC.0
CLR A
MOV ACC.2,C
ORL A,#08H ; 设置显示单元地址
MOV COM,A
LCALL PR1
MOV DAT1,O_XH
LCALL PR2
INC COM
LCALL PR1
MOV DAT1,O_YL
LCALL PR2
INC COM
LCALL PR1
MOV COUNT1,#02H
WW_DOT2:LCALL PR3
MOV A,B
MOV COUNT2,#04H
WW_DOT3: RLC A ; 取数据位
JC WW_DOT5
XCH A,DAT1
RL A
RL A
XCH A,DAT1
WW_DOT4: DJNZ COUNT2,WW_DOT3
MOV B,A
LCALL PR2
DJNZ COUNT1,WW_DOT2
RET
WW_DOT5:XCH A,GRAYB
MOV C,ACC.3 ;取得前景数据而不是简单的清零
XCH A,DAT1
RLC A
XCH A,DAT1
MOV C,ACC.2
XCH A,DAT1
RLC A
XCH A,DAT1
XCH A,GRAYB
LJMP WW_DOT4
RET
;;THE BLOW IS CHANGED BY 11/9
_ONEBYTE_PR: MOV O_XL,R7
MOV O_XH,R6
MOV O_YL,R5
MOV O_YH,R4
MOV COUNT1,R3
MOV A,O_XL
RL A ; X*2
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_PR21: 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 ; 取字模数据/////ATENTION PLEAS THREE PARAMETES USE R3 THE LOW BYTE R2,THE HIGH BYTE
LCALL _GRAY ; 调灰度生成子程序(IN THE PROGRAM ,CALL TWICE WRITEDATA COMMAND SEEMS LIKE PR1)
RET
_CLCW_PR: MOV O_XL,R7
MOV O_XH,R6
MOV O_YL,R5
MOV O_YH,R4
MOV COUNT1,#00H ; 计数器=0
MOV A,O_XL
RL A ; X*2
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_PR12: 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,#00H
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_PR12 ; 循环
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -