📄 lcd.c
字号:
/*************************************************************************
版权所有:优特电力科技股份有限公司
版本号: 1.00
文件名: LCD.C
生成日期:2002.10.22
作者: YSH
功能说明:本模块主要是用于LCD液晶驱动显示模块
与所属工程文件的关系:
其它说明:USE LANGUAGE C
修改记录:无
记录1: 无
修改者: 无
修改日期:无
修改内容:无
修改原因:无
*************************************************************************/
#define __LCD_EXT
#include "includes.h"
#define APPEN_NEWFONT_START 0x145710 //追加字库的起始地址
#define Logo1 APPEN_NEWFONT_START
#define Logo2 Logo1 + 2560 //2560为Logo1的字节数
#define Logo3 Logo2 + 640
#define Logo4 Logo3 + 640
#define LQI5 Logo4 + 640
#define LQI4 LQI5 + 32
#define LQI3 LQI4 + 32
#define LQI2 LQI3 + 32
#define LQI1 LQI2 + 32
#define LQI0 LQI1 + 32
#define play LQI0 + 32
#define pause play + 32
#define stop pause + 32
#define play_new stop + 32
#define pause_new play_new + 32
#define stop_new pause_new + 32
#define charge1 stop_new + 32
#define charge2 charge1 + 32
#define EnterKey charge2 + 32
#define BackKey EnterKey + 32
#define jun BackKey + 32
#define ding jun + 32
#define BatteryStatus ding + 32
#define LineChar BatteryStatus + 52
//********追加字库起始地址为 0x145710 ,字库最终flash存储地址为 0x146b0f ***********//
#define BatteryAddress 0x146b50 //增加的电池新图标flash起始地址,最终的字库结束地址为 0x146dbf
#define ArrowAddress 0x146dc0 //增加了左右箭头图标,这为该图标的起始地址
#define Icon_Address 0x146e80 //增加了CDMA、UT-NET、IRDA左上角图标
#define XBYTE ((volatile u8 *)0x0)
#define WR_C15E05 0x66000000 //写控制命令地址 A0=0
#define WR_D15E05 0x66000001 //写显示数据及指令参数地址 A0=1;
#define DISPON 0xaf //开显示命令设置(1)
#define DISPOFF 0xae //关显示命令设置
#define DISPOFFMODEH 0xbf //关显示的电平接VC命令设置(2)
#define DISPOFFMODEL 0xbe //关显示的电平接VSS命令设置
#define DISPNORMAL 0xa6 //正常显示命令设置(3)
#define DISPREVERSE 0xa7 //反向显示命令设置
#define DISPALLNOR 0xa4 //正常显示数据点命令设置(4)
#define DISPALLON 0xa5 //点亮所有点命令设置
#define SETCOMSTATUSNOR 0xc4 //从COM0到COM131命令设置(5)
#define SETCOMSTATUSREV 0xc5 //从COM131到COM0命令设置
#define SETDISPLINE 0x8a //显示起始行命令设置(6)
#define DISPLINEDATA1 0x00 //起始行为0行数据参数,A0 = 1
#define DISPLINEDATA2 0x00 //起始行为0行数据参数,A0 = 1
#define SETDISPPAGE 0xb1 //显示起始页命令设置(7)
#define DISPPAGEDATA 0x00 //起始页为0行数据参数,A0 = 1
#define SETDISPCOL 0x13 //显示起始列命令设置(8)
#define DISPCOLDATA 0x00 //起始列为0行数据参数,A0 = 1
#define DISPDATAWRITE 0x1d //显示数据写入命令设置(9)
#define DISPDATAREAD 0x1c //显示数据读出命令设置(10)
#define SETCOLDIR 0x84 //从列方向自动增加命令设置(11)
#define SETPAGEDIR 0x85 //从页方向自动增加命令设置
#define SETCOLDIRNOR 0xa0 //列方向正向自动增加命令设置(12)
#define SETCOLDIRREV 0xa1 //列方向反向自动增加命令设置
#define SETN_LINEREV 0x36 //n-line 反向驱动命令设置(13)
#define N_LINECOUNT 0x06 //DEMO程序,A0 = 1
#define SETN_LINEON 0xe5 //开启n-line 反向驱动命令设置(14)
#define SETN_LINEOFF 0xe4 //关闭n-line 反向驱动命令设置
#define SETDISPMODE 0x66 //显示模式命令设置(4级灰度或Bin)(15)
#define DISPMODEGRAY 0x00 //4级灰度显示参数,A0 = 1
#define DISPMODEBIN 0x01 //Bin显示参数,A0 = 1
#define SETGRAYLEVEL 0x39 //灰度等级命令设置(16)
#define GRAYLEVELDATA 0x66 //灰度等级数据选择,A0 = 1
#define SETAREASCROLL 0x40 //屏幕局部滚动设置(17)
#define SCROLLMODEDATA 0x01 //向上滚动
#define SCROLLSTARTLINE 0x00 //滚动起始行为0行数据参数,A0 = 1
#define SCROLLENDLINE1 0x00 //滚动结束行为0行数据参数,A0 = 1
#define SCROLLENDLINE2 0x00 //滚动结束行为0行数据参数,A0 = 1
#define SETDUTY 0x6d //duty模式命令设置(18)
#define DUTYDATA 0x20 //1/128 duty模式,A0 = 1
#define DUTYSTART 0x01 //!!从COM1开始,A0 = 1
#define DISPDATARDWR 0xe0 //显示数据的读改写命令设置(21)
#define DISPDATAEND 0xee //显示数据的读改写结束命令设置(22)
#define SETOSCOFF 0xaa //关闭晶振命令设置(23)
#define SETOSCON 0xab //开启晶振命令设置
#define SETOSCFREQ 0x5f //晶振频率命令设置(24)
#define OSCFREQDATA 0x0b //晶振频率=76hz,A0 = 1
#define SETPOWERCTRL 0x25 //电源控制命令设置(25)
#define POWERCTRLVC 0x1e //电源上电关闭LCDV, A0 = 1
#define POWERCTRLLCDV 0x1f //延时100ms后开启LCDV, A0 = 1
#define SETVCVOLT 0x2b //LCD电压Vc选择命令设置(27)
#define VCVOLTDATA 0x03 //LCD电压Vc选择值3.54-7.0v,A0 = 1
#define SETCONTRAST 0x81 //对比度命令设置 (28)
#define CONTRASTSTATE 0x33 //对比度数值在0-127,A0 =1
#define SETDISCHAROFF 0xea //关闭放电命令设置(29)
#define SETDISCHARON 0xeb //开启放电命令设置
#define POWERSAVEOFF 0xa8 //关闭节电模式命令设置(30)
#define POWERSAVEON 0xa9 //开启节电模式命令设置
#define SETNOP 0xe3 //空操作命令设置(34)
#define CSIOP 0xa0000
#define PSD_PORTE_OUT_DATA CSIOP+0x34
//从中间空白区(34624+OFFSETFONT)开始,依次留2560个字节给完整的logo
//然后从(37184+OFFSETFONT)开始存放15幅局部图片,每幅占104个字节大小
#define PICTUREDATA OFFSETFONT+37184L
//系统要求留出的空间,即字库从0x100000开始
#define OFFSETFONT 0x100000
//写LCD数据参数
void S1D15E05_Data(u8 data);
//写LCD命令参数
void S1D15E05_Command(u8 command);
//LCD液晶显示坐标定位
void LcdGotoxy(u8 Regx,u8 Regy);
//存放LCD的160*128点阵数据,共2560字节的SRAM缓冲区
static u8 Temp_LcdBuffer[2560];
//存放LCD的160*128点阵数据,在Gray_Scale状态下,共2560*2字节的SRAM缓冲区
static u8 Temp_LcdBuffer_Gray[5120];
//从0x8a00地址开始,存放从DataFlash中取出的每个字符的点阵数据公共区
static u8 DispDotBuf[50] ;
//从0x8a80地址开始,存放DispBCDBuf中待显示的BCD数字字符串
static char DispBCDBuf[20] ;
//存放动画数据的缓冲区
static u8 PicBuf[2560] ;
//光标闪动的标记
static u8 CursorBit;
//记录显示完字符串后的坐标值
static u8 PositionX,PositionY;
//整型数据的结构
typedef union
{
u8 DataAdd_D[2]; //字节顺序由低到高
u16 DataAdd_I; //整型数据,如为0x5678
}Un_DataAdd_I;
static Un_DataAdd_I GrayVal;
/**************************************************************************
函数名称: void S1D15E05_Data(u8 data)
函数版本: 1.00
作者: ysh
创建日期: 2002.10.25
函数功能说明:写LCD数据参数
输入参数:LCD数据参数,ttt
输出参数:无
返回值: 无
函数扇出清单:空
函数扇入清单:空
函数体中用到的公共资源:空
更新后的上述资源:空
***************************************************************************/
void S1D15E05_Data(u8 data)
{
XBYTE[WR_D15E05] = data;
}
/**************************************************************************
函数名称: void S1D15E05_Command(u8 command)
函数版本: 1.00
作者: ysh
创建日期: 2002.10.25
函数功能说明:写LCD命令参数
输入参数:LCD命令参数,command
输出参数:无
返回值: 无
函数扇出清单:空
函数扇入清单:空
函数体中用到的公共资源:空
更新后的上述资源:空
***************************************************************************/
void S1D15E05_Command(u8 command)
{
XBYTE[WR_C15E05] = command;
}
/**************************************************************************
函数名称: void LcdLuminance(u8 LcdLum)
函数版本: 1.00
作者: ysh
创建日期: 2002.10.25
函数功能说明:LCD对比度设置
输入参数:LcdLum为液晶对比度等级,取值范围在0-7,共8个等级
输出参数:无
返回值: 无
函数扇出清单:空
函数扇入清单:空
函数体中用到的公共资源:空
更新后的上述资源:空
***************************************************************************/
void LcdLuminance(u8 LcdLum)
{
S1D15E05_Command(SETCONTRAST);
S1D15E05_Data(0x2f+2*LcdLum); //对比度值在0x2f-0x3f
}
/**************************************************************************
函数名称: void LcdInit(void)
函数版本: 1.00
作者: ysh
创建日期: 2002.10.25
函数功能说明:初始化液晶模块,控制IC是S1D15E05
输入参数:无
输出参数:无
返回值: 无
函数扇出清单:空
函数扇入清单:空
函数体中用到的公共资源:空
更新后的上述资源:空
***************************************************************************/
void LcdInit(void)
{
u8 TempVal;
S1D15E05_Command(SETCOLDIRNOR); //列方向正向自动增加命令设置(12)
delay_ms(5);
S1D15E05_Command(SETCOMSTATUSNOR); //从COM0到COM131命令设置(5)
delay_ms(5);
S1D15E05_Command(DISPNORMAL); //正常显示命令设置(3)
delay_ms(5);
S1D15E05_Command(DISPALLNOR); //正常点亮数据点命令设置(4)
delay_ms(5);
S1D15E05_Command(SETDUTY); //duty模式命令设置(18)
S1D15E05_Data(DUTYDATA); //1/128 duty模式,A0 = 1
S1D15E05_Data(DUTYSTART); //从COM0开始,A0 = 1
delay_ms(5);
S1D15E05_Command(SETVCVOLT); //LCD电压Vc选择命令设置(27)
S1D15E05_Data(VCVOLTDATA); //LCD电压Vc选择值3.54-7.0v,A0 = 1
delay_ms(5);
TempVal = ReadLcdContrastVal();
if(TempVal>0x08)
{
TempVal = 0x03;
SaveLcdContrastVal(TempVal);
}
LcdLuminance(TempVal);
delay_ms(3);
/*********************************/
S1D15E05_Command(DISPOFFMODEH); //关显示的电平接VC命令设置(2)
delay_ms(5);
//added by ysh. 2003.02.17
S1D15E05_Command(0x4e); //温度梯度设置 (31)
S1D15E05_Data(0x07);
S1D15E05_Command(SETDISPMODE); //显示模式命令设置(4级灰度或Bin)(15)
S1D15E05_Data(DISPMODEBIN); //Bin显示参数,A0 = 1
delay_ms(5);
S1D15E05_Command(SETDISPLINE); //显示起始行命令设置(6)
S1D15E05_Data(DISPLINEDATA1); //起始行为0行数据参数,A0 = 1
S1D15E05_Data(DISPLINEDATA2);
delay_ms(5);
S1D15E05_Command(SETDISPCOL); //显示起始列命令设置(8)
S1D15E05_Data(DISPCOLDATA); //起始列为0行数据参数,A0 = 1
delay_ms(5);
S1D15E05_Command(SETCOLDIR); //从列方向自动增加命令设置(11)
delay_ms(5);
S1D15E05_Command(SETDISCHAROFF); //关闭放电命令设置(29)
delay_ms(5);
S1D15E05_Command(POWERSAVEOFF); //关闭节电模式命令设置(30)
delay_ms(5);
S1D15E05_Command(SETGRAYLEVEL); //灰度等级命令设置(16)
S1D15E05_Data(0x11);
delay_ms(5);
S1D15E05_Command(SETOSCFREQ); //晶振频率命令设置(24)
S1D15E05_Data(OSCFREQDATA); //晶振频率=76hz,A0 = 1
delay_ms(5);
S1D15E05_Command(SETOSCON); //开启晶振命令设置(23)
delay_ms(5);
S1D15E05_Command(SETPOWERCTRL); //电源控制命令设置(25)
S1D15E05_Data(POWERCTRLVC); //电源上电关闭LCDV, A0 = 1
delay_ms(150);
S1D15E05_Command(SETPOWERCTRL); //电源控制命令设置(25)
S1D15E05_Data(POWERCTRLLCDV); //延时100ms后开启LCDV, A0 = 1
delay_ms(5);
S1D15E05_Command(DISPON); //开显示命令设置(1)
delay_ms(10);
LcdClrscr();
OpenLcd();
}
/**************************************************************************
函数名称: void LcdBackLight(u8 IsOn)
函数版本: 1.00
作者: ysh
创建日期: 2002.10.25
函数功能说明:LCD液晶的背光控制
输入参数:IsOn为液晶背光的开关控制参数,0x0为关,0x1为开
输出参数:无
返回值: 无
函数扇出清单:空
函数扇入清单:空
函数体中用到的公共资源:空
更新后的上述资源:空
***************************************************************************/
void LcdBackLight(u8 IsOn)
{
u8 ReadByte;
ReadByte = XBYTE[PSD_PORTE_OUT_DATA];
if(IsOn==LGON)
{
XBYTE[PSD_PORTE_OUT_DATA] = ReadByte|0x02; //使PE1(EL)输出高
}
else
{
XBYTE[PSD_PORTE_OUT_DATA] = ReadByte&0xfd; //使PE1(EL)输出低
}
}
/**************************************************************************
函数名称: void LcdGotoxy(u8 Regx,u8 Regy)
函数版本: 1.00
作者: ysh
创建日期: 2002.10.25
函数功能说明:LCD液晶显示坐标定位
输入参数:坐标Regy取值在0-15,Regx在0-159
输出参数:无
返回值: 无
函数扇出清单:空
函数扇入清单:空
函数体中用到的公共资源:空
更新后的上述资源:空
***************************************************************************/
void LcdGotoxy(u8 Regx,u8 Regy)
{
S1D15E05_Command(SETDISPCOL); //显示起始列命令设置(8)
S1D15E05_Data(Regx); //起始列为0行数据参数,A0 = 1
S1D15E05_Command(SETDISPPAGE); //显示起始页命令设置(7)
S1D15E05_Data(Regy); //起始页为0行数据参数,A0 = 1
}
/**************************************************************************
函数名称: void LcdClrscr(void)
函数版本: 1.00
作者: yht
创建日期: 2007.4.19
函数功能说明:清除LCD中部分内容(除去顶端四个汉字的位置)
输入参数:无
输出参数:无
返回值: 无
函数扇出清单:空
函数扇入清单:空
函数体中用到的公共资源:空
更新后的上述资源:空
***************************************************************************/
void LcdClrscr(void)
{
u16 ii,jj;
u16 Sch1;
for(ii=14;ii<16;ii++) //在Y方向共16行
{
Sch1 = 160*ii; //在X方向共160列,变化一行就偏移160。
for(jj=32;jj<128;jj++)
{
Temp_LcdBuffer[Sch1+jj] = 0x0; //缓冲区清零
}
}
for(ii=0;ii<2240;ii++) //在Y方向共16行
{
Temp_LcdBuffer[ii] = 0x0; //缓冲区清零
}
}
/**************************************************************************
函数名称: void LcdClrAll(void)
函数版本: 1.00
作者: ysh
创建日期: 2002.10.25
函数功能说明:清除LCD屏中全部内容
输入参数:无
输出参数:无
返回值: 无
函数扇出清单:空
函数扇入清单:空
函数体中用到的公共资源:空
更新后的上述资源:空
***************************************************************************/
void LcdClrAll(void)
{
u8 ii,jj;
u16 Sch1;
for(ii=0;ii<16;ii++) //在Y方向共16行
{
Sch1 = 160*ii; //在X方向共160列,变化一行就偏移160。
for(jj=0;jj<160;jj++)
{
Temp_LcdBuffer[Sch1+jj] = 0x0;//缓冲区清零
}
}
}
/**************************************************************************
函数名称: void OpenLcd(void)
函数版本: 1.00
作者: ysh
创建日期: 2002.10.25
函数功能说明:将显示缓冲区Temp_LcdBuffer里的数据写入显示Sram
输入参数:无
输出参数:无
返回值: 无
函数扇出清单:空
函数扇入清单:空
函数体中用到的公共资源:空
更新后的上述资源:空
***************************************************************************/
void OpenLcd(void)
{
u8 ii,jj;
u16 Sch1;
LcdGotoxy(0,0); //从LCD左上角开始显示
S1D15E05_Command(DISPDATAWRITE);
for(ii=0;ii<16;ii++) //在Y方向共16行
{
Sch1 = 160*ii;
for(jj=0;jj<160;jj++) //在X方向共160列,变化一行就偏移160
{
S1D15E05_Data(Temp_LcdBuffer[Sch1+jj]); //缓冲区内容写入显示RAM进行显示
}
}
}
/**************************************************************************
函数名称: void OpenLcd_Gray(void)
函数版本: 1.00
作者: ysh
创建日期: 2002.10.25
函数功能说明:Gray_Scale模式下,将显示缓冲区Temp_LcdBuffer_Gray里的数据写入显示Sram
输入参数:无
输出参数:无
返回值: 无
函数扇出清单:空
函数扇入清单:空
函数体中用到的公共资源:空
更新后的上述资源:空
***************************************************************************/
void OpenLcd_Gray(void)
{
u8 ii,jj;
u16 Sch1;
LcdGotoxy(0,0); //从LCD左上角开始显示
S1D15E05_Command(DISPDATAWRITE);
for(ii=0;ii<16;ii++) //在Y方向共16行
{
Sch1 = 320*ii; //modified by yht
for(jj=0;jj<320;jj++) //在X方向共160列,变化一行就偏移160
{
S1D15E05_Data(Temp_LcdBuffer_Gray[Sch1+jj]); //缓冲区内容写入显示RAM进行显示
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -