📄 lcd.asm
字号:
//?_Lcd_Test_Line_con1:
// R3 = LCD_DRAW_NORMAL
// [R_LcdStatus] = R3
// [R_LcdStartDot] = R1
// [R_LcdEndDot] = R2
// CALL F_Lcd_Track
// CALL F_Delay96ms //延时1S
// R3 = LCD_DRAW_CLEAR
// [R_LcdStatus] = R3
// [R_LcdStartDot] = R1
// [R_LcdEndDot] = R2
// CALL F_Lcd_Track
// R1 += 1
// R2 += 1
// CMP R1,C_LCD_COLUMN
// JB ?_Lcd_Test_Line_con1
// CALL F_Lcd_ClrScreen //液晶擦除
////做水平线移动
// R1 = 0x0001
// R2 = Line1_End
//?_Lcd_Test_Line_con2:
// R3 = LCD_DRAW_NORMAL
// [R_LcdStatus] = R3
// [R_LcdStartDot] = R1
// [R_LcdEndDot] = R2
// CALL F_Lcd_Track
// CALL F_Delay96ms //延时1S
// R3 = LCD_DRAW_CLEAR
// [R_LcdStatus] = R3
// [R_LcdStartDot] = R1
// [R_LcdEndDot] = R2
// CALL F_Lcd_Track
// R1 += 0x100
// R2 += 0x100
// CMP R1,0x4000 //看是否到最后一行
// JB ?_Lcd_Test_Line_con2
// CALL F_Lcd_ClrScreen //液晶擦除
// POP R1,R3 FROM [SP]
// RETF
//----------------------------------------------------------//
//名称:F_Lcd_On
//功能:打开LCD
//入口:无
//出口:无
//影响寄存器:无
//----------------------------------------------------------//
//.public F_Lcd_On
//F_Lcd_On:
// PUSH R1 TO [SP]
// R1 = LCD_DISP_ON
// CALL __LcdCmdWrite //写入显示打开命令
// call F_Lcd_ClrScreen
// R2 = 0 //page code
//?_Lcd_Test_FullSreen2:
// R3 = 0 //column code
// R1 = R2 | LCD_PAGE_SET
// CALL __LcdCmdWrite
// R1 = LCD_COLUMN_UP
// CALL __LcdCmdWrite
// R1 = LCD_COLUMN_LOW
// CALL __LcdCmdWrite
//?_Lcd_Test_FullSreen1:
// R1 = 0xFF //写入显示数据0xff,全屏点亮
// CALL __LcdDataWrite
// R3 + = 1
// CMP R3,C_LCD_COLUMN //判断一页是否写完
// JB ?_Lcd_Test_FullSreen1
// R2 + = 1
// CMP R2,9 //判断是否写完8页
// JB ?_Lcd_Test_FullSreen2
// POP R1 FROM [SP]
// RETF
//----------------------------------------------------------//
//名称:F_Lcd_Off
//功能:关闭LCD显示
//入口:无
//出口:无
//影响寄存器:无
//----------------------------------------------------------//
.public F_Lcd_Off
F_Lcd_Off:
PUSH R1 TO [SP]
R1 = LCD_DISPLAY_ENABLE|0x0 //写入显示关闭命令
CALL __LcdCmdWrite
POP R1 FROM [SP]
RETF
//----------------------------------------------------------//
//名称:F_Lcd_ClrScreen
//功能:清LCD显示,向LCD显示RAM中全写0
//入口:无
//出口:无
//影响寄存器:无
//----------------------------------------------------------//
.public F_Lcd_ClrScreen
F_Lcd_ClrScreen:
PUSH R1,R3 TO [SP]
R2 = 0 //page code
?_Lcd_ClrSreen2:
R3 = 0 //cher
R1 = R2 | LCD_PAGE_ADDR
CALL __LcdCmdWrite
R1 = LCD_COLUMN_MSB //设置显示列地址高四位(00)
CALL __LcdCmdWrite
R1 = LCD_COLUMN_LSB
CALL __LcdCmdWrite
?_Lcd_ClrSreen1:
R1 = 0x00 //写入显示数据0
CALL __LcdDataWrite
R3 + = 1
CMP R3,C_LCD_COLUMN + 1 //判断一页是否写完
JB ?_Lcd_ClrSreen1
//---------
// CALL F_Delay_BitMap
//-------------
R2 + = 1
CMP R2,27 //判断是否写完27页
JB ?_Lcd_ClrSreen2
POP R1,R3 FROM [SP]
RETF
//----------------------------------------------------------//
//名称:F_Lcd_ClrBuffer
//功能:置文字缓冲区全部为半角的空格0x20
//入口:无
//出口:无
//影响寄存器:无
//----------------------------------------------------------//
.public F_Lcd_ClrBuffer
F_Lcd_ClrBuffer:
PUSH R1,R3 TO [SP]
R1 = LcdString //文字缓冲区首指针
R2 = ' ' //半角的空格
R3 = C_LcdStringSize//缓冲区长度
?_Lcd_ClrBuffer_0:
[R1++] = R2
R3 -= 1
JNZ ?_Lcd_ClrBuffer_0
POP R1,R3 FROM [SP]
RETF
//----------------------------------------------------------//
//普通16x16文字显示
//说明:固定从LcdString开始,固定使用普通模式
//----------------------------------------------------------//
.public F_Lcd_String
F_Lcd_String:
R1 = LcdString
[R_LcdStringPtr] = R1
R1 = LCD_DRAW_NORMAL
[R_LcdStatus] = R1
CALL F_Lcd_String16x16
RETF
//----------------------------------------------------------//
//普通16x16文字普通模式显示
//入口:无
//说明:固定使用普通模式
//----------------------------------------------------------//
.public F_Lcd_String_Normal
F_Lcd_String_Normal:
R1 = LCD_DRAW_NORMAL
[R_LcdStatus] = R1
CALL F_Lcd_String16x16
RETF
//----------------------------------------------------------//
//普通16x16文字或模式显示
//入口:无
//说明:固定使用普通模式
//----------------------------------------------------------//
.public F_Lcd_String_OR
F_Lcd_String_OR:
R1 = LCD_DRAW_OR
[R_LcdStatus] = R1
CALL F_Lcd_String16x16
RETF
//----------------------------------------------------------//
//名称:F_Lcd_String16x16
//功能: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_String16x16
F_Lcd_String16x16:
PUSH R1,R5 TO [SP]
R1 = [R_LcdLength]
JNZ ?_Lcd_Str16_Init
GOTO ?_Lcd_Str16_Exit //字符长度=0,退出
?_Lcd_Str16_Init:
R1 = 0
[Length] = R1
CALL F_B_LcdCalxy
CALL _CAL_maskcode //初始化maskcode值 8word
?_Lcd_Str16_Loop:
R1 = [R_LcdStringPtr] //读取第N个要写入的字符
R1 = R1 + [Length]
R1 = [R1] //得到内码
CMP R1,C_TextLineOver;
JNE ?_Lcd_Str16_QBJ
//换行符处理
R1 = [y]
R1 += Hz_Height //换行
[y] = R1 //得到新行值
R1 = 0
[x] = R1 //列值回0
GOTO ?_Lcd_Str16_Inc
?_Lcd_Str16_QBJ:
CALL _JudgeQBJ16 //调用内码判断程序
R1 = LcdBuffer //读取字库数据的保存指针
R2 = R5 //16x16字符,占用16个字
CALL __GetRomData //R3R4是段地址和偏移量,调用读字库程序
R2 = R5 //16列
R3 = Hz_Height //16行(中间隔一行)
CALL _Judgexy //判断xy宽,用于自动换行
CMP R1,C_False
JNE ?_Lcd_Str16_Int
GOTO ?_Lcd_Str16_Exit //已经写到了液晶屏右下角
?_Lcd_Str16_Int: //内码正确,行列正确,可以显示
R1 = [y]
R1 = R1 & 0x07 //得到行值页内偏移量
[k] = R1
CMP R1,C_Null //k=0转移
JNE ?_Lcd_Str16_Clip
//yuancz--修改以下
R1 = 0xff //起始为整页的处理
[mask] = R1
R1 = [y]
R1 = R1 LSR 3 //得到写入页值
R2 = [x] //得到写入列值
R3 = LcdBuffer
R4 = R5 //写入长度为10个字节
CALL F_LcdPageWriteNew //调用页写入程序 //已修改
R2 = Hz_Word //转换字数 //已修改
CALL F_Lcd_PageWrige
GOTO ?_Lcd_Str16_Next
?_Lcd_Str16_Clip:
R1 = LcdBuffer //读取字库数据的首指针
R2 = R5 //转换字数
CALL _Cal_Tem_Buf //计算要写入的数据(一个地址内数据自转换)
R1 = maskcode //说明只需两页显示
R1 += [k] //显示第一页
R1 = [R1] //读取maskcode码
[mask] = R1 //保存屏蔽码
R1 = [y]
R1 = R1 LSR 3 //除8得到写入页值
R2 = [x] //得到写入列值
R3 = R_TempBuffer
R4 = R5 //写入长度为10个字节
CALL F_LcdPageWriteNew //CALL __LcdPageWriteWord //调用页写入程序
//显示第二页
R2 = R5 //转换字数
CALL F_Lcd_PageWrige
R1 = LcdBuffer //读取字库数据的首指针
R2 = R5 //转换字数
CALL _Cal_Tem_BufSR8
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 = R5 //写入长度为10个字节
CALL F_LcdPageWriteNew //CALL __LcdPageWriteWord //调用页写入程序
//YUANCZ--修改以上
?_Lcd_Str16_Next: //一个字符完成后的处理
R1 = [x] //取写入前列值
R1 += R5 //变换到下一个写入位置
[x] = R1
?_Lcd_Str16_Inc:
R1 = [Length] //写入字符串长度加1
R1 += 1
[Length] = R1
CMP R1,[R_LcdLength]
JE ?_Lcd_Str16_Exit
GOTO ?_Lcd_Str16_Loop //找下一个字符
?_Lcd_Str16_Exit:
POP R1,R5 FROM [SP]
RETF
//----------------------------------------------------------//
//名称:F_Lcd_String8x8
//功能: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_String8x8
//F_Lcd_String8x8:
// PUSH R1,R5 TO [SP]
// R1 = [R_LcdLength]
// JNZ ?_Lcd_Str8_Init
// GOTO ?_Lcd_Str8_Exit
//?_Lcd_Str8_Init:
// R1 = 0
// [Length] = R1
// R1 = [R_LcdStartDot]
// R2 = R1 & 0xFF //计算起始坐标
// [x] = R2 //列值是坐标低字节
// R1 = R1 LSR 4
// R1 = R1 LSR 4
// [y] = R1 //计算起始行值
// CALL _CAL_maskcode //初始化maskcode值 8word
//?_Lcd_Str8_Loop:
// R1 = [R_LcdStringPtr] //读取第N个要写入的字符
// R1 = R1 + [Length]
// R1 = [R1] //得到内码
// R2 = 8
// CALL _CalFontCode //调用内码判断程序
// CMP R1,1
// JE ?_Lcd_Str8_Show //R1=1,正常全角字符
// GOTO ?_Lcd_Str8_Inc //不符合要求则显示下一个字符
//?_Lcd_Str8_Show: //判断出是半角字符
// R1 = LcdBuffer //读取字库数据的保存指针
// R2 = 8 //8x8字符,占用8个字
// CALL __GetRomData //R3R4是段地址和偏移量,调用读字库程序
// R2 = 8 //8列
// R3 = 9 //8行(中间隔一行)
// CALL _Judgexy //判断xy宽,用于自动换行
// CMP R1,C_False
// JNE ?_Lcd_Str8_Int
// GOTO ?_Lcd_Str8_Exit
//?_Lcd_Str8_Int: //内码正确,行列正确,可以显示
// R1 = [y]
// R1 = R1 & 0x07 //得到行值页内偏移量
// [k] = R1
// CMP R1,C_Null //k=0转移
// JNE ?_Lcd_Str8_Clip
//
// R1 = 0xff //起始为整页的处理
// [mask] = R1
// R1 = [y]
// R1 = R1 LSR 3 //得到写入页值
// R2 = [x] //得到写入列值
// R3 = LcdBuffer
// R4 = 8 //写入长度为8个字节
// CALL __LcdPageWriteWord //调用页写入程序
// GOTO ?_Lcd_Str8_Next
//?_Lcd_Str8_Clip:
// R1 = LcdBuffer //读取字库数据的首指针
// R2 = 8 //转换字数
// 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 = 8 //写入长度为8个字节
// CALL __LcdPageWriteWord //调用页写入程序
// //显示第二页
// R1 = LcdBuffer //读取字库数据的首指针
// R2 = 8 //转换字数
// CALL _Cal_Tem_Buf2 //下一行的数据自转换(低k位有效)
// R1 = maskcode //低K位有效
// R1 += [k]
// R1 = [R1] //低K位有效
// R1 = R1 XOR 0xFFFF //取反
// R1 &= 0xFF //mask只有低8位有效
// [mask] = R1 //计算屏蔽码
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -