?? 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 + -