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

📄 lcdr.asm

📁 凌阳单片机LCD点阵及16*16字库程序,适合广大想入门的朋友.
💻 ASM
📖 第 1 页 / 共 5 页
字号:
.include	SPT6608.inc

.ram
.var	page
.var	cloumn
.var	d_ns
.var	INCRE
DIS_BUF: .DW  2048  //128*30

.const	C_WriteCommand	= 0x0A00
.const	C_WriteData		= 0x0E00
.const	C_ReadStatus	= 0x0900
.const	C_ReadData		= 0x0D00


.text
.public	_main
_main:
			SP = 0xFFF;					//堆栈初始化
			R1 = 0x55AA;
			[P_Watchdog_Clr] = R1;		//复位后清看门狗
										
			
			R1 = 0xFFFF;
			[P_IntClr] = R1;			//清所有中断标志位
			
			R1 = B_28M + B_FoscDivBy2;		
			[P_SystemClock] = R1;		//初始速度调整为低速0.7M

        	//iod0设置为输出
        	R1 = 00000001b;
       		[P_IOD_Dir] = R1
        	R1 = 00000001b
       		[P_IOD_Data] = R1
			

			CALL F_LcdInit
LCDTEST:			
        	R1 = 00000000b
       		[P_IOD_Data] = R1			//开始前输出低
			CALL F_Lcd_clear
        	R1 = 00000001b
       		[P_IOD_Data] = R1			//结束后输出高
		
       		R1 = 00000000b
       		[P_IOD_Data] = R1			//开始前输出低
			R4	= TABLE;
			CALL  F_Lcd_bitmap
       		R1 = 00000001b
       		[P_IOD_Data] = R1			//结束后输出高
       		CALL F_Delay1s
       		
       		R1 = 00000000b
       		[P_IOD_Data] = R1			//开始前输出低
//			CALL F_Lcd_reverse_block
			CALL F_Lcd_reverse
        	R1 = 00000001b
       		[P_IOD_Data] = R1			//结束后输出高
       		CALL F_Delay1s
       		
	
       		R1 = 00000000b
       		[P_IOD_Data] = R1			//开始前输出低
			CALL F_Lcd_clear
        	R1 = 00000001b
       		[P_IOD_Data] = R1			//结束后输出高
			
       		R1 = 00000000b
       		[P_IOD_Data] = R1			//开始前输出低
			R4	= TABLE1;
			CALL  F_Lcd_bitmap
        	R1 = 00000001b
       		[P_IOD_Data] = R1			//结束后输出高
       		CALL F_Delay1s
       		
       		R1 = 00000000b
       		[P_IOD_Data] = R1			//开始前输出低
//			CALL F_Lcd_reverse_block
			CALL F_Lcd_reverse
        	R1 = 00000001b
       		[P_IOD_Data] = R1			//结束后输出高
       		CALL F_Delay1s
 
// 			CALL	W_DATE0 			//清全屏
//			CALL F_Delay1s
         	R1 = 00000000b
       		[P_IOD_Data] = R1			//开始前输出低     		
       		CALL	F_LINE_T
       		R1 = 00000001b
       		[P_IOD_Data] = R1			//结束后输出高
       		CALL F_Delay1s
       		
			GOTO	LCDTEST;
//设置页地址
SET_P:		PUSH 	R1,R5 TO [SP];
			R4	= R1;
			//
			R1	&=0x0010;
			R3	= R1 LSR 4;
			R1	= 0x0A70;
			R1	|= R3;
			[P_Lcd501Ctrl]	= R1;
			//
			R4	&=0x000F;
			R3	= 0x0A60;
			R3	|=R4;
			[P_Lcd501Ctrl]	= R3;
			POP	R1,R5 FROM [SP];
			RETF
			
//送列地址
SET_C:		PUSH R4 TO [SP];						
			//送CA_LSB
			R4	= R2 & 0x000F;
			R4	|=C_WriteCommand;
			[P_Lcd501Ctrl]	= R4;
			//送CA_MSB
			R4	= R2 & 0x00F0;
			R4	= R4 LSR 4;
			R4	|=0x0A10;
			[P_Lcd501Ctrl]	= R4;	
			POP R4 FROM [SP];		
			RETF;
						
//设置页地址和列地址。
//入口:R1为页地址,R2为列地址			
SET_P_C:	PUSH R1,R5 TO [SP];
			R4	= R1;
//			R3	=0x0000;
//			[P_Lcd501BdySel]	= R3;
			//送PA_MSB
			R1	&=0x0010;
			R3	=R1 LSR 4;
			R1	= 0x0A70;
			R1	|= R3;
			[P_Lcd501Ctrl]	= R1;
			//送PA_LSB
			R4	&=0x000F;
			R3	= 0x0A60;
			R3	|=R4;
			[P_Lcd501Ctrl]	= R3;
			//送CA_LSB
			R4	= R2;
			R3	= C_WriteCommand;
			R2	&=0x000F;
			R3	|=R2;
			[P_Lcd501Ctrl]	= R3;
			//送CA_MSB
			R3	= 0x0A10;
			R4	&=0x00F0;
			R4	= R4 LSR 4;
			R3	|=R4;
			[P_Lcd501Ctrl]	= R3;	
			POP R1,R5 FROM [SP];		
			RETF;

//送显示数据
//入口:R1			
SEND_DATA:	
			R2	= C_WriteData;
			R2	|= R1;
			[P_Lcd501Ctrl]	= R1;
			RETF;

//读当前地址数据
//入口:R1			
RE_DIS_DATA:	R1	= C_ReadData;
				[P_Lcd501Ctrl]	= R1;
				CALL DELAYN
				R1	= C_ReadData;
				[P_Lcd501Ctrl]	= R1;
				CALL DELAYN
				R1	= [P_Lcd501Data];
				RETF;
				
// 全部点亮
ALL_ON_SCR:		R1	= 0x0AA5;
				[P_Lcd501Ctrl]	= R1;
				RETF;
				
//显示图片
//				
DISPLAY_BMP:	PUSH 	R1,R5 TO [SP];
				R5	= 8;
?_SHADE_LOOP:	R4	= 4;
				R1	= 0;
				R2	= 0;				
?_FOUR_LEVEL:	R3	= 0;
				[INCRE]	=R3;				
?_PAGE_LOOP:	CALL SET_P_C
				R3	= 128;
				PUSH R1,R5 TO [SP];
?_W_BMP:		R1	= 0;
				R1	+=[INCRE];
				CALL W_DATA
				R3	-=1;
				JNZ	?_W_BMP;
				R2	= [INCRE];
				R2	+=63;
				[INCRE]	=R2;
				POP R1,R5 FROM [SP];
				R1	+=1;			
				R2	=R1-31;
				JNZ	?_PAGE_LOOP;
				R4	-=1;
				JNZ	?_FOUR_LEVEL;
				R5	-=1;
				JNZ	?_SHADE_LOOP;
				POP R1,R5 FROM [SP];
				RETF
//clear screen
F_Lcd_clear:
				PUSH	R1,R5 TO [SP];
				R1	= 0;
				R2	= 0;
				CALL	SET_P_C
				R3	= 128*128/4;
?_Lcd_clear_LOOP:
				R1	= C_WriteData;
				[P_Lcd501Ctrl]	= R1;	
				R3	-=1;
				JNZ	?_Lcd_clear_LOOP;
				POP	R1,R5 FROM	[SP];
				RETF
//read data one page, reverse and write
F_Lcd_reverse_block:
				PUSH	R1,R5 TO [SP];
				R1	= 0;
				R2	= 0;
?_Lcd_reverse_BLOOP:
				R4 = DIS_BUF
				CALL	SET_P_C
				R3	= C_ReadData;
				[P_Lcd501Ctrl]	= R3;
				CALL DELAYN					//先空读一下
?_Lcd_reverse_b0:
				R3	= C_ReadData;
				[P_Lcd501Ctrl]	= R3;
				CALL DELAYN
				R3	= [P_Lcd501Data];
//				CALL	SET_P_C
				R3  ^=0xFFFF;				//将取出来的数按位取反
				R3 &= 0x00FF
				[R4++] = R3
				R2 +=1
				CMP R2,128
				JB ?_Lcd_reverse_b0
				R2 = 0
				R4 = DIS_BUF
				CALL	SET_P_C
?_Lcd_reverse_b1:
				R3 = [R4++]
				R3	|= C_WriteData;
				[P_Lcd501Ctrl]	= R3
				R2 +=1
				CMP R2,128
				JB ?_Lcd_reverse_b1
				R2 = 0
				R1 += 1
				CMP R1,32
				JB ?_Lcd_reverse_BLOOP
				POP	R1,R5 FROM	[SP];
				RETF
//read data reverse and write
F_Lcd_reverse:
				PUSH	R1,R5 TO [SP];
				R1	= 0;
				R2	= 0;
?_Lcd_reverse_LOOP:
				CALL	SET_P

⌨️ 快捷键说明

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