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