📄 lcd.c
字号:
/**************************************LCD.C*******************************************
文件名 : LCD.C
目标 : cc2430
创建日期: 2008/04/24
修改日期: 2008/04/25
版本 : version 1.0
作者 : 王坤朋
功能描述: 提供LCD与用户应用程序的接口,此文件提供了操作LCD的接口函数.
***************************************************************************************/
//***********************************头文件*******************************************//
#include "LCD.H"
//************************************变量********************************************//
INT8U X_WChar; //字符写入时的宽度
INT8U Y_WChar; //字符写入时的高度
INT8U Font_Wrod; //字体的每个字模占用多少个存储单元数
INT8U *Char_TAB; //字库指针
INT8U BMP_Color; //前景色
INT8U LcdLum; //量度调整
INT8U LcdMode; //省电模式,0=正常显示;1=睡眠模式;2=备用模式
INT8U LcdStaticMode; //静态指示器状态,0=关;1=0.5s闪烁;2=1s闪烁;3=all on
//***********************************函数声明*****************************************//
//全局函数,可以供应用程序调用
void LcdInit(void); //LCD初始化
void FontSet(INT8U mode); //设定字体
void PutEnChar(INT8U x,INT8U y,INT8U word,INT8U rev); //向LCD输出单个英文字符
void PutCChar(INT8U x,INT8U y,INT8U ch[],INT8U rev); //向LCD输出单个汉字字符
void PutString(INT8U x,INT8U y,INT8U *p,INT8U rev); //向LCD输出字符串
void LcdBMP(INT8U x1,INT8U y1,INT8U xw,INT8U yw,INT8U *bmp);//向LCD输出一张图片
void ClrScreen(INT8U Mode); //清屏
void RefreshScreen(void); //刷新屏幕,用于设置的更新
void LCD_Fill(INT8U x1,INT8U y1,INT8U x2,INT8U y2,INT8U color);//LCD填充颜色
void LcdStatic(void); //静态指示器状态,0=关;1=0.5s闪烁;2=1s闪烁;3=all on
//内部函数,只供内部调用
//void LcdReset(void); //复位
void PutChar(INT8U x,INT8U y,INT8U word,INT8U rev); //向LCD输出单个字符
void SetRamAddr (INT8U Page, INT8U Col); //设定显示页:列
void LcdDataWrite(INT8U Data); //向LCD写一个字节
void LcdRegWrite(INT8U Command); //控制寄存器字节写入
void LcdDataSend(INT8U Data); //向LCD写一位
//void LcdDelay(INT8U n); //延时函数
//************************************LCD初始化***************************************//
// 函数: void LcdInit(void)
// 描述: LCD的初始化设置
// 入口参数: 无
// 出口参数: 无
// 例如: LcdInit();
//************************************************************************************//
void LcdInit(void)
{
Lcd_DIR; //端口初始化
Lcd_PORT;
FontSet(1); //字符设置
BMP_Color=0x55; //显示屏初始化
LcdLum=0x0A; //显示亮度数据0x00~0x3f
LcdMode=0; //正常显示模式
//LcdReset(); //复位操作
LcdRegWrite(Lcd_ON); //LCD On
LcdRegWrite(Lcd_POWER_ALL); //设置上电控制模式
LcdRegWrite(Lcd_ELE_VOL); //电量设置模式(显示亮度)
LcdRegWrite(LcdLum); //显示亮度数据0x00~0x3f
LcdRegWrite(Lcd_SETR_7); //内部电压调节电阻设置
LcdRegWrite(Lcd_BIAS_7); //LCD偏压设置,V3时选
LcdRegWrite(Lcd_COM_REV); //Com 扫描方式设置
LcdRegWrite(Lcd_SEG_NOR); //Segment方向选择
LcdRegWrite(Lcd_ALL_LOW); //全屏点亮/变暗指令
LcdRegWrite(Lcd_ALL_NOR); //正向反向显示控制指令
LcdRegWrite(Lcd_STATIC_OFF); //关闭静态指示器
LcdRegWrite(0x00); //指令数据
LcdRegWrite(Lcd_BEGIN_LINE); //设置显示起始行对应RAM
LcdRegWrite(0xe0); //设置读写改模式,结束为0xee
}
//**********************************设置显示字体******************************************//
// 函数: void FontSet(INT8U mode)
// 描述: 设置显示字体
// 入口参数: 模式(0:汉字;1:英文):使用的字库指针
// 出口参数: 无
// 说明: 在显示字符之前调用此函数.
// 例如:选用16*16点阵的汉字字库FontNew16X16--->FontSet(0);
//***************************************************************************************//
void FontSet(INT8U mode)
{
if(mode)
{
Font_Wrod = 6; //每个字模占的存储单元数
Y_WChar=6; //字符写入时的宽度
X_WChar=1; //字符写入时的高度
Char_TAB = (INT8U *)(Ascii0608-(INT8U *)(32*6)); //字库指针
}
else
{
Font_Wrod = 32; //汉字每个字模占的存储单元数
Y_WChar=16; //字符写入时的宽度
X_WChar=2; //字符写入时的高度
Char_TAB = (INT8U *)FontCC1616; //字库指针
}
}
//**********************************输出单个汉字字符**************************************//
// 函数: void PutEnChar(INT8U x,INT8U y,INT16U ch[],INT8U rev)
// 描述: 在X,Y坐标处输出一个字符,x:行,y:列,word:字符,rev:是否反黑显示(0=NO,1=YES)
// 入口参数: x:行,y:列,ch:汉字字符,rev:是否反黑显示
// 出口参数: 无
//***********************************************************************************//
void PutEnChar(INT8U x,INT8U y,INT8U word,INT8U rev)
{
FontSet(1);
PutChar(x,y,word,rev);
}
//**********************************输出单个字符**************************************//
// 函数: void PutChar(INT8U x,INT8U y,INT8U word,INT8U rev)
// 描述: 在X,Y坐标处输出一个字符,x:行,y:列,word:字符,rev:是否反黑显示(0=NO,1=YES)
// 入口参数: x:行,y:列,word:字符,rev:是否反黑显示
// 出口参数: 无
//***********************************************************************************//
void PutChar(INT8U x,INT8U y,INT8U word,INT8U rev)
{
INT8U i,j;
INT8U *p_data;
p_data = Char_TAB + word*Font_Wrod; //要写字符的首地址
for(j=0;j<X_WChar;j++) //是否大于最大行
{
if((x+j) <=(Lcd_X_MAX>>3)) //是否超过最大行
{
SetRamAddr(x+j,y);
for(i=0;i<Y_WChar;i++) //是否超过最大列
{
if((y+i) <=Lcd_Y_MAX)
if(rev)
LcdDataWrite(~*p_data++); //在此处显示反黑字符
else
LcdDataWrite(*p_data++); //在此处显示字符
}
}
}
}
//**********************************输出单个汉字字符**************************************//
// 函数: void PutCChar(INT8U x,INT8U y,INT16U ch[],INT8U rev)
// 描述: 在X,Y坐标处输出一个字符,x:行,y:列,word:字符,rev:是否反黑显示(0=NO,1=YES)
// 入口参数: x:行,y:列,ch:汉字字符,rev:是否反黑显示
// 出口参数: 无
//***********************************************************************************//
void PutCChar(INT8U x,INT8U y,INT8U ch[],INT8U rev)
{
INT8U CCpoint;
INT8U ii;
INT8U adder;
CCpoint = 0;
ii=0;
adder = 1; //如果能找到,首地址必是偶数.为1未找到.
while(FontCC16_Index[CCpoint] > 160) //是汉字内码
{
if(FontCC16_Index[CCpoint] == ch[ii]&&
FontCC16_Index[CCpoint + 1] == ch[ii + 1]) //相等
{
adder=CCpoint;
break; //找到,结束循环
}
CCpoint += 2; //未找到,指向下一位
}
if(adder!=1) //找到汉字位置
{
FontSet(0); //调用中文库
PutChar(x,y,adder>>1,rev);
}
else
{
PutString(x,y," ",rev);
PutString(x+1,y," ",rev);
}
}
//*********************************输出字符串****************************************//
// 函数: void PutString(INT8U x,INT8U y,INT8U *p,,INT8U rev)
// 描述: 在X,Y坐标处输出一个字符串,x:行,y:列,*p:字符指针,rev:是否反黑显示(0=NO,1=YES)
// 说明: 在X,Y坐标处输出一个字符串.
// 入口参数: X:Y:Pointer:rev
// 出口参数: 无
//***********************************************************************************//
void PutString(INT8U x,INT8U y,INT8U ch[],INT8U rev)
{
INT8U temp[3];
INT8U ii;
ii=0;
while(ch[ii]!='\0')
{
if(ch[ii]>160) //是汉字
{
temp[0]=ch[ii];
temp[1]=ch[ii+1];
temp[2]='\0'; //汉字为两个字节
PutCChar(x,y,temp,rev);
y+= Y_WChar; //列加
if((y + Y_WChar) >Lcd_Y_MAX+1) //是否超过最大列
{
y = 0; //超过,置零
if((Lcd_X_MAX - x) <= X_WChar) //是否超过最大行
break;
else
x += X_WChar; //若没有超过,行加
}
ii+=2;
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -