?? lcddrive.c
字號:
/****************************************************************************************
* 文件名:LCMDRI.C
* 功能:圖形液晶128*64驅(qū)動(型號為MG12864A)。
* 說明:圖形液晶采KS0107為LCM控制芯片,內(nèi)帶負壓產(chǎn)生器,單5伏供電,并行接口。
* 硬件連接: D0--D7 <===> P4.0--P4.7
* CS1 <===> P5.2
* CS2 <===> P5.1
* RST <===> P5.0
* D/I <===> P5.5
* E <===> P5.3
* R/W <===> P5.4
****************************************************************************************/
#include "Includes.h"
TCOLOR gui_disp_buf[GUI_LCM_YMAX/8][GUI_LCM_XMAX]; // 聲明GUI顯示緩沖區(qū)
/* 輸出總線數(shù)據(jù)宏定義 */
#define OutData(dat) P4OUT = dat
/* 定義CS1控制 */
#define SET_CS1() P5OUT |= BIT2
#define CLR_CS1() P5OUT &= ~BIT2
/* 定義CS2控制 */
#define SET_CS2() P5OUT |= BIT1
#define CLR_CS2() P5OUT &= ~BIT1
/* 定義RST控制 */
#define SET_RST() P5OUT |= BIT0
#define CLR_RST() P5OUT &= ~BIT0
/* 定義DI控制 */
#define SET_DI() P5OUT |= BIT5
#define CLR_DI() P5OUT &= ~BIT5
/* 定義E控制 */
#define SET_E() P5OUT |= BIT3
#define CLR_E() P5OUT &= ~BIT3
/* 定義E控制 */
#define SET_RW() P5OUT |= BIT4
#define CLR_RW() P5OUT &= ~BIT4
/* 定義LCM操作的命令字 */
#define LCM_DISP_ON 0x3f /* 打開LCM顯示 */
#define LCM_PAGE 0xb8 /* 頁起始行地址,可以用LCM_PAGE+X設(shè)置當前頁。(X<8) */
#define LCM_Y 0xc0 /* 顯示起始行0,可以用LCM_Y+Y設(shè)置起始行。(Y<64) */
#define LCM_X 0x40 /* 列起始行地址,可以用LCM_X+X設(shè)置當前列。(X<64) */
/***********************************************************************
* 名稱:DELAY5()
* 功能:軟件延時。
* 入口參數(shù):無
* 出口參數(shù):無
***********************************************************************/
void DELAY5(void)
{
unsigned char i;
for(i=0;i<10;i++);
}
/***********************************************************************
* 名稱:LCM_WrCommand()
* 功能:寫命令子程序
* 入口參數(shù):command 要寫入LCM的命令字
* 出口參數(shù):無
* 說明:函數(shù)會設(shè)置LCM數(shù)據(jù)總線為輸出方式
***********************************************************************/
void LCM_WrCommand(unsigned char command)
{
CLR_E();
CLR_DI();
OutData(command);
DELAY5();
SET_E();
DELAY5();
CLR_E();
DELAY5();
}
/***********************************************************************
* 名稱:LCM_WrData()
* 功能:寫數(shù)據(jù)子程序
* 入口參數(shù):wrdat 要寫入LCM的數(shù)據(jù)
* 出口參數(shù):無
***********************************************************************/
void LCM_WrData(unsigned char wrdat)
{
CLR_E();
SET_DI();
OutData(wrdat);
DELAY5();
SET_E();
DELAY5();
CLR_E();
DELAY5();
}
/***********************************************************************
* 名稱:LCM_Position()
* 功能:向指定點寫數(shù)據(jù)(一字節(jié))
* 入口參數(shù):x x座標值(0-127)
* y y座標值(0-63)
* 出口參數(shù):無
* 說明:會重新設(shè)置CS1/CS2,及其內(nèi)部指針
***********************************************************************/
void LCM_Position(unsigned char x,unsigned char y)
{
}
/***********************************************************************
* 名稱:LCM_WriteByte()
* 功能:向指定點寫數(shù)據(jù)(一字節(jié))
* 入口參數(shù):wrdat 要寫入LCM的數(shù)據(jù)
* x x座標值(0-127)
* y y座標值(0-63)
* 出口參數(shù):無
* 說明:會重新設(shè)置CS1/CS2,及其內(nèi)部指針
***********************************************************************/
void LCM_WriteByte(unsigned char x,unsigned char y,unsigned char wrdat)
{
x = x&0x7f;
y = y&0x3f;
CLR_CS1();
CLR_CS2();
y = y>>3;
gui_disp_buf[y][x] = wrdat;
if(x<64)
{
SET_CS1();
}
else
{
SET_CS2();
x = x-64;
}
LCM_WrCommand(LCM_X+x); //設(shè)置當前列地址,即x座標
LCM_WrCommand(LCM_PAGE+y); //設(shè)置當前頁地址,即y座標
LCM_WrData(wrdat);
}
/***********************************************************************
* 名稱:LCM_ReadByte()
* 功能:讀取指定點上的數(shù)據(jù)。
* 入口參數(shù): x x坐標的值(0-127)
y y坐標的值(0-63)
* 出口參數(shù):返回該點上的字節(jié)數(shù)據(jù)
***********************************************************************/
unsigned char LCM_ReadByte(unsigned char x,unsigned char y)
{
x = x&0x7f;
y = y&0x3f;
y = y>>3;
return(gui_disp_buf[y][x]);
}
/***********************************************************************
* 名稱:LCM_DispFill()
* 功能:向顯示緩沖區(qū)填充數(shù)據(jù)。
* 入口參數(shù): filldata 要寫入LCM的填充數(shù)據(jù)
* 出口參數(shù):此函數(shù)會設(shè)置顯示起始行為0,且會自動選中CS1有效
***********************************************************************/
void LCM_DispFill(unsigned char filldata)
{
unsigned char x,y;
SET_CS1(); //選中兩個控制芯片
SET_CS2();
LCM_WrCommand(LCM_Y); //設(shè)置顯示起始行為0
for(y=0;y<8;y++)
{
LCM_WrCommand(LCM_PAGE+y); //設(shè)置當前頁地址
LCM_WrCommand(LCM_X); //設(shè)置當前列地址
for(x=0;x<64;x++)
{
LCM_WrData(filldata);
}
}
CLR_CS2();
}
/***********************************************************************
* 名稱:LCM_DispIni()
* 功能:LCM顯示初始化。
* 入口參數(shù): 無
* 出口參數(shù):無
* 說明:初始化顯示后,清屏并設(shè)置顯示起始行為0
* 會復(fù)位LCM_DISPCX,LCM_DISPCY.(并會只選中CS1)
***********************************************************************/
void LCM_DispIni()
{
unsigned char i;
/* 設(shè)置引腳連接模塊 */
P5SEL = 0x00;
P4SEL = 0x00;
/* 設(shè)置I/O為輸出方式 */
P4DIR = 0x0ff;
P5DIR = 0x0ff;
/* 復(fù)位LCM */
CLR_RST();
for(i=0;i<250;i++);
SET_RST();
for(i=0;i<250;i++);
/* 默認為寫模式 */
CLR_RW();
SET_CS1();
SET_CS2();
LCM_WrCommand(LCM_DISP_ON); // 打開顯示
LCM_WrCommand(LCM_Y); // 設(shè)置顯示起始行為0
LCM_WrCommand(LCM_PAGE); // 設(shè)置起始頁地址為0
LCM_WrCommand(LCM_X); // 設(shè)置起始列地址為0
}
/***********************************************************************
* 名稱:GUI_FillSCR()
* 功能:全屏填充.直接使用數(shù)據(jù)填充顯示緩沖區(qū).
* 入口參數(shù): dat
* 出口參數(shù):無
* 說明:用戶根據(jù)LCM的實際情況編寫此函數(shù).
***********************************************************************/
void GUI_FillSCR(TCOLOR dat)
{
unsigned char i,j;
/* 填充緩沖區(qū) */
for(i=0;i<(GUI_LCM_YMAX/8);i++)
{
for(j=0;j<GUI_LCM_XMAX;j++)
{
gui_disp_buf[i][j] = dat;
}
}
/* 填充LCM */
LCM_DispFill(dat);
}
/****************************************************************************
* 名稱:GUI_ClearSCR()
* 功能:清屏。
* 入口參數(shù):無
* 出口參數(shù):無
* 說明:用戶根據(jù)LCM的實際情況編寫此函數(shù)。
****************************************************************************/
void GUI_ClearSCR(void)
{
GUI_FillSCR(0x00); // 清屏
}
/***********************************************************************
* 名稱:GUI_Initialize()
* 功能:初始化GUI,包括初始化顯示緩沖區(qū),初始化LCM并清屏.
* 入口參數(shù): 無
* 出口參數(shù):無
* 說明:用戶根據(jù)LCM的實際情況編寫此函數(shù).
***********************************************************************/
void GUI_Initialize(void)
{
LCM_DispIni(); // 初始化LCM模塊工作模式,純圖形模式
GUI_FillSCR(0x00); // 初始化緩沖區(qū)為0x00,并輸出屏幕(清屏)
}
unsigned char const DEC_HEX_TAB[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
/***********************************************************************
* 名稱:GUI_Point()
* 功能:在指定位置上畫點.
* 入口參數(shù): x 指定點所在列的位置
* y 指定點所在行的位置
* color 顯示顏色(對于黑白LCM,為0時滅,為1時顯示)
* 出口參數(shù):返回值為1時,表示操作成功,為0時表示操作失敗.
* 說明:操作失敗原因是指定地址超出緩沖區(qū)范圍.
***********************************************************************/
unsigned char GUI_Point(unsigned char x, unsigned char y, TCOLOR color)
{
unsigned char bak;
/* 參數(shù)過濾 */
if(x>=GUI_LCM_XMAX) return(0);
if(y>=GUI_LCM_YMAX) return(0);
/* 設(shè)置相應(yīng)的點為1或0 */
bak = LCM_ReadByte(x,y);
if(color==0)
{
bak &= (~DEC_HEX_TAB[(y&0x07)]);
}
else
{
bak |= DEC_HEX_TAB[(y&0x07)];
}
/* 刷新顯示 */
LCM_WriteByte(x,y,bak);
return(1);
}
/****************************************************************************
* 名稱:GUI_ReadPoint()
* 功能:讀取指定點的顏色。
* 入口參數(shù):x 指定點所在列的位置
* y 指定點所在行的位置
* ret 保存顏色值的指針
* 出口參數(shù):返回0時表示指定地址超出有效范圍。
* 說明:對于單色,設(shè)置ret的d0位為1或0,4級灰度則為d0、d1有效,8位RGB則d0--d7有效,
* RGB結(jié)構(gòu)則R、G、B變量有效。
****************************************************************************/
int GUI_ReadPoint(unsigned char x, unsigned char y, TCOLOR *ret)
{
TCOLOR bak;
/* 參數(shù)過濾 */
if(x>=GUI_LCM_XMAX) return(0);
if(y>=GUI_LCM_YMAX) return(0);
/* 取得該點顏色(用戶自行更改) */
bak =LCM_ReadByte(x,y);
if( (bak&(DEC_HEX_TAB[(y&0x07)]))==0 ) *ret = 0x00;
else *ret = 0x01;
return(1);
}
/****************************************************************************
* 名稱:GUI_HLine()
* 功能:畫水平線。
* 入口參數(shù): x0 水平線起點所在列的位置
* y0 水平線起點所在行的位置
* x1 水平線終點所在列的位置
* color 顯示顏色(對于黑白色LCM,為0時滅,為1時顯示)
* 出口參數(shù):無
* 說明:操作失敗原因是指定地址超出緩沖區(qū)范圍。
****************************************************************************/
void GUI_HLine(unsigned char x0, unsigned char y0, unsigned char x1, TCOLOR color)
{
unsigned char bak;
if(x0>x1) // 對x0、x1大小進行排列,以便畫圖
{
bak = x1;
x1 = x0;
x0 = bak;
}
do
{
GUI_Point(x0,y0,color);
x0++;
}while(x1>x0);
}
/****************************************************************************
* 名稱:GUI_RLine()
* 功能:畫垂直線。
* 入口參數(shù): x0 垂直線起點所在列的位置
* y0 垂直線起點所在行的位置
* y1 垂直線終點所在行的位置
* color 顯示顏色(對于黑白色LCM,為0時滅,為1時顯示)
* 出口參數(shù):無
* 說明:操作失敗原因是指定地址超出緩沖區(qū)范圍。
****************************************************************************/
void GUI_RLine(unsigned char x0, unsigned char y0, unsigned char y1, TCOLOR color)
{
unsigned char bak;
unsigned char wr_dat;
if(y0>y1) //對y0,y1大小進行排列,以便畫圖
{
bak = y1;
y1 = y0;
y0 = bak;
}
do
{
/* 先讀取當前點的字節(jié)數(shù)據(jù) */
bak = LCM_ReadByte(x0,y0);
/* 進行"與"/"或"操作后,將正確的數(shù)據(jù)寫回LCM
若y0和y1不是同一字節(jié),則y0--當前字節(jié)結(jié)束,即(y0+8)&0x38,全寫1,或者0.
若y0和y1是同一字節(jié),則y0--y1,要全寫1,或者0.
方法:dat = 0xff,然后y0清零dat低位,按y1清零高位.*/
if((y0>>3)!=(y1>>3))
{
wr_dat = 0xff<<(y0&0x07); //清0低位
if(color)
{
wr_dat = bak|wr_dat; //若color不為0,則顯示
}
else
{
wr_dat = ~wr_dat;
wr_dat = bak&wr_dat;
}
LCM_WriteByte(x0,y0,wr_dat);
y0 = (y0+8)&0x38;
}
else
{
wr_dat = 0xff<<(y0&0x07);
wr_dat = wr_dat&(0xff>>(7-(y1&0x07)));
if(color)
{
wr_dat = bak|wr_dat; //若color不為0,則顯示
}
else
{
wr_dat = ~wr_dat; //若color為0,則清除顯示
wr_dat = bak&wr_dat;
}
LCM_WriteByte(x0,y0,wr_dat);
return;
}
}while(y1>y0);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -