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

📄 lcd.asm

📁 液晶屏启动程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
//**********************************************************//
//* Project Name: OC6678
//* Program Name: lcd.ASM
//* Applied Body: SPT6608A + splc501c + 132*65pixel lcd
//* Description: LCD control + display
//* Compile: Sunplus u'nSP IDE v1.13.3
//* programmer:  lzb/cher
//* Current Version: 1.00
//* Write Date: 2005/5/9
//**********************************************************//

.include	SPT6608.inc
.include	lcd.h
.include	SPT6608.h

.const 	NEWLCD = 1

.external	F_Delay96ms,F_Delay1s,F_Delay10ms
.external	F_Div//,F_Delay_BitMap

.external	LcdBuffer,T_GuageIcon
.external	R_LcdGray
//缓冲区名        大小        已使用    起始地址
//LcdBuffer    	  62         62        BihuaArea+137

.define		R_TempBuffer	LcdBuffer+16		//定义一个长度为16的中间缓冲区
.define		mask			LcdBuffer+32		//定义一个屏蔽码变量(模块内有效)
.define		x				LcdBuffer+33		//定义为列值
.define		y				LcdBuffer+34		//定义为行值
.define		Length			LcdBuffer+35		//写入汉字个数变量
.define		k				LcdBuffer+36		//定义为行内有效位偏移量
.define		x1				LcdBuffer+37		//坐标点的列向最大值
.define		y1				LcdBuffer+38		//位图的行向最大值
.define		xsize			LcdBuffer+39		//位图的列向宽度
.define		ysize			LcdBuffer+40		//位图的行向宽度
.define		Bitaddr			LcdBuffer+41		//位图的地址
.define		x2				LcdBuffer+42		//矩形终止坐标
.define		y2				LcdBuffer+43		//矩形终止坐标
.define		x0				LcdBuffer+44		//矩形起始坐标
.define		y0				LcdBuffer+45		//矩形起始坐标
.define     dx				LcdBuffer+46		//画轨迹 dx = ABS(x1-x)
.define     dy				LcdBuffer+47		//画轨迹 dy = ABs(y1-y)
.define     stepx			LcdBuffer+48		//画轨迹x方向步进
.define     stepy			LcdBuffer+49		//画轨迹y方向步进
.define     chanxy			LcdBuffer+50		//画轨迹 xy是否与换标志  1==与换
.define		e				LcdBuffer+51		//画轨迹时的判断标志字
.define		R1save			LcdBuffer+52		//位图初始地址寄存器
.define		maskcode		LcdBuffer+53		//定义为maskcode码  (占用9个字地址)

.code
//----------------------------------------------------------//
//显示进度条
//R1-焦点;R2-总条数
//总共有98个点,每项的长度是98/R2;起始显示位置是
//----------------------------------------------------------//
.public	F_ShowGuageIcon
F_ShowGuageIcon:
//				CMP R2,C_Menu_PageItem
//				JB ?_ShowGuageIcon_End		//一屏能显示下不处理
				PUSH R1,R2 TO [SP]
				R1 = LCD_DRAW_NORMAL
				[R_LcdStatus] = R1
				R1 = 0x009A
				[R_LcdStartDot] = R1
				R1 = 0x68A0
				[R_LcdEndDot] = R1
				R1 = T_GuageIcon
				R2 = 0
				CALL F_Lcd_BitMap
				POP R1,R2 FROM [SP]
				PUSH R1,R4 TO [SP]
				R3 = R1
				R4 = R2
				R1 = 98
				CALL F_Div					//R1-每项的宽度
				R1 = R1 LSL 4
				R1 = R1 LSL 4
				[R_LcdEndDot] = R1
				R2= R4
				R4 = 98
				MR = R4*R3
				R1 = R3
				CALL F_Div
				R1 += 3
				R1 = R1 LSL 4
				R1 = R1 LSL 4
				R1 += 0x9C
				[R_LcdStartDot] = R1
				R1 += 0x03
				R2 = [R_LcdEndDot]
				R1 += R2
				[R_LcdEndDot] = R1			//R2-起始显示位置
				CALL F_Lcd_Block
				POP R1,R4 FROM [SP]
?_ShowGuageIcon_End:
				RETF
//----------------------------------------------------------//
//* 功能 : 打开显示屏
//* 入口 : 无
//* 出口 : 无
//* 影响寄存器:r1
//* 说明 : 开机LOGO显示函数调用,在初始化时关闭显示屏,开始LOGO时打开显示,以避免开始乱点显示 
//----------------------------------------------------------//
.public		F_Lcd_On            
F_Lcd_On:
			R1 = LCD_DISPLAY_ENABLE|0x01
			CALL	__LcdCmdWrite		//写入显示打开命令	
			RETF 
//----------------------------------------------------------//
//* 功能 : 清屏并清显示缓冲区
//* 入口 : 无
//* 出口 : 无
//* 影响寄存器:无
//----------------------------------------------------------//
.public		F_Lcd_Clear
F_Lcd_Clear:
				CALL F_Lcd_ClrScreen               	 //清屏,写全0至LCD。
				CALL F_Lcd_ClrBuffer                 //清缓冲区
				RETF
//----------------------------------------//
//F_ShowStatusIcon专用函数:移位写入一个字节
//----------------------------------------//
F_LcdDataWrite:
				R2 = R2 LSR 1			//0x8000
				R1 = 0				
				R1 = R1 ROL 1
				R1 | = LCD_WR_DATA			//写入数据与写入命令或
				[P_Lcd501Ctrl] = R1				//显示数据写入命令
				RETF
//----------------------------------------//
//|Filename : F_Set_LCD_Column_Addr
//|Function : Set the LCD column address
//|Input    : Page No. R1
//|Output   : None
//|Destroy  : R1,R2
//----------------------------------------//
F_SetColumnAddr:
				PUSH R1 TO [sp]			//暂存列值
				R1 = R1 LSR	4			//取列值的高4位
				R1 |= LCD_COLUMN_MSB
				CALL __LcdCmdWrite		//写入列值高4位
				POP R1 FROM [sp]		//取列值
				R1 &= 0x0F				//取列值低4位
				R1 |= LCD_COLUMN_LSB
				CALL __LcdCmdWrite		//写入列值低4位
				RETF
//----------------------------------------------------------//
//* 功能 : LCD亮度调节
//* 入口 : R1-级别: 0-40(不可大于40)
//* 出口 : 无
//* 影响寄存器 : 无
//* 缓冲区使用 : 显示缓冲区
//----------------------------------------------------------//
.public		F_Lcd_Light
F_Lcd_Light:
 			PUSH	R1,R2 to [SP]
			R2 = R1						//首先保存亮度值
			R1 = LCD_VBIAS_PTR		//设置模式
			CALL	__LcdCmdWrite				
			R1 = R2 & 0x3F				//亮度级别只有低4位有效
			R1 = R1 LSL 2
 R1 = 111                            //add for test 2007.8.24			
			R1 |= LCD_VBIAS_DATA		//设置亮度调节寄存器
			CALL	__LcdCmdWrite
			CALL F_Delay10ms								
			POP		R1,R2 FROM [SP]	
			RETF
//----------------------------------------------------------//
//名称:F_Lcd_Init				
//功能:LCD初始化,打开LCD,设置操作模式、初始缓存清零
//入口:无
//出口:R1 1:成功  -1:失败
//影响寄存器:R1 
//----------------------------------------------------------//
.public                F_Lcd_Init
F_Lcd_Init:
			PUSH       R2 TO [SP]
			//定义接口类型并且复位LCD
			R1 =LCD_MCU
			[P_Lcd501BdySel] = R1			//定义MCU类型8080
			R1 = LCD_RESET 					//lcd reset
			CALL         __LcdCmdWrite
			CALL F_Delay96ms
			
			//显示系统初始化
			R1    = LCD_BIAS_Rat|0x02			//设置BIAS Ratio	bit1,bit0: 5-12
			CALL         __LcdCmdWrite
			R1    = LCD_SCROLL_LSB|0x0			//设置滚动行数低位bit3-bit0
			CALL         __LcdCmdWrite
			R1	  =	LCD_SCROLL_MSB|0x0			//设置滚动行数高位bit2-bit0
			CALL         __LcdCmdWrite
			R1 	  = LCD_PART_DISPLAY|0x0		//设置局部显示控制bit1-bit0 //00 禁止、10方式一、11方式二
			CALL         __LcdCmdWrite
			R1    = LCD_LINE_RATE|0x03			//设置行频比例bit1-bit0. 00-11 :12.1-16.6 KIps
			CALL         __LcdCmdWrite
			R1    = LCD_INVERSE_DISPLAY|0x01	//设置反显bit0。 0:off    1:on
			CALL         __LcdCmdWrite        
			R1    = LCD_MAP_CTRL|0x06			//设置镜像控制bit2-bit0
												//bit0 控制局部显示时,(0~2*FL)区域是否显示。 1,显示。
												//bit1 列镜像。重写RAM后才会生效。 1,镜像。
												//bit2 行镜像。	送入命令立即生效。 1,镜像。
			CALL         __LcdCmdWrite
			R1    = LCD_COM_END					//设置扫描行边界。双字节命令
			CALL         __LcdCmdWrite		
			R1    = LCD_COM_END_DATA|0x7F		//送入扫描行边界值bit7-bit0( 7FH : 127 )
			CALL         __LcdCmdWrite
			R1    = LCD_START_COM				//设置显示起始行。双字节命令
			CALL         __LcdCmdWrite
			R1    = LCD_START_COM_DATA|0x00		//送入显示起始行值bit7-bit0
			CALL         __LcdCmdWrite
			R1    = LCD_DISPLAY_END				//设置显示行边界。双字节命令
			CALL         __LcdCmdWrite
			R1    = LCD_DISPLAY_END_DATA|0x69	//送入显示行边界数据bit7-bit0( 69H : 105 )
			CALL         __LcdCmdWrite
			R1    = LCD_WINDOW_ENABLE|0x0		//设置窗口显示使能bit0。 0:off    1:on
			CALL         __LcdCmdWrite
			//电源初始化
			R1    = LCD_TC_SET|0x02				//设置温度补偿系数 bit1-bit0 //-0.05%~-0.2%
			CALL         __LcdCmdWrite
			R1    = LCD_PUMP_CTRL|0x03			//设置升压控制bit1-bit0	//00 EXTERNAL VLCD
												//01-11 Internal 6-8VLCD
			CALL         __LcdCmdWrite
			CALL F_Delay10ms
			R1    = LCD_LOAD_CAP|0x02 			//设置LCD负载电容 bit1-bit0	//0~38nF   设置01
			CALL         __LcdCmdWrite
			CALL F_Delay10ms
			R1    = LCD_VBIAS_PTR				//设置偏压分压器,双字节指令	//	调节亮度
			CALL         __LcdCmdWrite
			R1    = LCD_VBIAS_DATA|0x75			//分压器数据bit7-bit0 :0~255
			CALL         __LcdCmdWrite
			CALL F_Delay10ms
			
			//显示模式初始化
			R1    = LCD_COLUMN_LSB|0x0			//设置列值低位bit3-bit0
			CALL         __LcdCmdWrite
			R1    = LCD_COLUMN_MSB|0x00          //设置列值高位bit7-bit4
			CALL         __LcdCmdWrite
			R1    = LCD_PAGE_ADDR|0x0            //设置页地址
			CALL         __LcdCmdWrite
			R1    = LCD_RAM_CTRL|0x01      		//设置RAM控制。
												//bit2  page address auto inc direction 0/1 : +/-1
												//bit1  0,列值自增,直到列值增到边界,页值加1
												//		1,页值自增,直到页值增到边界,列值加1
												//bit0  0,列值或者页值自增到边界时,停止
												//		1,列值或者页值自增到边界时,自动进入下一行或列
			CALL         __LcdCmdWrite
			
			R1    = LCD_GRAY_SHADE|0x01			//设置01和10间灰度差bit1-bit0。 00-11 : 24%-40%
			CALL         __LcdCmdWrite          
			R1    = LCD_UPDATE_WRITE|0x01  		//设置读修改写bit0。 0,结束。 1,开启
			CALL         __LcdCmdWrite
	        R1	= 0xFFFF
		    [R_LcdGray] = R1		
			R2 = 1000
?_Lcd_WaitInit:
			R2 -= 1
			CMP          R2,C_Null
			JE              ?_Lcd_Init_Fail
			CALL         __LcdStatus
			CMP          R1,0x20
			JNE           ?_Lcd_WaitInit
			R1 = C_True                                 //返回成功
			JMP           ?_Lcd_Init_End
?_Lcd_Init_Fail:
			R1 =C_False                                //返回失败
?_Lcd_Init_End:
			R1 = LCD_DISPLAY_ENABLE|0x01				//设置使能显示bit0。  0:off	1:on
			CALL         __LcdCmdWrite                 //写入显示打开命令
			CALL F_Delay96ms
			POP          R2 FROM [SP]
			RETF

//===========================================================//

//.public		F_Lcd_Init
//F_Lcd_Init:
//				PUSH	R2 TO [SP]
//				R1 =LCD_MCU
//				[P_Lcd501BdySel] = R1		//定义MCU类型
//				R1 = LCD_RESET				//lcd reset
//				CALL	__LcdCmdWrite		
//.if (NEWLCD)
//				R1 = LCD_BIAS_7				//1/9 bias				
//.else
//				R1 = LCD_BIAS_9				//1/9 bias				
//.endif
//				CALL	__LcdCmdWrite		
//				R1 = LCD_ADC_NOR			//seg 正常输出
//				CALL	__LcdCmdWrite
//				R1 = LCD_COM_REV			//COM反转输出
//				CALL	__LcdCmdWrite
//				R1 = LCD_VOL_REG | 5		//设置内部电阻率D[0:2]
//				CALL	__LcdCmdWrite
//				R1 = LCD_EV_SET				//设置电子音量 
//				CALL	__LcdCmdWrite
//.if (NEWLCD)
//				R1 = LCD_EV_DATA | 50					
//				CALL	__LcdCmdWrite
//				R1	=LCD_BOTR_SET			//设置调压器比率
//				CALL	__LcdCmdWrite
//				R1	=LCD_BOTR_DATA | 3
//				CALL	__LcdCmdWrite
//.else
//				R1 = LCD_EV_DATA | 4					
//				CALL	__LcdCmdWrite
//.endif
//				R1 = LCD_POWER_CTRL | 4		//内部电源电路全部打开
//				CALL	__LcdCmdWrite
//				CALL F_Delay96ms
//				R1 = LCD_POWER_CTRL | 6
//				CALL	__LcdCmdWrite
//				CALL F_Delay96ms
//				R1 = LCD_POWER_CTRL | 7
//				CALL	__LcdCmdWrite
//				CALL F_Delay96ms
//				R1 = LCD_DISP_OFF			//关LCD
//				CALL	__LcdCmdWrite
//				R1 = LCD_ALL_OFF			//禁止全部点亮
//				CALL	__LcdCmdWrite
//				R1 = LCD_DRIVE_MOD			//设置驱动能力次高
//				CALL	__LcdCmdWrite
//				R1 = LCD_DRIVE_DATA		
//				CALL	__LcdCmdWrite
//				R1 = LCD_STATIC_OFF			//禁止闪烁
//				CALL	__LcdCmdWrite
//				R1 = LCD_DISP_NOR			//正常显示
//				CALL	__LcdCmdWrite
//				R1 = LCD_PAGE_BLINK			//所有页不闪烁
//				CALL	__LcdCmdWrite
//				R1 = LCD_PAGE_DATA			
//				CALL	__LcdCmdWrite
//				R1 = LCD_LINE_SET | 32			//显示起始线为0
//				CALL	__LcdCmdWrite
//				R1 = LCD_PAGE_SET			//页地址为0
//				CALL	__LcdCmdWrite
//				R1 = LCD_COLUMN_UP			//线地址为0
//				CALL	__LcdCmdWrite
//				R1 = LCD_COLUMN_LOW
//				CALL	__LcdCmdWrite
//				R1 = LCD_RMW_OFF			//取消"读改写"模式
//				CALL	__LcdCmdWrite
//				R2 = 1000
//?_Lcd_WaitInit:
//				R2 -= 1
//				CMP		R2,C_Null
//				JE		?_Lcd_Init_Fail
//				CALL	__LcdStatus
//				CMP		R1,0x60
//				JNE		?_Lcd_WaitInit
//				R1 = C_True				//返回成功
//				JMP		?_Lcd_Init_End
//?_Lcd_Init_Fail:
//				R1 =C_False				//返回失败
//?_Lcd_Init_End:
//				R1 = LCD_DISP_ON
//				CALL	__LcdCmdWrite		//写入显示打开命令
//				POP		R2 FROM [SP]
//				RETF
//----------------------------------------------------------//
//名称:F_LCD_TEST
//功能:做液晶测试
//入口:无
//出口:无
//影响寄存器:无
//----------------------------------------------------------//
//.public		F_Lcd_Test
//F_Lcd_Test:
////				PUSH	R1,R3 TO [SP]
//				//LCD全部点亮							
//				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,C_LCD_PAGE+1		//判断是否写完8页
//				JB		?_Lcd_Test_FullSreen2																
//				CALL 	F_Delay1s			//延时1S
//				CALL	F_Lcd_ClrScreen		//液晶擦除
////做线垂直移动测试
//				R1 = 0x0001
//				R2 = 0x4001

⌨️ 快捷键说明

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