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

📄 lcd.asm

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