⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.asm

📁 液晶屏启动程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
//?_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 + -