單片機與液晶顯示器的接口及應用
引言
本文引用地址:http://www.j9360.com/article/170790.htm液晶顯示器(LCD)具有工作電壓低、微功耗、顯示信息量大和接口方便等優點,現在已被廣泛應用于計算機和數字式儀表等領域,成為測量結果顯示和人機對話的重要工具。液晶顯示器按其功能可分為三類:筆段式液晶顯示器、字符點陣式液晶顯示器和圖形點陣式液晶顯示器。前兩種可顯示數字、字符和符號等,而圖形點陣式液晶顯示器還可以顯示漢字和任意圖形,達到圖文并茂的效果,其應用越來越廣泛。
GTG240128液晶顯示模塊:
1 模塊特點
GTG240128圖形點陣式液晶顯示器的點陣的大小為240×128,帶背光功能。內置1片T6963C液晶顯示控制器和5片KS0086驅動器。該液晶顯示模塊具有如下特點。
● 8位并行總線接口,能直接與80系列的微處理器相連;
● 可以顯示數字、字母、漢字和圖形等;
● 具有128種5×8點陣的ASCI字符字模庫CGROM;
● 具有64kb的顯示存儲器(可被劃分為文本顯示區、圖形顯示區、文本屬性區和自定義字符庫區),并允許MCU隨時訪問;
● 可用圖形方式、文本方式以及圖形和文本合成方式顯示。
2 模塊接口引腳功能
GTG240128液晶顯示模塊與微處理器的接口共有21個引腳,各引腳功能如表1所示。
3 模塊指令集簡介
GTG240128液晶顯示模塊使用了硬件初始化設置,使得其指令功能集中于顯示功能的設置上,從而加強了顯示能力。該模塊的指令可帶一個或兩個參數,也可不帶參數。若指令中含有參數,則參數必須在指令之前輸入。在每次數據或指令的寫入操作和數據的讀取操作之前都要進行狀態字檢測,只有在不“忙”的狀態下,MCU對模塊的操作才有效。其狀態位由低位到高位的含義如表2所示。
在MCU寫指令或一次讀/寫數據時,S0和S1要同時有效;當MCU使用自動讀/寫功能時,S2和S3將取代S0和S1作為忙標志位,此時MCU就要判別它是否有效;S6是考察T6963C屏讀或屏拷貝指令執行情況的標志位;S5和S7表示模塊內部的運行狀態,一般不用。
與AT89C55的接口電路
GTG240128與AT89C55的接口有直接訪問和間接訪問兩種方式。直接訪問方式就是把顯示器模塊作為存儲器或I/O設備直接掛在單片機總線上;間接訪問方式就是把顯示器模塊與單片機的某個I/O接口連接,單片機通過對該I/O口的操作間接實現對模塊的控制。本文采用直接訪問方式,硬件連接電路如圖1所示。
液晶顯示器模塊的數據線接在AT89C55的數據總線上,片選信號由地址線A7和A0提供,寄存器選擇信號由地址線A7和A1提供(指令通道地址為0xf1,數據通道地址為0xf3),讀和寫操作由AT89C55的讀寫操作信號控制;模塊Vo端所接的電位器用來調節液晶顯示器的對比度。
軟件設計
軟件采用Keil C51語言開發,主要包括三個部分:第一部分是寫指令和寫數據等面向液晶顯示模塊硬件的驅動程序;第二部分包括液晶顯示模塊初始化和清屏等通用子程序;第三部分是漢字、字符和圖形的顯示程序。
1 寫指令、寫數據子程序
這部分是液晶顯示模塊的驅動程序,所有對液晶顯示模塊的操作都是通過調用這部分程序實現的。液晶顯示模塊的指令通道地址為0xf1,數據通道的地址為0xf3,具體驅動程序如下。
#define LCD_Cmd 0xf1 //模塊指令通道地址
#define LCD_Data 0xf3 //模塊數據通道地址
//寫指令子程序
void Write_LCD_Cmd(unsigned char cmd)
{
while ((PBYTE[LCD_Cmd]3)!=3);
PBYTE[LCD_Cmd]=cmd;
}
//寫數據子程序
void Write_LCD_Data(unsigned char dat)
{
while ((PBYTE[LCD_Cmd]3)!=3);
PBYTE[LCD_Data]=dat;
}
2 初始化子程序
這部分程序是液晶顯示模塊進行顯示之前的必要工作,包括設置文本頁首地址、圖形頁首地址、文本頁地址、圖形頁地址、初始化和清屏等子程序。本文中把液晶顯示模塊的顯示存儲器分為16個文本頁和6個圖形頁。文本頁的起止地址為0x0000~0x1fff;圖形頁的起止地址為0x2000~0x7fff。
//設定文本頁首地址子程序
void Text_Home_Address(unsigned char tpage)
{
Write_LCD_Data(0);
Write_LCD_Data(tpage*0x02);
Write_LCD_Cmd(0x40); }
//設定圖形頁首地址子程序
void Graph_Home_Address(unsigned char gpage)
{
gpage+= 2;
Write_LCD_Data(0);
Write_LCD_Data(gpage*0x10);
Write_LCD_Cmd(0x42); }
//設定文本頁地址子程序
void Text_Address(unsigned char x, unsigned char y)
{
extern unsigned char textpage;
unsigned int xy;
xy=y*32+x+textpage*0x0200;
Write_LCD_Data(xy0xff);
Write_LCD_Data(xy/256);
Write_LCD_Cmd(0x24);
}
評論