圖形液晶顯示實(shí)驗(yàn)
一. 實(shí)驗(yàn)?zāi)康?br>了解圖形液晶模塊(單色)的控制方法,實(shí)現(xiàn)簡(jiǎn)單圖形顯示算法。
二. 實(shí)驗(yàn)設(shè)備及器件
IBM PC 機(jī) 一臺(tái)
DP-51PROC 單片機(jī)綜合仿真實(shí)驗(yàn)儀 一臺(tái)
三. 實(shí)驗(yàn)內(nèi)容
控制圖形液晶模塊顯示ASCII 字符,畫(huà)直線。
四. 實(shí)驗(yàn)要求
掌握字符/圖形在圖形液晶上顯示的理論知識(shí),并能夠編寫(xiě)相關(guān)操作函數(shù)。
五. 實(shí)驗(yàn)步驟
1. 將A2 區(qū)的A0~A2 分別連接到B3 區(qū)的A0~A2。
2. 將A2 區(qū)的P10 連接到B3 區(qū)的RST。
3. 將A3 區(qū)的/Y0 連接到B3 區(qū)的/CS。
4. 將A2 區(qū)的A15~A10 分別連接到A3 區(qū)的相應(yīng)接線柱,連接關(guān)系如下:
A15 --- /G2B
A14 --- /G2A
A13 --- G1
A12 --- C
A11 --- B
A10 --- A
5. 在B3 區(qū)的J92 插入圖形液晶模塊(單色,128×64 點(diǎn))。
6. 將B3 區(qū)的JP21 短接,A3 區(qū)的JP4 短接。
7. 編寫(xiě)代碼,使用TKSMonitor51 仿真器進(jìn)行仿真調(diào)試。
六. 實(shí)驗(yàn)預(yù)習(xí)要求
閱讀本書(shū)的2.8.9 節(jié)內(nèi)容,理解本實(shí)驗(yàn)儀硬件結(jié)構(gòu),分析實(shí)驗(yàn)連線分配給LCM 的
地址,編寫(xiě)實(shí)驗(yàn)程序,編譯連接后使用TKSMonitor51 仿真器進(jìn)行仿真調(diào)試。
七. 實(shí)驗(yàn)參考程序
/*************************************************************
* 文件名:LCM_DRIVE.C
* 功能:圖形液晶TG12864B-2 驅(qū)動(dòng)程序。
* 說(shuō)明:在LCM_DRIVE.H 文件中定義了LCM 操作地址,左半屏的寫(xiě)命令操作地址為
* 2004H,寫(xiě)數(shù)
*據(jù)操作地址為2005H,右半屏的寫(xiě)命令操作地址為2000H,寫(xiě)數(shù)據(jù)操作地址為2001H;
*于GRAPHICS.C 中使用了disp_buf 作為作圖緩沖區(qū),所以LCM_WriteByte()、LCM_
*DispFill()均要更新disp_buf。
*************************************************************/
#include "CONFIG.H"
/* LCM 復(fù)位控制腳定義 */
sbit LCM_RST = P1^0;
/*************************************************************
* 名稱:LCM_Wr1Command()
* 功能:寫(xiě)命令子程序,所選屏為左半屏(CS1)。
* 入口參數(shù):command 要寫(xiě)入LCM 的命令字
*************************************************************/
#define LCM_Wr1Command(command) LCMCS1W_COM = command
/*************************************************************
* 名稱:LCM_Wr2Command()
* 功能:寫(xiě)命令子程序,所選屏為右半屏(CS2)。
* 入口參數(shù):command 要寫(xiě)入LCM 的命令字
*************************************************************/
#define LCM_Wr2Command(command) LCMCS2W_COM = command
/*************************************************************
* 名稱:LCM_Wr1Data()
* 功能:寫(xiě)數(shù)據(jù)子程序,所選屏為左半屏(CS1)。
* 入口參數(shù):wrdata 要寫(xiě)入LCM 的數(shù)據(jù)
*************************************************************/
#define LCM_Wr1Data(wrdata) LCMCS1W_DAT = wrdata
/*************************************************************
* 名稱:LCM_Wr2Data()
* 功能:寫(xiě)數(shù)據(jù)子程序,所選屏為右半屏(CS2)。
* 入口參數(shù):wrdata 要寫(xiě)入LCM 的數(shù)據(jù)
*************************************************************/
#define LCM_Wr2Data(wrdata) LCMCS2W_DAT = wrdata
/*************************************************************
* 名稱:LCM_DispIni()
* 功能:LCM 顯示初始化。使能顯示,設(shè)置顯示起始行為0 并清屏。
* 入口參數(shù):無(wú)
* 出口參數(shù):無(wú)
*************************************************************/
void LCM_DispIni(void)
{ uint16 i;
LCM_RST = 0; // 復(fù)位驅(qū)動(dòng)芯片
for(i=0; i<500; i++);
LCM_RST = 1;
LCM_Wr1Command(LCM_DISPON); // 打開(kāi)顯示
LCM_Wr1Command(LCM_STARTROW); // 設(shè)置顯示起始行為0
LCM_Wr2Command(LCM_DISPON);
LCM_Wr2Command(LCM_STARTROW);
LCM_DispClr(); // 清屏
LCM_Wr1Command(LCM_ADDRSTRY+0); // 設(shè)置頁(yè)(行)地址
LCM_Wr1Command(LCM_ADDRSTRX+0); // 設(shè)置列地址,即列
LCM_Wr2Command(LCM_ADDRSTRY+0);
LCM_Wr2Command(LCM_ADDRSTRX+0);
}
/*************************************************************
* 名稱:LCM_WriteByte()
* 功能:向指定點(diǎn)寫(xiě)數(shù)據(jù)(一字節(jié))。
* 入口參數(shù):x x 坐標(biāo)值(0-127)
* y y 坐標(biāo)值(0-63)
* wrdata 所要寫(xiě)的數(shù)據(jù)
* 出口參數(shù):無(wú)
* 說(shuō)明:更新disp_buf 相應(yīng)存儲(chǔ)單元
*************************************************************/
void LCM_WriteByte(uint8 x, uint8 y, uint8 wrdata)
{ x = x&0x7f; // 參數(shù)過(guò)濾
y = y&0x3f;
y = y>>3;
disp_buf[y][x] = wrdata;
if(x<64) // 選擇液晶控制芯片(即CS1--控制前64 個(gè)點(diǎn),CS2--控制后64 個(gè)點(diǎn))
{ LCM_Wr1Command(LCM_ADDRSTRX+x); // 設(shè)置當(dāng)前列地址,即x 坐標(biāo)
LCM_Wr1Command(LCM_ADDRSTRY+y); // 設(shè)置當(dāng)前頁(yè)地址,即y 坐標(biāo)
for(x=0; x<5; x++); // 短延時(shí)
LCM_Wr1Data(wrdata);
}
else
{ x = x-64; // 調(diào)整x 變量值
LCM_Wr2Command(LCM_ADDRSTRX+x);
LCM_Wr2Command(LCM_ADDRSTRY+y);
for(x=0; x<5; x++);
LCM_Wr2Data(wrdata);
}
}
/*************************************************************
* 名稱:LCM_DispFill()
* 功能:向顯示屏填充數(shù)據(jù)
* 入口參數(shù):filldata 要寫(xiě)入LCM 的填充數(shù)據(jù)
* 出口參數(shù):無(wú)
* 說(shuō)明:會(huì)更新disp_buf 相應(yīng)存儲(chǔ)單元
*************************************************************/
void LCM_DispFill(uint8 filldata)
{ uint8 x, y;
LCM_Wr1Command(LCM_STARTROW); // 設(shè)置顯示起始行為0
LCM_Wr2Command(LCM_STARTROW);
for(y=0; y<8; y++)
{ LCM_Wr1Command(LCM_ADDRSTRY+y); // 設(shè)置頁(yè)(行)地址
LCM_Wr1Command(LCM_ADDRSTRX); // 設(shè)置列地址
LCM_Wr2Command(LCM_ADDRSTRY+y);
LCM_Wr2Command(LCM_ADDRSTRX);
for(x=0; x<64; x++)
{ LCM_Wr1Data(filldata);
LCM_Wr2Data(filldata);
disp_buf[y][x] = filldata;
disp_buf[y][x+64] = filldata;
}
}
}
(ASCII 碼顯示函數(shù)及畫(huà)直線函數(shù)見(jiàn)原文件)
/*************************************************************
* 文件名:LCM_DISP.C
* 功能:DP_51PRO 實(shí)驗(yàn)儀圖形液晶顯示實(shí)驗(yàn)。先在屏幕上的隨機(jī)位置顯示隨機(jī)數(shù)字
* (0--9),然后調(diào)用畫(huà)直線函數(shù)以屏幕中心為中點(diǎn)畫(huà)對(duì)稱的直線,最后顯示一個(gè)簡(jiǎn)單的窗
* 口。
*************************************************************/
#include "CONFIG.H"
/*************************************************************
* 名稱:DelayS()
* 功能:長(zhǎng)軟件延時(shí)。
* 入口參數(shù):delayno 延時(shí)時(shí)間控制
*************************************************************/
void DelayS(uint16 delayno)
{ uint16 i;
for(; delayno>0; delayno--)
{ for(i=0; i<1000; i++);
}
}
/*************************************************************
* 名稱:main()
* 功能:主函數(shù),初始化圖形液晶模塊,在屏幕上的隨機(jī)位置顯示隨機(jī)數(shù)字(0--9),
* 然后調(diào)用畫(huà)直線函數(shù)以屏幕中心為中點(diǎn)畫(huà)對(duì)稱的直線,最后顯示一個(gè)簡(jiǎn)單的窗口。
*************************************************************/
void main(void)
{ uint8 i;
uint8 bak;
while(1)
{ LCM_DispIni(); // 初始化圖形液晶模塊
/* 提示加載程序,即顯示"Load..." */
LCM_DispStr(6, 3, "Load" );
for(i=0; i<5; i++)
{ LCM_DispChar(6, i+7, '.');
DelayS(10);
}
/* 數(shù)字顯示演示 */
srand(168); // 初始化隨機(jī)種子
LCM_DispClr();
for(i=0; i<250; i++)
{ uint8 x, y;
x = rand()&0x07; // 取得隨機(jī)顯示位置
y = rand()&0x0f;
bak = rand()%10 + '0'; // 取得隨機(jī)顯示數(shù)字'0'--'9'
LCM_DispChar(x, y, bak);
DelayS(2);
}
#define CENTER_X 64
#define CENTER_Y 32
/* 直線演示。由于直線要基于中心點(diǎn),具有對(duì)稱性,所以只要隨機(jī)取出第一個(gè)點(diǎn),
即可計(jì)算出總線對(duì)稱點(diǎn),兩點(diǎn)便可確定一條直線。這樣做達(dá)到不同直線不同角度
的目的。 */
LCM_DispClr();
for(i=0; i<250; i++)
{ uint8 x0, y0;
uint8 x1, y1;
/* 取第一個(gè)點(diǎn)坐標(biāo) */
x0 = rand()&0x7f; // 取得隨機(jī)起點(diǎn)
y0 = rand()&0x3f;
/* 計(jì)算出中心對(duì)稱點(diǎn) */
x1 = 2*CENTER_X - x0;
y1 = 2*CENTER_Y - y0;
Line(x0, y0, x1, y1, 1);
DelayS(5);
}
/* 畫(huà)窗口演示 */
LCM_DispClr();
Rectangle(0, 0, 127, 63, 1); // 顯示窗口
HLine(0, 10, 127, 1);
RLine(10, 0, 10, 1);
Line(0, 0, 10, 10, 1);
Line(10, 0, 0, 10, 1);
RLine(120, 10, 63, 1); // 顯示滾動(dòng)條
RectangleFill(120, 20, 127, 30, 1);
LCM_DispStr(4, 4, "DP-51PROC" ); // 在窗口中顯示內(nèi)容
LCM_DispStr(5, 1, "www.zlgmcu.com" );
DelayS(1500);
} // end of while(1) ...
}
八. 實(shí)驗(yàn)思考題
(1) 如何進(jìn)行漢字顯示?
(提示:漢字是由固定點(diǎn)陣格式組成的圖形,字模一般有16×16 和24×24 等)
(2) 如何實(shí)現(xiàn)動(dòng)畫(huà)顯示?
(提示:不斷循環(huán)操作--顯示圖像,短延時(shí),擦除原圖像,顯示新圖像……)
評(píng)論