📄 lcd.asm
字号:
// R1 = [y]
// R1 = R1 LSR 3 //得到写入页值
// R1 += 1 //页值需加1(写第二页)
// R2 = [x] //得到写入列值
// R3 = R_TempBuffer
// R4 = 8 //写入长度为10个字节
// CALL __LcdPageWriteWord //调用页写入程序
//?_Lcd_Str8_Next: //一个字符完成后的处理
// R1 = [x] //取写入前列值
// R1 += 8 //变换到下一个写入位置
// [x] = R1
//?_Lcd_Str8_Inc:
// R1 = [Length] //写入字符串长度加1
// R1 += 1
// [Length] = R1
// CMP R1,[R_LcdLength]
// JE ?_Lcd_Str8_Exit
// GOTO ?_Lcd_Str8_Loop //找下一个字符
//?_Lcd_Str8_Exit:
// POP R1,R5 FROM [SP]
// RETF
//----------------------------------------------------------//
//名称:F_Lcd_String12x12
//功能:LCD文字显示,需自动判断换行、文字结束,无效编码直接以空格代替
//入口:起始坐标R_LcdStartDot(y,x),字符指针R_LcdStringPtr,
// 字符内码长度R_LcdLength(字数,全角和半角都占一个字),写入模式R_LcdStatus
//重要寄存器:R1:字符指针,请注意,用它来读取内码,所以一定要保护好,否则显示出错
//局部变量: 全部在显示局部变量的72个字节中申请
// length:长度,用于标识进行显示的是第几个字
// x:显示列值
// y:显示行值,这两个用于确认显示地址
// K:写入字符的首页的页内偏移量,用于确认字符的起始行
// mask:屏蔽码,用于标识写入字节的有效位
// maskcode:对应不同的屏蔽码,根据K值得到相应的屏蔽码(8个字长度)
// LcdBuffer:用于存储从字库中读取到的数据(16个字长度)
// R_TempBuffer:显示数据转换后得到的显示缓冲区,用于一页内的连续显示(10个字长度)
//出口:无
//影响寄存器:无
//----------------------------------------------------------//
.public F_Lcd_String12x12
F_Lcd_String12x12:
PUSH R1,R5 TO [SP]
R1 = [R_LcdLength]
JNZ ?_Lcd_Str6_CalAddr
GOTO ?_Lcd_Str6_Exit
?_Lcd_Str6_CalAddr:
R1 = 0
[Length] = R1 //已显示字符数清0
CALL F_B_LcdCalxy
CALL _CAL_maskcode //初始化maskcode值 8word
?_Lcd_Str6_Loop:
R1 = [R_LcdStringPtr] //读取第N个要写入的字符
R1 = R1 + [Length]
R1 = [R1] //得到内码
R2 = 6
CALL _CalFontCode //调用内码判断程序
R1 = LcdBuffer //读取字库数据的保存指针
R2 = R5 //12x6半角字符,占用6个字
CALL __GetRomData //R3R4是段地址和偏移量,调用读字库程序
R2 = R5 //列宽为R5
R3 = 12 //行宽为12(隔一行为13)
CALL _Judgexy //判断xy宽,用于自动换行
CMP R1,C_False
JNE ?_Lcd_Str6_Show
GOTO ?_Lcd_Str6_Exit //xy超界退出
?_Lcd_Str6_Show:
R1 = [y]
R1 = R1 & 0x07 //得到行值页内偏移量
[k] = R1
CMP R1,C_Null //k=0转移
JNE ?_Lcd_Str6_Clip
R1 = 0xff //起始为整页的处理
[mask] = R1
R1 = [y]
R1 = R1 LSR 3 //得到写入页值
R2 = [x] //得到写入列值
R3 = LcdBuffer
R4 = R5 //写入长度为6个字节
CALL __LcdPageWriteWord //调用页写入程序
R1 = LcdBuffer //读取字库数据的首指针
R2 = R5 //转换字数
CALL _Cal_Tem_Buf2 //下一行的数据自转换(低k位有效)
R1 = 0x0f //低4位有效
[mask] = R1
R1 = [y]
R1 = R1 LSR 3 //得到写入页值
R1 += 1 //页码加1
R2 = [x] //得到写入列值
R3 = R_TempBuffer
R4 = R5 //写入长度为6个字节
CALL __LcdPageWriteWord //调用页写入程序
GOTO ?_DISP12x6_3
?_Lcd_Str6_Clip:
CMP R1,0x04
JNA ?_Lcd_Str6_2page
GOTO ?_Lcd_Str6_3page
?_Lcd_Str6_2page:
R1 = LcdBuffer //读取字库数据的首指针
R2 = R5 //转换字数
CALL _Cal_Tem_Buf //计算要写入的数据(一个地址内数据自转换)
R1 = maskcode //说明只需两页显示
R1 += [k] //显示第一页
R1 =[R1] //读取maskcode码
[mask] = R1 //保存屏蔽码
R1 = [y]
R1 = R1 LSR 3 //得到写入页值
R2 = [x] //得到写入列值
R3 = R_TempBuffer
R4 = R5 //写入长度为6个字节
CALL __LcdPageWriteWord //调用页写入程序
//显示第二页
R1 = LcdBuffer //读取字库数据的首指针
R2 = R5 //转换字数
CALL _Cal_Tem_Buf2 //计算第二页写入的数据(需要两个地址合起来)
R1 = maskcode
R1 += [k]
R1 += 4
R1 = [R1] //低4+k位有效
R1 = R1 XOR 0xFFFF //取反
R1 &= 0xFF
[mask] = R1 //计算屏蔽码
R1 = [y]
R1 = R1 LSR 3 //得到写入页值
R1 += 1 //页值需加1
R2 = [x] //得到写入列值
R3 = R_TempBuffer
R4 = R5 //写入长度为6个字节
CALL __LcdPageWriteWord //调用页写入程序
GOTO ?_DISP12x6_3
?_Lcd_Str6_3page: //需要分三页显示
R1 = LcdBuffer //读取字库数据的首指针
R2 = R5 //转换字数
CALL _Cal_Tem_Buf //计算要写入的数据(一个地址内数据自转换)
R1 = maskcode //说明只需两页显示
R1 += [k] //显示第一页
R1 =[R1] //读取maskcode码
[mask] = R1 //保存屏蔽码
R1 = [y]
R1 = R1 LSR 3 //得到写入页值
R2 = [x] //得到写入列值
R3 = R_TempBuffer
R4 = R5 //写入长度为6个字节
CALL __LcdPageWriteWord //调用页写入程序
//显示第二页
R1 = LcdBuffer //读取字库数据的首指针
R2 = R5 //转换字数
CALL _Cal_Tem_Buf2 //计算第二页写入的数据(需要两个地址合起来)
R1 = 0xFF
[mask] = R1 //计算屏蔽码
R1 = [y]
R1 = R1 LSR 3 //得到写入页值
R1 += 1 //页值需加1
R2 = [x] //得到写入列值
R3 = R_TempBuffer
R4 = R5 //写入长度为6个字节
CALL __LcdPageWriteWord //调用页写入程序
R1 = LcdBuffer //读取字库数据的首指针
R2 = R5 //转换字数
CALL _Cal_Tem_BufSR8 //下一行的数据自转换(低k-4位有效)
R1 = maskcode //低K-4位有效
R1 += [k]
R1 -= 4
R1 = [R1] //低K-4位有效
R1 = R1 XOR 0xFFFF //取反
R1 &= 0xFF //mask只有低8位有效
[mask] = R1 //计算屏蔽码
R1 = [y]
R1 = R1 LSR 3 //得到写入页值
R1 += 2 //页值需加2(写第三页)
R2 = [x] //得到写入列值
R3 = R_TempBuffer
R4 = R5 //写入长度为6个字节
CALL __LcdPageWriteWord //调用页写入程序
?_DISP12x6_3: //一个字符完成后的处理
R1 = [x] //取写入前列值
R1 += R5 //变换到下一个写入位置
[x] = R1
?_Lcd_Str6_Inc:
R1 = [Length] //写入字符串长度加1
R1 += 1
[Length] = R1
CMP R1,[R_LcdLength]
JE ?_Lcd_Str6_Exit
GOTO ?_Lcd_Str6_Loop //找下一个字符
?_Lcd_Str6_Exit:
POP R1,R5 FROM [SP]
RETF
//----------------------------------------------------------//
//名称:F_Lcd_String10x16
//功能:LCD文字显示,需自动判断换行、文字结束,无效编码直接以空格代替
//入口:起始坐标R_LcdStartDot(x,y),字符指针R_LcdStringPtr,
// 字符内码长度R_LcdLength(字数,全角和半角都占一个字),写入模式R_LcdStatus
//重要寄存器:R1:字符指针,请注意,用它来读取内码,所以一定要保护好,否则显示出错
//局部变量: length:长度,用于标识进行显示的是第几个字
// x:显示列值
// y:显示行值,这两个用于确认显示地址
// K:写入字符的首页的页内偏移量,用于确认字符的起始行
// mask:屏蔽码,用于标识写入字节的有效位
// maskcode:对应不同的屏蔽码,根据K值得到相应的屏蔽码
// LcdBuffer:用于存储从字库中读取到的数据
// R_TempBuffer:显示数据转换后得到的显示缓冲区,用于一页内的连续显示
//出口:无
//影响寄存器:无
//----------------------------------------------------------//
.public F_Lcd_String10x16
F_Lcd_String10x16:
PUSH R1,R5 TO [SP]
R1 = [R_LcdLength]
JNZ ?_Lcd_String10x16_0
GOTO ?_Lcd_Str10x16_Finish
?_Lcd_String10x16_0:
R1 = 0
[Length] = R1
CALL F_B_LcdCalxy
CALL _CAL_maskcode //初始化maskcode值 8word
?_Lcd_10x16_1:
R1 = [R_LcdStringPtr] //读取第N个要写入的字符
R1 = R1 + [Length]
R1 = [R1] //得到内码
R2 = 10
CALL _CalFontCode10x16 //调用内码判断程序
CMP R1,1 //R1=1说明是12x12全角字符
JE ?_DISP10x16_1 //不符合要求则显示下一个字符
GOTO ?_DISP10x16_4
?_DISP10x16_1: //判断出是半角字符
R1 = LcdBuffer //读取字库数据的保存指针
R2 = 10 //10x16字符,占用10个字
CALL __GetRomData //R3R4是段地址和偏移量,调用读字库程序
R2 = 10 //列宽为10
R3 = Hz_Height //行宽为16(中间隔一行)
CALL _Judgexy //判断xy宽,用于自动换行
CMP R1,C_False
JNE ?_DISP10x16_2
GOTO ?_Lcd_Str10x16_Finish
?_DISP10x16_2: //内码正确,行列正确,可以显示
R1 = [y]
R1 = R1 & 0x07 //得到行值页内偏移量
[k] = R1
CMP R1,C_Null //k=0转移
JNE ?_DISP10x16_3
R1 = 0xff //起始为整页的处理
[mask] = R1
R1 = [y]
R1 = R1 LSR 3 //得到写入页值
R2 = [x] //得到写入列值
R3 = LcdBuffer
R4 = 10 //写入长度为10个字节
CALL F_LcdPageWriteNew //调用页写入程序
R1 = LcdBuffer //读取字库数据的首指针
R2 = Hz_Word //转换字数
CALL _Cal_Tem_Buf2 //右移8位
R1 = 0xff //有效
[mask] = R1
R1 = [y]
R1 = R1 LSR 3 //得到写入页值
R1 += 1 //页码加1
R2 = [x] //得到写入列值
R3 = R_TempBuffer
R4 = 10 //写入长度为10个字节
CALL F_LcdPageWriteNew //调用页写入程序
GOTO ?_DISP10x16_5
?_DISP10x16_3:
R1 = LcdBuffer //读取字库数据的首指针
R2 = 10 //转换字数
CALL _Cal_Tem_Buf //计算要写入的数据(一个地址内数据自转换)
R1 = maskcode //说明只需两页显示
R1 += [k] //显示第一页
R1 =[R1] //读取maskcode码
[mask] = R1 //保存屏蔽码
R1 = [y]
R1 = R1 LSR 3 //得到写入页值
R2 = [x] //得到写入列值
R3 = R_TempBuffer
R4 = 10 //写入长度为10个字节
CALL F_LcdPageWriteNew //调用页写入程序
//显示第二页
R1 = LcdBuffer //读取字库数据的首指针
R2 = 10 //转换字数
CALL _Cal_Tem_Buf2 //计算第二页写入的数据(需要两个地址合起来)
R1 = 0xFF
[mask] = R1 //计算屏蔽码
R1 = [y]
R1 = R1 LSR 3 //得到写入页值
R1 += 1 //页值需加1
R2 = [x] //得到写入列值
R3 = R_TempBuffer
R4 = 10 //写入长度为10个字节
CALL F_LcdPageWriteNew //调用页写入程序
R1 = LcdBuffer //读取字库数据的首指针
R2 = 10 //转换字数
CALL _Cal_Tem_BufSR8 //下一行的数据自转换(低k位有效)
R1 = maskcode //低K位有效
R1 += [k]
R1 = [R1] //低K位有效
R1 = R1 XOR 0xFFFF //取反
R1 &= 0xFF //mask只有低8位有效
[mask] = R1 //计算屏蔽码
R1 = [y]
R1 = R1 LSR 3 //得到写入页值
R1 += 2 //页值需加2(写第三页)
R2 = [x] //得到写入列值
R3 = R_TempBuffer
R4 = 10 //写入长度为10个字节
CALL F_LcdPageWriteNew //调用页写入程序
?_DISP10x16_5: //一个字符完成后的处理
R1 = [x] //取写入前列值
R1 += 10 //变换到下一个写入位置
[x] = R1
?_DISP10x16_4:
R1 = [Length] //写入字符串长度加1
R1 += 1
[Length] = R1
CMP R1,[R_LcdLength]
JE ?_Lcd_Str10x16_Finish
GOTO ?_Lcd_10x16_1 //找下一个字符
?_Lcd_Str10x16_Finish:
POP R1,R5 FROM [SP]
RETF
//----------------------------------------------------------//
//名称:F_Lcd_Line
//功能:画横线或竖线
//入口:模式R_LcdStatus,起始坐标R_LcdStartDot(x,y),终止坐标R_LcdEndDot(x,y)
//出口:无
//影响寄存器:无
//----------------------------------------------------------//
//.public F_Lcd_Line
//F_Lcd_Line:
// PUSH R1,R5 TO [SP]
// R1 = [R_LcdStartDot]
// CMP R1,[R_LcdEndDot]
// JNE ?_Lcd_Line1
// GOTO ?_Lcd_Line_End //如果起始点与终止点坐标一样,则结束
//?_Lcd_Line1:
// CALL _Cal_Dot_Correct //用到R1 R2寄存器
// CMP R1,C_False
// JNE ?_Lcd_Line3
// GOTO ?_Lcd_Line_End
//?_Lcd_Line3:
// CALL _CAL_maskcode //初始化maskcode值 8word
// R1 = [x]
// CMP R1,[x1]
// JE ?_Lcd_Line4
// GOTO ?_Lcd_Line5
//?_Lcd_Line4: //x相同,说明是画竖线
// R1 = [y]
// CMP R1,[y1]
// JNA ?_Lcd_Line41
// R2 = [y1]
// [y1] = R1
// [y] = R2 //保证[y1]>[y]
//?_Lcd_Line41:
// R1 = [y1]
// R1 = R1 -[y]
// [ysize] = R1 //得到ysize
// R1 = [y]
// R1 &= 0x07
// [k] = R1
// CMP R1,C_Null
// JNE ?_Lcd_Line42
// GOTO ?_Lcd_Line43
//?_Lcd_Line42: //K不为0
// R1 = [ysize]
// R1 += [k]
// CMP R1,0x08
// JA ?_Lcd_Line44 //说明不只一页写入
// R3 = 0x01 //说明只有一页内容
// R5 = [k]
// CALL _LCDShiftL //R3 = R3左移K位
// R5 = R3
// R4 = [ysize]
//?_CalMask1:
// R4 -= 1
// CMP R4,C_Null
// JE ?_Lcd_Line45
// R3 = R3 LSL 1
// R5 |= R3 //R5的[ysize+k --K位为1]
// JMP ?_CalMask1
//?_Lcd_Line45:
// [mask] = R5 //得到mask值
// R1 = [y]
// R1 = R1 LSR 3 //得到页值
// R2 = [x]
// R3 = mask
// R4 = 1
// CALL __LcdPageWriteWord //调用页写入程序
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -