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

📄 lcdr.asm

📁 凌阳单片机LCD点阵及16*16字库程序,适合广大想入门的朋友.
💻 ASM
📖 第 1 页 / 共 5 页
字号:
?_Lcd_reverse_LOOP0:
//				CALL	SET_C
				R4	= R2 & 0x000F;
				R4	|=0x0A00;
				[P_Lcd501Ctrl]	= R4;
					//送CA_MSB
				R4	= R2 & 0x00F0;
				R4	= R4 LSR 4;
				R4	|=0x0A10;
				[P_Lcd501Ctrl]	= R4;
				NOP;
				R3	= 0x0D00;
				[P_Lcd501Ctrl]	= R3;
				NOP;
				NOP;				//先空读一下
				R3	= 0x0D00;
				[P_Lcd501Ctrl]	= R3;
				NOP;
				NOP;
				R3	= [P_Lcd501Data];
//				CALL	SET_C
				R4	= R2 & 0x000F;
				R4	|=0x0A00;
				[P_Lcd501Ctrl]	= R4;
				//送CA_MSB
				R4	= R2 & 0x00F0;
				R4	= R4 LSR 4;
				R4	|=0x0A10;
				[P_Lcd501Ctrl]	= R4;
				R3  ^= 0xFFFF;				//将取出来的数按位取反
				R3 	&= 0x00FF
				R3	|= 0x0E00;
				[P_Lcd501Ctrl]	= R3
				R2 +=1
				CMP R2,128
				JB ?_Lcd_reverse_LOOP0
				R2 = 0
				R1 += 1
				CMP R1,32
				JB ?_Lcd_reverse_LOOP
				POP	R1,R5 FROM	[SP];
				RETF
//写缓冲区数据到显示
//入口地址:R4,使用前将首地址写入R4
F_Lcd_bitmap:
				PUSH	R1,R5 TO [SP];
				R1	= 0;
				R2	= 0;
				CALL	SET_P_C
				R3	= 128*128/4;
?_Lcd_bitmap_LOOP:
				R1	= [R4++];
//				R1	^=0x00FF;				//将取出来的数按位取反
				R1	|= C_WriteData;
				[P_Lcd501Ctrl]	= R1;	
				R3	-=1;
				JNZ	?_Lcd_bitmap_LOOP;
				POP	R1,R5 FROM	[SP];
				RETF							
//一条线
F_LINE_T:		PUSH	R1,R5 TO [SP];
				R1	= 0;
				R2	= 0;
				R3	= 32;
				CALL	SET_C			
				CALL	W_DATE0			//WRITE "O" TO ALL SCREEN 
?_LLOOP:		
				CALL	SET_P
				CALL	W_03ROW
				CALL	F_Delay96ms
				CALL	SET_P
				CALL	W_00ROW
				CALL	SET_P
				CALL	W_0CROW
				CALL	F_Delay96ms
				CALL	SET_P
				CALL	W_00ROW
				CALL	SET_P
				CALL	W_30ROW
				CALL	F_Delay96ms
				CALL	SET_P
				CALL	W_00ROW
				CALL	SET_P
				CALL	W_C0ROW
				CALL	F_Delay96ms
				CALL	SET_P
				CALL	W_00ROW
				R1	+=1;
				R3	-=1;
				JNZ	?_LLOOP;
				POP	R1,R5 FROM [SP];
				RETF
				
				
															
//写一行0
W_00ROW:		R5	= 0x0000;
				R5	|=C_WriteData;
				R4	= 256;
?_LOOP1:		[P_Lcd501Ctrl]	= R5;
				R4	-=1;
				JNZ	?_LOOP1;
				RETF				
//写一行3
W_03ROW:		R5	= 0x0003;
				R5	|=C_WriteData;
				R4	= 256;
?_LOOP2:		[P_Lcd501Ctrl]	= R5;
				R4	-=1;
				JNZ	?_LOOP2;
				RETF
//写一行0000,1100
W_0CROW:		R5	= 0x000C;
				R5	|=C_WriteData;
				R4	= 256;
?_LOOP3:		[P_Lcd501Ctrl]	= R5;
				R4	-=1;
				JNZ	?_LOOP3;
				RETF

//写一行0011,0000
W_30ROW:		R5	= 0x0030;
				R5	|=C_WriteData;
				R4	= 256;
?_LOOP4:		[P_Lcd501Ctrl]	= R5;
				R4	-=1;
				JNZ	?_LOOP4;
				RETF

//写一行1100,0000
W_C0ROW:		R5	= 0x00C0;
				R5	|=C_WriteData;
				R4	= 256;
?_LOOP5:		[P_Lcd501Ctrl]	= R5;
				R4	-=1;
				JNZ	?_LOOP5;
				RETF

				
//画一条线
//入口:R1起始行地址,R2起始列地址
LINE_SCR:		
				R1	= 0;
				R2	= 0;
			    CALL	SET_P_C
			    R2	= 8192;
			    
			    
?_RE_W:			R4	= 0x0000;
//				R5	= 4;
?_LOOP:			R3	= 128;
?_LINE:			R1	= C_WriteData;
				R4	|= R1;
				[P_Lcd501Ctrl]	= R4;
				R2	-=1;
				JZ	?_SCROLL;
				R3	-=1;
				JNZ	?_LINE;
//				R4	+=0x0055;
				CMP	R4,0x00FF;
				JZ	?_RE_W;
				CMP	R2,8192;
				JNZ	?_LOOP;
				
				//滚屏127
				R3	= 1;				
?_SCROLL:		R1	= 0x0A40;
				[P_Lcd501Ctrl]	= R1;
				R1	= 0x0A50;
				[P_Lcd501Ctrl]	= R1;
				R1 = 0xFFFF
				[d_ns]	= R1;
//				CALL	DELAYM
				R3	-=1;
				JNZ	?_SCROLL;
				RETF
				
//RAM写全零
W_DATE0:		PUSH	R1,R5 TO [SP];
				R3	= 8192;
				R1	= 0;
				R2	= 0;
			    CALL	SET_P_C
				R4	=	0x0E00;
?_LINE0:		[P_Lcd501Ctrl]	= R4;
//				R2	+=1;
				R3	-=1;
				JNZ	?_LINE0;
				POP	R1,R5 FROM [SP];
				RETF

//读当前数据存储在 TABLE
//R3存储读取字节数
READ_DATA:		PUSH	R1,R5 TO [SP];
				R3	= 2048;
				
				R2	= 0;
?_ADD_IN:		R5	= 128;
				R1	= 0;
				CALL	SET_P_C
				R2	+=1;
				R4	= TABLE;
				R1	= C_ReadData;				
				[P_Lcd501Ctrl]	= R1;
				R1	= 0x000F;
				[d_ns]	= R1;
				CALL	DELAYM
?_READ_LOOP:	R1	= C_ReadData;
				[P_Lcd501Ctrl]	= R1;
				R1	= 0x000F;
				[d_ns]	= R1;
				CALL	DELAYM
//				CALL	DELAYN
				R1	= [P_Lcd501Data];
				[R4++]	= R1;
				R5	-=1;
				JZ	?_ADD_IN;
				R3	-=1;
				JNZ	?_READ_LOOP;
				POP	R1,R5 FROM [SP];
				RETF				
		
				
//延时ms
DELAYM:			PUSH R2,R5 TO [SP];				
				R2	=[d_ns];
?_DELAYM_LOOP:	NOP;
				R2	-=1;
				JNZ	?_DELAYM_LOOP;
				POP R2,R5 FROM [SP];
				RETF
//延时us	12+13+5=5+5	=40		
DELAYN:
//				NOP;
//				NOP;
//				NOP;
				RETF
				
//写命令
W_COM:
				PUSH	R2,R5 TO [SP];
				R1	|=C_WriteCommand;
				[P_Lcd501Ctrl]	= R1;
//				R1	= 0x0fff;
//				[d_ns]	= R1;
//				CALL	DELAYM   	//??
				POP		R2,R5 FROM [SP];
				RETF

//写数据
W_DATA:			PUSH	R2,R5 TO [SP];
				R1	|=C_WriteData;
				[P_Lcd501Ctrl]	= R1;
//				R1	= 0x02FF;
//				[d_ns]	= R1;
//				CALL	DELAYM
//				CALL	DELAYN
				POP		R2,R5 FROM [SP];
				RETF				
F_LcdInit:
			R3	= 0x0AE2;				//    sys rest
			[P_Lcd501Ctrl]	= R3;
			R1 = 0x0FFF
			[d_ns]	= R1;
			CALL	DELAYM				//延时			
			R1	= 0x00EA;
			CALL 	W_COM
			R1	= 0x0027;
			CALL	W_COM
			R1	= 0x0023;				//set multiplex ratio

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -