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

📄 lcd.asm

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