📄 lcd.asm
字号:
//**********************************************************//
//* 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 + -