📄 driver_pvg190602.asm
字号:
; DPTR. 读ASCLL点阵表指针
; 出口参数:
; EndAdr. 绘图结束地址,作为画下一图形的起始地址,连续显示时需要,当发生截断时不可用
; DPTR. 读表结束的指针,作为写下一页的起始指针,连续显示时需要
; Databuf. 返回写入液晶的字节数ByteCount
; NextPageFlag.自动换行标志,高电平有效
; CutoffFlag.截断显示标志,高电平有效
; 占用资源:
; A,B,C,DPTR,ByteCount,Address,Chip,PageN,EndAdr,Databuf,SelectFlag.
S6B0108_WriteSpan8_:
MOV Databuf,ByteCount; 保存写入液晶的字节数
MOV B,#40H;
MOV A,Address; 显示起始地址(0-149点)相对液晶屏
DIV AB; 将地址分割为(片*50)列+显示起始地址
MOV Chip,A; 显示起始片地址(0-2)
MOV Address,B; 显示起始地址(0-49)
MOV A,ByteCount;
ADD A,Address;
MOV EndAdr,A; 显示结束地址(未包含片地址的信息,因此实际结束地址是Chip*50+EndAdr)
CLR C;
SUBB A,#40H; 减去50,判断是否跨片显示
JZ Write_8_; EndAdr大于等于50无跨片,跳转
JC Write_8_;
MOV A,#40H; 跨片处理
SUBB A,Address;
MOV ByteCount,A; 跨片前写入液晶的字节数
CALL S6B0108_SetAddress;
CALL S6B0108_Write;
MOV A,EndAdr;
CLR C;
SUBB A,#40H;
MOV ByteCount,A; 剩余的字节数
INC Chip;
MOV Address,#00H;
CALL S6B0108_SetAddress; 设定跨片后的地址
CALL S6B0108_Write;
DEC Chip;
SJMP LastAddress_8;
Write_8_:
CALL S6B0108_SetAddress; 无跨片模式
CALL S6B0108_Write;
LastAddress_8:
MOV B,#40H; 计算显示结束地址
MOV A,Chip;
MUL AB;
ADD A,EndAdr;
MOV EndAdr,A; 返回显示结束地址,可作为画下一图形的起始地址
RET
; *******************************************************
; *ASCLL码值转为该值在ASCLL点阵8*6中的起始指针转换子程序*
; *******************************************************
; 功能:
; 将字符的ASCLL码转换为该字符在ASCLL点阵表中数据的起始地址
; 入口参数:
; Databuf. 字符的ASCLL码值
; 出口参数:
; DPTR. 字符在ASCLL点阵表中的首地址
; 占用资源:
; A,B,C,DPTR,Databuf.
S6B0108_ASCLL_2_ASCLL6_8:
MOV A,Databuf; 读入字符在ASCLL码表中的值
MOV DPTR,#Table_ASCLL6_8; 读ASCLL点阵表的首地址
CLR C;
SUBB A,#20H; 减去32,得到字符在ASCLL点阵表中的值
MOV B,#06H
MUL AB;
ADD A,DPL;
MOV DPL,A;
MOV A,B;
ADDC A,DPH;
MOV DPH,A; 加上偏移地址,得到字符在ASCLL点阵表中的首地址
RET
; ************************************************
; *处理双重查表显示ASCLL点阵表8*6字符(串)子程序*
; ************************************************
; 功能:
; 循环显示字符串表中的字符串
; 入口参数:
; PageN. 显示的页地址(0-3)
; Address. 显示起始地址(0-149)
; DPTR. 要显示的字符串表的首地址
; 出口参数:
; Address.显示结束地址,可作为画下一图形的起始地址
; 占用资源:
; A,B,C,DPTR,ByteCount,Address,Chip,PageN,EndAdr,Databuf,DPLbuf,DPHbuf,SelectFlag.
S6B0108_WriStr6_8:
; MOV PageN,#00H; 显示页的地址(0-3)
; MOV Address,#00H; 显示地址0-149
MOV ByteCount,#06H;
; MOV DPTR,#Table_Str; 读字符串表的首地址,若要显示其他字符串表,屏蔽这一句
MOV DPLbuf,DPL;
MOV DPHbuf,DPH; 保存字符串表地址指针
LoopWrite6_8:
CLR A;
MOVC A,@A+DPTR; 读表,取得字符在ASCLL码表的值
MOV Databuf,A;
JZ CharEND6_8; 判断将要显示的字符是不是结束标志/0(/0的ASCLL码是00)
CALL S6B0108_ASCLL_2_ASCLL6_8; 字符ASCLL码值的转换为对应的ASCLL点阵表中的首地址
CALL S6B0108_WriteSpan8_; 调用绘图子程序
MOV A,Databuf;
MOV ByteCount,A; 从Databuf中载入液晶的字节数
MOV Address,EndAdr; 绘图结束地址存入Address,作为画下一图形的起始地址
MOV DPL,DPLbuf;
MOV DPH,DPHbuf; 读入字符串表地址指针
INC DPTR; 指针加1,以便读下一字符
MOV DPLbuf,DPL;
MOV DPHbuf,DPH; 保存字符串表地址指针
SJMP LoopWrite6_8;
CharEND6_8:
CLR SelectFlag;
RET
; ************************************
; *ASCLL码表与ASCLL点阵8*16转换子程序*
; ************************************
; 功能:
; 将字符的ASCLL码转换为该字符在ASCLL点阵表中数据的起始地址
; 入口参数:
; Databuf. 字符的ASCLL码值
; 出口参数:
; DPTR. 字符在ASCLL点阵表中的首地址
; 占用资源:
; A,C,DPTR,Databuf
S6B0108_ASCLL_2_ASCLL8_16:
MOV A,Databuf; 读入字符在ASCLL码表中的值
MOV DPTR,#Table_ASCLL8_16; 读ASCLL点阵表的首地址
CLR C;
SUBB A,#20H; 减去32,得到字符在ASCLL点阵表中的值
MOV Databuf,A;
SWAP A;
ANL A,#0F0H; 乘16,算出字符的地址在ASCLL点阵中的偏移量
ADD A,DPL;
MOV DPL,A;
MOV A,Databuf;
SWAP A;
ANL A,#0FH;
ADDC A,DPH;
MOV DPH,A; 加上偏移地址,得到字符在ASCLL点阵表的地址
RET
; *************************************************
; *处理双重查表显示ASCLL点阵表8*16字符(串)子程序*
; *************************************************
; 功能:
; 循环显示字符串表中的字符(串),调用了S6B0108_ASCLL_2_ASCLL8_16,S6B0108_WriteSpan8_
; 入口参数:
; CutoffFlag.截断显示标志
; NextPageFlag.自动换行标志
; Address.显示地址(0-149)
; PageN. 显示页的地址(0-2)
; DPTR. 要显示的字符串表的首地址
; 出口参数:
; Address.显示结束地址,可作为画下一图形的起始地址
; 占用资源:
; A,B,C,DPTR,ByteCount,Address,Chip,PageN,EndAdr,Databuf,DPLbuf,DPHbuf,SelectFlag.
S6B0108_WriStr8_16:
; MOV PageN,#00H; 显示页的地址(0-2)
; MOV Address,#00H; 显示地址(0-149)
MOV ByteCount,#08H;
; MOV DPTR,#Table_Str; 读字符串表的首地址,若要显示其他字符串表,屏蔽这一句
MOV DPLbuf,DPL;
MOV DPHbuf,DPH; 保存字符串表地址指针
LoopWrite8_16:
CLR A;
MOVC A,@A+DPTR; 字符串读表,取得字符在ASCLL码表的值
MOV Databuf,A;
JZ CharEND8_16; 判断将要显示的字符是不是结束标志/0(/0的ASCLL码是00)
CALL S6B0108_ASCLL_2_ASCLL8_16; ASCLL码值和指针值转换
CALL S6B0108_WriteSpan8_; 调用绘图子程序
INC PageN; 下一页
MOV ByteCount,Databuf; 从Databuf中载入液晶的字节数
CLR C;
MOV A,EndAdr;
SUBB A,ByteCount; 计算显示起始地址
MOV Address,A;
CALL S6B0108_WriteSpan8_; 8*16象素,接着画下一页
MOV Address,EndAdr; 绘图结束地址存入Address,可作为画下一图形的起始地址
MOV ByteCount,Databuf; 从Databuf中载入液晶的字节数
DEC PageN; 返回上一页
MOV DPL,DPLbuf;
MOV DPH,DPHbuf; 读入字符串表地址指针
INC DPTR; 指针加1,以便读下一字符
MOV DPLbuf,DPL;
MOV DPHbuf,DPH; 保存字符串表地址指针
SJMP LoopWrite8_16;
CharEND8_16:
CLR SelectFlag;
RET
; ******************************
; *显示单个ASCLL码字符8*6子程序*
; ******************************
; 功能:
; 根据ASCLL码值,显示对应的字符
; 入口参数:
; A. 字符的ASCLL码值
; Address.显示地址(0-149)
; PageN. 显示页的地址(0-3)
; 出口参数:
; Address.显示结束地址,可作为画下一图形的起始地址
; 占用资源:
; A,B,C,DPTR,ByteCount,Address,Chip,PageN,EndAdr,Databuf.
S6B0108_WriSigalASCLL6_8:
; MOV PageN,#00H; 显示页的地址(0-3)
; MOV Address,#00H; 显示地址0-149
MOV ByteCount,#06H;
MOV Databuf,A;
CALL S6B0108_ASCLL_2_ASCLL6_8; 字符ASCLL码值的转换为对应的ASCLL点阵表中的首地址
CALL S6B0108_WriteSpan8_; 调用绘图子程序
MOV ByteCount,Databuf; 从Databuf中载入液晶的字节数
MOV Address,EndAdr; 绘图结束地址存入Address,作为画下一图形的起始地址
CLR SelectFlag;
RET
; ******************************
; *显示单个ASCLL码字符8*16子程序*
; ******************************
; 功能:
; 根据ASCLL码值,显示对应的字符
; 入口参数:
; A. 字符的ASCLL码值
; Address.显示地址(0-149)
; PageN. 显示页的地址(0-2)
; 出口参数:
; Address.显示结束地址,可作为画下一图形的起始地址
; 占用资源:
; A,B,C,DPTR,ByteCount,Address,Chip,PageN,EndAdr,Databuf,DPLbuf,DPHbuf.
S6B0108_WriSigalASCLL8_16:
; MOV PageN,#00H; 显示页的地址(0-2)
; MOV Address,#00H; 显示地址(0-149)
MOV ByteCount,#08H;
MOV Databuf,A;
CALL S6B0108_ASCLL_2_ASCLL8_16; ASCLL码值和指针值转换
CALL S6B0108_WriteSpan8_; 调用绘图子程序
INC PageN; 下一页
MOV ByteCount,Databuf; 从Databuf中载入液晶的字节数
CLR C;
MOV A,EndAdr;
SUBB A,ByteCount; 计算显示起始地址
MOV Address,A;
CALL S6B0108_WriteSpan8_; 8*16象素,接着画下一页
MOV Address,EndAdr; 绘图结束地址存入Address,可作为画下一图形的起始地址
MOV ByteCount,Databuf; 从Databuf中载入液晶的字节数
DEC PageN; 返回上一页
CLR SelectFlag;
RET
; *********************
; *十六进制数字转ASCLL*
; *********************
; 功能:
; 从十六进制中分离出百位,十位,个位并作ASCLL码调整
; 人口参数:
; IntFlag. 数据类型声明
; A. 十六进制数范围(IntFlag=0):00H-OFFH
; (IntFlag=1):负数:80H-0FFH(-0~-127),正数:00H-7FH(+0~127)
; 出口参数:
; R7. 百位
; R6. 十位
; R5. 个位
; 占用资源:
; A,B,R5,R6,R7,IntFlag.
Hex_Num2ASCLL:
JNB IntFlag,Unsigned_INT;
/* CJNE A,#80H,Signed_INT; 18B20显示需要表示-0.xxxx,所以屏蔽这几句,这样80H表示-0.
MOV A,#80H;
SETB IntFlag;
JMP Pro_Int_DONE;
Signed_INT: */
JNB ACC.7,Unsigned_INT;
SETB IntFlag;
ANL A,#7FH;
JMP Pro_Int_DONE;
Unsigned_INT:
CLR IntFlag;
Pro_Int_DONE:
MOV B,#64H;
DIV AB;
ADD A,#30H;
MOV R7,A;
MOV A,B;
MOV B,#0AH;
DIV AB;
ADD A,#30H;
MOV R6,A;
MOV A,B;
ADD A,#30H;
MOV R5,A;
RET
; **********************
; *整型数据显示子子程序*
; **********************
; 功能:
; 无自动缩进功能(自动缩进要清屏),固定占用8*6*4的显示空间,正数或百位或十位为零自动消隐负号和百位、十位的零
; 显示整型数据,范围-127到127(IntFlag=1);80H表示-0.xxxx;0-255(IntFlag=0)
; 入口参数:
; Address.显示起始地址
; PageN.显示页地址
; IntFlag.数据类型
; A.被显示数(二进制,十六进制)
; 出口参数:
; 无
; 占用资源:
; A,B,C,R5,R6,R7,DPTR,Address,EndAdr,PageN,Chip,ByteCount,Databuf.
Display_INT_Number:
CALL Hex_Num2ASCLL; 数据转为ASCLL码的形式
MOV A,#20H;
JNB IntFlag,Hide_NegMark; 判断是否负号消隐
MOV A,#2DH;
Hide_NegMark:
CALL S6B0108_WriSigalASCLL6_8;
MOV A,R7;
CJNE A,#30H,SkipHide_Hundred;
CALL LastWordWri_zero; 百位等于零,消隐符号位
MOV A,#20H;
JNB IntFlag,SkipHide_Hundred; 判断是否负号消隐
MOV A,#2DH; 在百位的位置显示负号(负号右移)
SkipHide_Hundred:
CALL S6B0108_WriSigalASCLL6_8;
MOV A,R7;
CJNE A,#30H,SkipHide_Tens;
MOV A,R6; 百位为零
CJNE A,#30H,SkipHide_Tens;
CALL LastWordWri_zero; 十位为零,消隐位于百位的负号
MOV A,#20H; 消隐十位
JNB IntFlag,SkipHide_TensDONE;
MOV A,#2DH; 负号右移
JMP SkipHide_TensDONE;
SkipHide_Tens:
MOV A,R6;
SkipHide_TensDONE:
CALL S6B0108_WriSigalASCLL6_8;
MOV A,R5;
CALL S6B0108_WriSigalASCLL6_8;
CLR IntFlag;
RET
LastWordWri_zero:
CLR C;
MOV A,Address;
SUBB A,#06H;
MOV Address,A;
MOV A,#20H;
CALL S6B0108_WriSigalASCLL6_8;
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -