📄 lcd.asm
字号:
R3 += 1
[x] = R3
CMP R3,[x1]
JNE ?_Lcd_Block_MiddlePage1
R3 = [y]
R3 += 4 //[y]换到下一页起始位置
[y] = R3
R3 = [ysize]
R3 = R3 -4
[ysize] = R3 //计算还要写的行值
R3 = [R_LcdStartDot]
R3 &= 0xFF //得到x0指针
[x] = R3
GOTO ?_Lcd_Block_MiddlePage
?_Lcd_Block_LastPage: //说明是最后一页
R3 = [ysize]
CMP R3,0
JNE ?_Lcd_Block_LastPage0
GOTO ?_Lcd_Block_End
?_Lcd_Block_LastPage0:
R4 = maskcode //说明是最后一页
R4 += [ysize] //低ysize位为1
R4 =[R4] //读取maskcode码
R4 = R4 XOR 0xFFFF //取反
R4 &= 0x00ff //取低8位有效
R1 = r4
call F_LCDData_Change
r4 = r1
[mask] = R4 //保存屏蔽码
?_Lcd_Block_LastPage1:
R3 = 0xFF
[LcdBuffer] = R3
R1 = [y]
R1 = R1 LSR 2 //得到写入页值
R2 = [x] //得到写入列值
R3 = LcdBuffer
R4 = 1 //写入长度为1个字节
CALL __LcdPageWrite //调用页写入程序
R3 = [x]
R3 += 1
[x] = R3
CMP R3,[x1]
JNE ?_Lcd_Block_LastPage1
GOTO ?_Lcd_Block_End
?_Lcd_Block_JustOnePage:
R3 = 0x01
R5 = [k]
CALL _LCDShiftL //R3 = R3左移K位
R5 = R3
R4 = [ysize]
?_Lcd_Block_CalMask:
R4 -= 1
CMP R4,C_Null
JE ?_Lcd_Block_JustOnePage1
R3 = R3 LSL 1
R5 |= R3 //R5的[ysize+k --K位为1]
JMP ?_Lcd_Block_CalMask
?_Lcd_Block_JustOnePage1:
R1 = r5
call F_LCDData_Change
r5 = r1
[mask] = R5 //得到mask值
?_Lcd_Block_JustOnePage2:
R3 = 0xFF
[LcdBuffer] = R3
R1 = [y]
R1 = R1 LSR 2 //得到写入页值
R2 = [x] //得到写入列值
R3 = LcdBuffer
R4 = 1 //写入长度为1个字节
CALL __LcdPageWrite //调用页写入程序
R3 = [x]
R3 += 1
[x] = R3
CMP R3,[x1]
JNE ?_Lcd_Block_JustOnePage2
GOTO ?_Lcd_Block_End
?_Lcd_Block_WholePage:
R3 = 0xff
[mask] = R3 //
R3 = [ysize]
CMP R3 ,4 //看是否还要写一满页?
JB ?_Lcd_Block_WPage1
R3 = 0xFF
[LcdBuffer] = R3
R1 = [y]
R1 = R1 LSR 2 //得到写入页值
R2 = [x] //得到写入列值
R3 = LcdBuffer
R4 = 1 //写入长度为1个字节
CALL __LcdPageWrite //调用页写入程序
R3 = [x]
R3 += 1
[x] = R3
CMP R3,[x1]
JNE ?_Lcd_Block_WholePage
R3 = [y]
R3 += 4 //[y]换到下一页起始位置
[y] = R3
R3 = [ysize]
R3 = R3 -4
[ysize] = R3 //计算还要写的行值
R3 = [R_LcdStartDot]
R3 &= 0xFF //得到x0指针
[x] = R3
GOTO ?_Lcd_Block_WholePage
?_Lcd_Block_WPage1:
R3 = [ysize]
CMP R3 ,C_Null
JNE ?_Lcd_Block_WPage2
GOTO ?_Lcd_Block_End
?_Lcd_Block_WPage2:
R4 = maskcode //说明是最后一页
R4 += [ysize] //低ysize位为1
R4 =[R4] //读取maskcode码
R4 = R4 XOR 0xFFFF //取反
R4 &= 0x00ff //取低8位有效
[mask] = R4 //保存屏蔽码
R3 = 0xFF
[LcdBuffer] = R3
R1 = [y]
R1 = R1 LSR 2 //得到写入页值
R2 = [x] //得到写入列值
R3 = LcdBuffer
R4 = 1 //写入长度为1个字节
CALL __LcdPageWrite //调用页写入程序
R3 = [x]
R3 += 1
[x] = R3
CMP R3,[x1]
JNE ?_Lcd_Block_WPage2
?_Lcd_Block_End:
R1 = 0xffff
[R_LcdGray] = r1
POP R1,R5 FROM [SP]
RETF
//----------------------------------------------------------//
//功能:位图操作,显示位图
//入口:起始坐标R_LcdStartDot(x,y),终止坐标R_LcdEndDot(x,y),
// R1-位图地址(ROM地址),模式控制 R_LcdStatus,位图所在BANK固定为0
//出口:无
// x:显示列值
// y:显示行值,这两个用于确认显示地址
// K:写入字符的首页的页内偏移量,用于确认字符的起始行
// mask:屏蔽码,用于标识写入字节的有效位
// maskcode:对应不同的屏蔽码,根据K值得到相应的屏蔽码
// LcdBuffer:用于存储从字库中读取到的数据
// R_TempBuffer:显示数据转换后得到的显示缓冲区,用于一页内的连续显示
// R1save:保存位图地址起始值
// xsize:用于保存位图列向长度
// ysize:用于保存位图行向长度
// xword:用于保存位图列向所占的字地址长度
//影响寄存器:无
//----------------------------------------------------------//
.public F_Lcd_BitMap
F_Lcd_BitMap:
PUSH R1,R5 TO [SP]
[R_LcdStringPtr] = R2 //暂存
[R1save] = R1 //保存位图初始值
PUSH R1 TO [SP] //保存位图地址
CALL _Cal_Dot_Correct //判断起终坐标是否符合要求
CMP R1,C_False
JNE ?_Lcd_BitMap11
POP R1 FROM [SP]
GOTO ?_Lcd_BitMap_End
?_Lcd_BitMap11:
POP R1 FROM [SP]
R4 = [x1] //如果x0>x1则结束
R3 = [x]
CMP R3,R4
JB ?_Lcd_BitMap21
GOTO ?_Lcd_BitMap_End
?_Lcd_BitMap21:
R4 -= R3
R4 = R4 LSR 1
[xsize] = R4 //得到xsize
R4 = [y1]
R3 = [y] //如果y0>y1则结束
CMP R3,R4
JB ?_Lcd_BitMap22
GOTO ?_Lcd_BitMap_End
?_Lcd_BitMap22:
R4 -= R3
[ysize] = R4 //得到ysize
CALL _CAL_maskcode //初始化maskcode值 8word
R3 = [y]
R3 &= 0x03 //取低三位
[k] = R3 //得到页内偏移量
CMP R3,C_Null
JNE ?_Lcd_BitMap_Page
GOTO ?_Lcd_BitMap_WholePage
?_Lcd_BitMap_Page:
R4 = R4 + R3 //R4 = k + ysize
CMP R4,8 //看是否满一页
JA ?_Lcd_BitMap_FirstPage
GOTO ?_Lcd_BitMap_JustOnePage
?_Lcd_BitMap_FirstPage: //firstpage 高[8-k]位有效
R4 = maskcode //说明只需两页显示
R4 += [k] //显示第一页
R4 =[R4] //读取maskcode码
[mask] = R4 //保存屏蔽码
?_Lcd_BitMap_FirstPage1:
CALL F_Lcd_BitMap_Data //取要显示的字
R1 += 1
[LcdBuffer] = R3
R5 = [k]
CALL _LCDShiftL //要显示的字左移K位==>R3
[LcdBuffer] = R3
PUSH R1 TO [SP]
R1 = [y]
R1 = R1 LSR 3 //得到写入页值
R2 = [x] //得到写入列值
R3 = LcdBuffer
R4 = 1 //写入长度为2个字节
CALL __LcdPageWrite //调用页写入程序
POP R1 FROM [SP]
R3 = [x]
R3 += 2
[x] = R3
CMP R3,[x1]
JB ?_Lcd_BitMap_FirstPage1
R3 = [y]
R3 &= 0xf8
R3 += 8 //[y]换到下一页起始位置
[y] = R3
R3 = [ysize]
R3 = R3 -8
R3 += [k]
[ysize] = R3 //计算还要写的行值
R3 = [R_LcdStartDot]
R3 &= 0xFF //得到x0指针
[x] = R3
R1 = [R1save]
?_Lcd_BitMap_MiddlePage:
R3 = 0xff
[mask] = R3 //
R3 = [ysize]
CMP R3 ,8 //看是否还要写一满页?
JB ?_Lcd_BitMap_LastPage
?_Lcd_BitMap_MiddlePage1:
CALL F_Lcd_BitMap_Data //取要显示的字
R5 = -[k] //R1指针数据右移(8-k)位
R5 += 8
CALL _LCDShiftR //入口:R5 R3
R4 = R3 //R4暂存第一个数据
PUSH R1,R2 TO [SP]
R1 += [xsize] //得到要累加数据指针
CALL F_Lcd_BitMap_Data //取要显示的字
R5 = [k]
CALL _LCDShiftL //(R1+R2)指针数据左移K位
R3 += R4 //两次转换结果相加
[LcdBuffer] = R3
R1 = [y]
R1 = R1 LSR 3 //得到写入页值
R2 = [x] //得到写入列值
R3 = LcdBuffer
R4 = 1 //写入长度为2个字节
CALL __LcdPageWrite //调用页写入程序
POP R1,R2 FROM [SP]
R1 += 1
R3 = [x] //向下移一个字
R3 += 2
[x] = R3
CMP R3,[x1]
JB ?_Lcd_BitMap_MiddlePage1
R3 = [y]
R3 += 8 //[y]换到下一页起始位置
[y] = R3
R3 = [ysize]
R3 = R3 -8
[ysize] = R3 //计算还要写的行值
R3 = [R_LcdStartDot]
R3 &= 0xFF //得到x0指针
[x] = R3
GOTO ?_Lcd_BitMap_MiddlePage
?_Lcd_BitMap_LastPage: //说明是最后一页
R3 = [ysize]
CMP R3,0
JNE ?_Lcd_BitMap_LastPage0
GOTO ?_Lcd_BitMap_End
?_Lcd_BitMap_LastPage0:
R4 = maskcode //说明是最后一页
R4 += [ysize] //低ysize位为1
R4 =[R4] //读取maskcode码
R4 = R4 XOR 0xFFFF //取反
R4 &= 0x00ff //取低8位有效
[mask] = R4 //保存屏蔽码
?_Lcd_BitMap_LastPage1:
CALL F_Lcd_BitMap_Data //取要显示的字
R5 = -[k]
R5 += 8
CALL _LCDShiftR //要显示的字右移8-K位==>R3
R4 = R3
[LcdBuffer] = R3
PUSH R1 TO [SP]
R3 = [ysize]
CMP R3,[k]
JNA ?_Lcd_BitMap_LastPage2
R1 += [xsize] //得到要累加数据指针
R3 = [R1]
R5 = [k]
CALL _LCDShiftL //(R1+R2)指针数据左移K位
R3 += R4 //得到两次转换值的和
[LcdBuffer] = R3
?_Lcd_BitMap_LastPage2:
R1 = [y]
R1 = R1 LSR 3 //得到写入页值
R2 = [x] //得到写入列值
R3 = LcdBuffer
R4 = 2 //写入长度为2个字节
CALL __LcdPageWrite //调用页写入程序
POP R1 FROM [SP]
R1 += 1 //取下一个显示字
R3 = [x]
R3 += 2
[x] = R3
CMP R3,[x1]
JB ?_Lcd_BitMap_LastPage1
GOTO ?_Lcd_BitMap_End
?_Lcd_BitMap_JustOnePage:
R3 = 0x01
R5 = [k]
CALL _LCDShiftL //R3 = R3左移K位
R5 = R3
R4 = [ysize]
?_Lcd_BitMap_CalMask:
R4 -= 1
CMP R4,C_Null
JE ?_Lcd_BitMap_JustOnePage1
R3 = R3 LSL 1
R5 |= R3 //R5的[ysize+k --K位为1]
JMP ?_Lcd_BitMap_CalMask
?_Lcd_BitMap_JustOnePage1:
[mask] = R5 //得到mask值
?_Lcd_BitMap_JustOnePage2:
CALL F_Lcd_BitMap_Data //取要显示的字
[LcdBuffer] = R3
R1 += 1 //取下一个显示字
R5 = [k]
CALL _LCDShiftL //要显示的字左移K位==>R3
PUSH R1 TO [SP]
R1 = [y]
R1 = R1 LSR 3 //得到写入页值
R2 = [x] //得到写入列值
R3 = LcdBuffer
R4 = 2 //写入长度为2个字节
CALL __LcdPageWrite //调用页写入程序
POP R1 FROM [SP]
R3 = [x]
R3 += 2
[x] = R3
CMP R3,[x1]
JB ?_Lcd_BitMap_JustOnePage2
GOTO ?_Lcd_BitMap_End
?_Lcd_BitMap_WholePage:
R3 = 0xff
[mask] = R3 //
R3 = [ysize]
CMP R3 ,4 //看是否还要写一满页?
JB ?_Lcd_BitMap_WPage1
CALL F_Lcd_BitMap_Data //取要显示的字
[LcdBuffer] = R3
PUSH R1 TO [SP]
R1 = [y]
R1 = R1 LSR 2 //得到写入页值
R2 = [x] //得到写入列值
R3 = LcdBuffer
R4 = 2 //写入长度为2个字节
CALL __LcdPageWrite //test for new lcd //CALL F_LcdPageWrite_New// //调用页写入程序
POP R1 FROM [SP]
R1 += 1 //向下移一个字
R3 = [x]
R3 += 2
[x] = R3
CMP R3,[x1]
JB ?_Lcd_BitMap_WholePage
//---------
// CALL F_Delay_BitMap
//-------------
R3 = [y]
R3 += 4 //[y]换到下一页起始位置
[y] = R3
R3 = [ysize]
R3 = R3 -4
[ysize] = R3 //计算还要写的行值
R3 = [R_LcdStartDot]
R3 &= 0xFF //得到x0指针
[x] = R3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -