📄 lcddrive.c
字号:
/****************************************************************************************
* 文件名:LCDDRIVE.C
* 功能:图形液晶98*67驱动(型号为3510I(S1D15G14))
* 硬件连接:
* Pin1 _Reset ------------------> PD0
* Pin2 _Cs ------------------> PD1
* Pin3 Gnd ------------------> GND
* Pin4 Sdata ------------------> PD2
* Pin5 Sclk ------------------> PD3
* Pin6 Vdigital 1.8V ------------------> 3.3V
* Pin7 Vbooster in 2.7V ------------------> 3.3V
* Pin8 Vlcd max.12V ------------------> 0.1UF->GND
****************************************************************************************/
#include "..\APP\config.h"
//TCOLOR gui_disp_buf[GUI_LCM_YMAX][GUI_LCM_XMAX/8]; // 声明GUI显示缓冲区
//volatile uint16 LcdBakColor=CERULEAN;
volatile uint16 LcdPenColor=0xfff;
/***********************************************************************
* 名称:LcdSendData()
* 功能:写数据子程序。(发送数据前,不检查液晶模块的状态)
* 入口参数:dat 要写入LCD的数据
* 出口参数:无
* 说明:函数会设置LCM数据总线为输出方式
***********************************************************************/
void LcdSendData(uint8 Data)
{
uint8 i;
SetSdataOut();
ClrLcdCs();
ClrLcdSclk();
SetLcdSdata();
SetLcdSclk();
for(i=0;i<8;i++)
{
ClrLcdSclk();
if(Data& DCB2HEX_TAB[i] )
{
SetLcdSdata();
}
else
{
ClrLcdSdata();
}
SetLcdSclk();
}
}
/***********************************************************************
* 名称:DelayXms()
* 功能:读取状态字子程序。
* 入口参数:延时毫秒数:
* 出口参数:
* 说明:
***********************************************************************/
/*****************************************
延时函数,用来给液晶操作延时,
******************************************/
void DelayXms(uint16 xs)
{
uint16 D_t;
while(xs--)
{
for(D_t=Fcclk/1000;D_t>0;D_t--);
}
}
/***********************************************************************
* 名称:LCDportInit()
* 功能:读取数据子程序。
* 入口参数:无
* 出口参数:返回值即为读出的数据
* 说明:函数会设置LCM数据总线为输入方式
***********************************************************************/
void LcdPortInit(void)
{
SCS = 0x00000001; /*设置高速IO*/
//LCD_PORTS |= (1<<LCD_RST)|(1<<LCD_CS)|(1<<LCD_SDATA)|(1<<LCD_SCLK);
LCD_DDR |= (1<<LCD_RST)|(1<<LCD_CS)|(1<<LCD_SDATA)|(1<<LCD_SCLK);
SetLcdRst();
SetLcdCs();
SetLcdSclk();
}
/***********************************************************************
* 名称:LCDreset()
* 功能:LCD重启
* 入口参数:无
* 出口参数:五
***********************************************************************/
void LcdReset(void)
{
ClrLcdRst();
DelayXms(5);
SetLcdRst();
DelayXms(5);
}
/***********************************************************************
* 名称:LcdSendCommand()
* 功能:数据自动写状态是否允许。
* 入口参数:无
* 出口参数:返回0表示禁止,否则表示允许
***********************************************************************/
void LcdSendCommand(uint8 cmd)
{
uint8 i;
SetSdataOut();
ClrLcdCs();
ClrLcdSclk();
ClrLcdSdata();
SetLcdSclk();
for(i=0;i<8;i++)
{
ClrLcdSclk();
if(cmd &DCB2HEX_TAB[i] )
{
SetLcdSdata();
}
else
{
ClrLcdSdata();
}
SetLcdSclk();
}
}
/***********************************************************************
* 名称:LcdInit()
* 功能:初始化LCD
* 入口参数:
* 出口参数:
***********************************************************************/
void LcdInit(void)
{
uint8 i;
LcdPortInit();
LcdReset();
LcdSendCommand(0x01); //soft reset
SetLcdCs();
DelayXms(5);
LcdSendCommand(0xc6); //initial escape
SetLcdCs();
LcdSendCommand(0xb9); //refresh set
LcdSendData(0x00);
SetLcdCs();
LcdSendCommand(0xb6); //display control
LcdSendData(0x80);
LcdSendData(0x80);
LcdSendData(0x81);
LcdSendData(84);
LcdSendData(69);
LcdSendData(82);
LcdSendData(67);
SetLcdCs();
LcdSendCommand(0xb3); //gray scale position set
LcdSendData(1);
LcdSendData(2);
LcdSendData(4);
LcdSendData(8);
LcdSendData(16);
LcdSendData(30);
LcdSendData(40);
LcdSendData(50);
LcdSendData(60);
LcdSendData(70);
LcdSendData(80);
LcdSendData(90);
LcdSendData(100);
LcdSendData(110);
LcdSendData(127);
SetLcdCs();
LcdSendCommand(0xb5); //gamma curve set
LcdSendData(0x01);
SetLcdCs();
LcdSendCommand(0xbd); //common driver output select
LcdSendData(0x00);
SetLcdCs();
LcdSendCommand(0xbe); /* 有两种3510I一种需要设置为0x03;一种需要设置为0x04*/
LcdSendData(0x03);
SetLcdCs();
LcdSendCommand(0x11); //sleep out
SetLcdCs();
LcdSendCommand(0xba); //voltage control
LcdSendData(127);
LcdSendData(3);
SetLcdCs();
LcdSendCommand(0xb7); //temperature gradient set
for(i=0; i<14; i++)
{
LcdSendData(0x00);
}
SetLcdCs();
LcdSendCommand(0x29); //display ON
SetLcdCs();
LcdSendCommand(0x03); //booster voltage ON
SetLcdCs();
DelayXms(5);
LcdSendCommand(0x20); //display inversion OFF
SetLcdCs();
LcdSendCommand(0x25); //write contrast
LcdSendData(62);
SetLcdCs();
LcdSendCommand(0x3a); /* 初始化设置颜色为4096色*/
LcdSendData(3);
SetLcdCs();
}
/***********************************************************************
* 名称:LcdClr()
* 功能:
* 入口参数:color 清屏函数,往屏幕填充指定的背景色
* 出口参数:
***********************************************************************/
void LcdClr(uint16 color)
{
uint8 x, y;
LcdSendCommand(0x2a); //column address set
LcdSendData(0);
LcdSendData(97);
SetLcdCs();
LcdSendCommand(0x2b); //page address set
LcdSendData(0);
LcdSendData(66);
SetLcdCs();
LcdSendCommand(0x2c); //memory write
for(y=0;y<67;y++)
{
for(x=0;x<98;x+=2)
{
LcdSendData(color>>4);//第一字节写第一个点的RG
LcdSendData(((color & 0x00f)<<4)|(color >> 8));//第二字节写第一个点的B和第二个点的R
LcdSendData(color & 0x0ff);//写第二个点的GB
}
}
SetLcdCs();
}
/* 以下为LCM的用户接口层,主要负责解释用户命令,并发送到LCM,为用户编程提供接口 */
/****************************************************************************
* 名称:LCD_ColorSet()
* 功能:设置LCD颜色模式
* 入口参数:color :1为4096色;0为256色;
* ret 保存颜色值的指针
* 出口参数:返回0时表示指定地址超出有效范围。
****************************************************************************/
void LCD_ColorSet(uint8 Color)
{
if (Color==TRUE) {
LcdSendCommand(0x3a); //interface pixel format
LcdSendData(0x03); //0x03 为4096色,0x02为256色
LCD_DataOver();
}
else
{
LcdSendCommand(0x3a); //interface pixel format
LcdSendData(0x02); //0x03 为4096色,0x02为256色
LCD_DataOver();
LcdSendCommand(0x2d); //调色板设置
//red
LcdSendData(0x00);
LcdSendData(0x02);
LcdSendData(0x03);
LcdSendData(0x04);
LcdSendData(0x05);
LcdSendData(0x06);
LcdSendData(0x08);
LcdSendData(0x0f);
//green
LcdSendData(0x00);
LcdSendData(0x02);
LcdSendData(0x03);
LcdSendData(0x04);
LcdSendData(0x05);
LcdSendData(0x06);
LcdSendData(0x08);
LcdSendData(0x0f);
//blue
LcdSendData(0x00);
LcdSendData(0x03);
LcdSendData(0x06);
LcdSendData(0x0f);
LCD_DataOver();
}
}
/****************************************************************************
* 名称:GUI_Point()
* 功能:在指定位置上画点。
* 入口参数: x 指定点所在列的位置
* y 指定点所在行的位置
* color 只能为256色模式
* 出口参数:返回值为1时表示操作成功,为0时表示操作失败。(操作失败原因是指定地址超出有
* 效范围)
* 说明:
****************************************************************************/
void GUI_Point(uint8 x, uint8 y,uint8 Color)
{
LcdSendCommand(0x2a);//column address set
LcdSendData(x );
LcdSendData(x );
LCD_DataOver();
LcdSendCommand(0x2b);//page address set
LcdSendData(y );
LcdSendData(y );
LCD_DataOver();
LcdSendCommand(0x2C); //memory write
LcdSendData(Color);
LCD_DataOver();
}
/****************************************************************************
* 名称:GUI_HLine1()
* 功能:画水平线。
* 入口参数: x0 水平线起点所在列的位置
* y0 水平线起点所在行的位置
* x1 水平线终点所在列的位置
* color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:无
* 说明:操作失败原因是指定地址超出缓冲区范围。 在4096色模式下:
****************************************************************************/
void GUI_HLine1(uint8 x0,uint8 y0,uint8 x1,uint16 color)
{
uint16 old_color;
uint8 a;
old_color=LcdPenColor;//保存原来的颜色值,以免画线改变原来的颜色
LcdPenColor=color;
LcdSendCommand(0x2a);
LcdSendData(x0);
LcdSendData(x1); //w的作用体现在此处
SetLcdSclk();
LcdSendCommand(0x2b);
LcdSendData(y0);
LcdSendData(y0);
SetLcdSclk();
LcdSendCommand(0x2c);
for(a=x0;a<x1;a+=2)
{
LcdSendData(color>>4);//第一字节写第一个点的RG
LcdSendData(((color & 0x00f)<<4)|(color >> 8));//第二字节写第一个点的B和第二个点的R
LcdSendData(color & 0x0ff);//写第二个点的GB ;
}
LcdPenColor=old_color;//恢复原来颜色值
SetLcdSclk();
}
/****************************************************************************
* 名称:GUI_RLine1()
* 功能:画垂直线。
* 入口参数: x0 垂直线起点所在列的位置
* y0 垂直线起点所在行的位置
* y1 垂直线终点所在行的位置
* color
* 出口参数:无
* 说明:操作失败原因是指定地址超出缓冲区范围。 在4096色模式下:
****************************************************************************/
void GUI_RLine1(uint8 x0,uint8 y0,uint8 y1,uint16 color)
{
uint16 old_color;
uint8 a;
old_color=LcdPenColor;//保存原来的颜色值,以免画线改变原来的颜色
LcdPenColor=color;
LcdSendCommand(0x2a);
LcdSendData(x0);
LcdSendData(x0); //w的作用体现在此处
SetLcdSclk();
LcdSendCommand(0x2b);
LcdSendData(y0);
LcdSendData(y1);
SetLcdSclk();
LcdSendCommand(0x2c);
for(a=y0;a<y1;a+=2)
{
LcdSendData(color>>4);//第一字节写第一个点的RG
LcdSendData(((color & 0x00f)<<4)|(color >> 8));//第二字节写第一个点的B和第二个点的R
LcdSendData(color & 0x0ff);//写第二个点的GB ;
}
LcdPenColor=old_color;//恢复原来颜色值
SetLcdSclk();
}
/****************************************************************************
* 名称:GUI_HLine1()
* 功能:画水平线。
* 入口参数: x0 水平线起点所在列的位置
* y0 水平线起点所在行的位置
* x1 水平线终点所在列的位置
* color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:无
* 说明:操作失败原因是指定地址超出缓冲区范围。 在256色模式下:
****************************************************************************/
void GUI_HLine(uint8 x0,uint8 y0,uint8 x1,uint8 color)
{
uint8 a;
LcdSendCommand(0x2a);
LcdSendData(x0);
LcdSendData(x1);
SetLcdSclk();
LcdSendCommand(0x2b);
LcdSendData(y0);
LcdSendData(y0);
SetLcdSclk();
LcdSendCommand(0x2c);
for(a=x0;a<x1;a++)
{
LcdSendData(color);
}
SetLcdSclk();
}
/****************************************************************************
* 名称:GUI_RLine()
* 功能:画垂直线。
* 入口参数: x0 垂直线起点所在列的位置
* y0 垂直线起点所在行的位置
* y1 垂直线终点所在行的位置
* color
* 出口参数:无
* 说明:操作失败原因是指定地址超出缓冲区范围。 在256色模式下:
****************************************************************************/
void GUI_RLine(uint8 x0,uint8 y0,uint8 y1,uint8 color)
{
uint8 a;
LcdSendCommand(0x2a);
LcdSendData(x0);
LcdSendData(x0);
SetLcdSclk();
LcdSendCommand(0x2b);
LcdSendData(y0);
LcdSendData(y1);
SetLcdSclk();
LcdSendCommand(0x2c);
for(a=y0;a<y1;a++)
{
LcdSendData(color);//第一字节写第一个点的RG
}
SetLcdSclk();
}
/****************************************************************************
* 名称:GUI_Picture()
* 功能:画垂直线。
* 入口参数: x0 垂直线起点所在列的位置
* y0 垂直线起点所在行的位置
* y1 垂直线终点所在行的位置
* color
* 出口参数:无
* 说明:操作失败原因是指定地址超出缓冲区范围。 在256色模式下:
****************************************************************************/
void GUI_Picture(uint8 x0,uint8 y0,uint8 x1,uint8 y1,const uint8 *bmp)
{
uint16 x, y;
LcdSendCommand(0x2a); //column address set
LcdSendData(x0);
LcdSendData(x1);
SetLcdCs();
LcdSendCommand(0x2b); //page address set
LcdSendData(y0);
LcdSendData(y1);
SetLcdCs();
LcdSendCommand(0x2c); //memory write
for(y=y0;y<=y1;y++)
{
for(x=x0;x<=x1;x+=2)
{
LcdSendData(*bmp++);
LcdSendData(*bmp++);
LcdSendData(*bmp++);
}
}
SetLcdCs();
}
/****************************************************************************
* 名称:GUI_Picture()
* 功能:画垂直线。
* 入口参数: x0 垂直线起点所在列的位置
* y0 垂直线起点所在行的位置
* y1 垂直线终点所在行的位置
* color
* 出口参数:无
* 说明:操作失败原因是指定地址超出缓冲区范围。 在256色模式下:
****************************************************************************/
void GUI_Picture_256(uint8 x0,uint8 y0,uint8 x1,uint8 y1,const uint8 *bmp)
{
uint16 x, y;
LcdSendCommand(0x2a); //column address set
LcdSendData(x0);
LcdSendData(x1);
SetLcdCs();
LcdSendCommand(0x2b); //page address set
LcdSendData(y0);
LcdSendData(y1);
SetLcdCs();
LcdSendCommand(0x2c); //memory write
for(y=y0;y<=y1;y++)
{
for(x=x0;x<=x1;x++)
{
LcdSendData(*bmp++);
}
}
SetLcdCs();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -