基于TMS320F2812的液晶顯示的設(shè)計
引言
近年來,DSP芯片在高速數(shù)據(jù)處理中得到了廣泛的應(yīng)用。TMS320F2812是美國德州儀器公司(TI公司)專門為工業(yè)應(yīng)用而設(shè)計的新一代DSP處理器。該芯片采用了高性能的32位中央處理器、哈佛總線結(jié)構(gòu),高性能靜態(tài)CMOS技術(shù),主頻最高可達150MHZ(時鐘周期6.67ns);具有外部存儲器接口XINTF,可擴展多達1MB的存儲空間。但是這種高速器件與慢速外設(shè)之間的接口產(chǎn)生了問題。一般來說,DSP與慢速外設(shè)的接口訪問有兩種方式:直接訪問方式和間接訪問方式。間接訪問是用DSP的數(shù)字I/O口來控制慢速外設(shè),用軟件編程來模擬外設(shè)的接口時序,加入相應(yīng)的等待延時來實現(xiàn);而直接訪問是將慢速外設(shè)與DSP特定的XINTF區(qū)相連,通過增加相應(yīng)的內(nèi)部等待狀態(tài)來實現(xiàn)時序上的匹配。TMS320F2812有多達56個獨立的可編程、多用途雙向數(shù)字I/O口,本文將利用這些I/O口,通過軟件編程模擬慢速液晶控制器ST7920的讀寫時序,實現(xiàn)與液晶通信。
1 FYD12842-0402B液晶顯示模塊簡介
點陣式液晶顯示模塊是一種集顯示、控制與驅(qū)動為一體的顯示器件,在設(shè)計中我們采用的是成都市飛宇達實業(yè)有限公司生產(chǎn)的液晶顯示模塊FYD12864-0402B,內(nèi)置ST7920液晶控制器。
FYD12864-0402B是一種具有4位/8位并行、2線或3線串行多種接口方式,內(nèi)部含有國標一級、二級簡體中文字庫的點陣圖形液晶顯示模塊。其顯示分辨率為128 64,內(nèi)置8192個16*16點漢字,和128個16*8點ASCII字符集,強大的字庫省去了很多自行編碼的麻煩;該模塊不僅可以顯示8 行16 16點陣的漢字,利用其靈活的接口方式和簡單、方便的操作指令,還可構(gòu)成全中文人機交互圖形界面;其內(nèi)置了DC~DC轉(zhuǎn)換電路,無需外加負電壓,無需片選信號,簡化了軟件設(shè)計。
總之,由該模塊構(gòu)成的液晶顯示方案與同類型的圖形點陣液晶顯示模塊相比,不論硬件電路結(jié)構(gòu)或顯示程序都要簡潔得多,具體可以參看FYD12864-0402B的使用手冊。
2 TMS320F2812與ST7920的硬件接口設(shè)計
2.1 間接硬件接口設(shè)計
TMS320F2812與ST7920的間接硬件接口設(shè)計如圖1所示。ST7920并、串口方式可選,當(dāng)PSB置高時為并行方式,置低時為串口方式。本例在實際應(yīng)用中僅使用8位并口的通訊模式,故將PSB接固定高電平。RESET為液晶復(fù)位引腳,低電平有效。V0與VOUT以圖1中方式相連可以調(diào)節(jié)LCD的對比度。本設(shè)計用TMS320F2812的GPIOA0~7作為數(shù)據(jù)接口,GPIOB0、GPIOB1分別與RS、R/W相連作為控制信號,其具體控制功能如表1所示。E為ST7920的使能信號,將其與GPIOB2相連,E=1時,配合R進行讀數(shù)據(jù)或指令;當(dāng)E=1 時,配合/W進行寫數(shù)據(jù)或指令。
圖1 TMS320F2812與ST7920的硬件接口電路
另外,在本設(shè)計中,TMS320F2812的I/O口只能接受最大3.3V的電壓,而液晶的輸出電壓有5V,因此在兩者之間需要進行電平轉(zhuǎn)換。
2.2 DSP與ST7920的軟件接口設(shè)計
DSP和液晶模塊的接口包括2部分操作:DSP讀液晶模塊狀態(tài)的操作;DSP向液晶模塊寫數(shù)據(jù)和指令的操作。這些操作的實現(xiàn)是參考液晶模塊的時序圖,產(chǎn)生滿足這些時序的接口控制邏輯。液晶的時序圖如圖2所示。
(b) ST7920讀資料時序圖
圖2 ST7920讀寫時序圖
其中,TC=1200(MIN),TPW=140(MIN),TR=TF=25(MAX),TAS=10(MIN),TAH=20(MIN),TDSW=40(MIN),TH=20(MIN),TDDR=100(MAX)(單位均為ns)
從時序圖可以看出,ST7920的RS、R/W可以同步操作,讀寫操作是由使能信號E完成的,因此,在軟件設(shè)計中關(guān)鍵是要設(shè)計出合理的E信號,以滿足ST7920的讀/寫時序。要實現(xiàn)對ST7920的正確讀寫必須使F2812的I/O口模擬時序注意滿足以下條件:
(1) 在讀寫時,必須使E信號,即IOPB2保持高信號140ns以上
(2) 在寫操作時IOPA0~IOPA7的數(shù)據(jù)必須在E信號變?yōu)榈碗娖角氨3?0ns以上
(3) 在讀、寫兩個數(shù)據(jù)之間的間隔必須大于1200ns。
此外,ST7920有內(nèi)部標志忙標志BF,BF=1表示模塊在進行內(nèi)部操作,此時模塊不接受外部指令和數(shù)據(jù);BF=0時,模塊為準備狀態(tài),隨時可接受外部指令和數(shù)據(jù)。因此,在送出一個指令前需檢查BF標志位,如不檢查,則在前一個指令和這個指令中間必須延遲一段較長的時間,等待前一個指令確定執(zhí)行完成。從程序的可移植性和通用性方面考慮,本設(shè)計選用了C語言進行軟件模塊的設(shè)計實現(xiàn)。另外,在軟件的編寫上采用了結(jié)構(gòu)體、共用體的方法,以結(jié)構(gòu)體成員的形式來訪問寄存器的某一位或者某幾位。相比以前使用的宏定義方式,這種方式實現(xiàn)了對寄存器位域的獨立訪問,為寄存器提供了更加靈活和高效的訪問手段,也大大提高了代碼的可讀性、可靠性和可維護性?,F(xiàn)給出程序如下:
void writeINS (int INS ) //DSP向液晶寫入命令
{
checkBF();//測試BF位是否忙
EALLOW;
GpioMuxRegs. GPADIR.all=0x00ff;//設(shè)GPIOA0~7為輸出引腳
EDIS;
GpioDataRegs. GPBDAT.bit.GPIOB0=0;
GpioDataRegs. GPBDAT.bit.GPIOB1=0;//寫指令到LCD,RS=0,R/W=0
GpioDataRegs. GPADAT.all=INS;//輸出指令
GpioDataRegs. GPBDAT.bit.GPIOB2=1;//E=1
Delay1();//延時140ns以上
GpioDataRegs. GPBDAT.bit.GPIOB2=0;//E=0,指令寫入LCD
}
void writeDATA(int data) //向液晶寫入數(shù)據(jù)
{
checkBF();//測試BF位是否忙
EALLOW;
GpioMuxRegs. GPADIR.all=0x00ff;//設(shè)GPIOA0~7為輸出引腳
EDIS;
GpioDataRegs. GPBDAT.bit.GPIOB0=1;
GpioDataRegs. GPBDAT.bit.GPIOB1=0;//寫數(shù)據(jù)到LCD,RS=1,R/W=0
GpioDataRegs. GPADAT.all=data;//輸出數(shù)據(jù)
GpioDataRegs. GPBDAT.bit.GPIOB2=1;//E=1
Delay1();//延時140ns以上
GpioDataRegs. GPBDAT.bit.GPIOB2=0;//E=0,數(shù)據(jù)寫入LCD
}
void checkBF()//檢查BF位,判斷LCD 是否忙
{
unsigned int check
EALLOW;
GpioMuxRegs.GPAMUX.all=0xff00;//設(shè)EVA前8腳為通用I/O口,其他為保留功能
GpioMuxRegs.GPBMUX.all=0xff00;//設(shè)GPIOB0~2為通用I/O口,其他為保留功能
GpioMuxRegs. GPBDIR.all=0x00ff;// 設(shè)GPIOB0~2為輸出引腳
EDIS;
GpioDataRegs. GPBDAT.bit.GPIOB0=0;
GpioDataRegs. GPBDAT.bit.GPIOB1=1;//讀BF的狀態(tài),RS=0,R/W=1
do {
GpioDataRegs. GPBDAT.bit.GPIOB2=1;//E=1
Check=GpioDataRegs. GPADAT.all;
Delay1();//延時140ns以上
GpioDataRegs. GPBDAT.bit.GPIOB2=0;//E=0
check=0x80✓//當(dāng)?shù)?位,即BF為0時才可以操作
}while(!check= =0x00);
}
void InitialLCD()//液晶初始化
{
writeINS(0x30);//LCD選擇為8位并行數(shù)據(jù)傳輸,不擴充指令
Delay2(5);//延時大于100us
writeINS(0x0E);//開顯示,開游標,關(guān)反白
Delay2(5);//延時大于100us
writeINS(0x01);//清屏顯示
Delay2(500);//延時大于10ms
writeINS(0x06);//DDRAM的地址計數(shù)器(AC)加1
Delay2(5);//延時大于100us
}
void Delay1()//延時子程序
{
Int i;
for ( i=0;i<5;i++ );
}
void Delay2(unsigned int nTime)
{
int ii,jj,kk=0;
for ( ii=0;ii<nTime;ii++ )
{
for ( jj=0;jj<215;jj++ )
{
kk++;
}
}
}
欲在ST7920中某一個位置顯示中文字符時,應(yīng)先設(shè)定顯示字符位置,即先設(shè)定顯示地址,再寫入中文字符編碼。當(dāng)字符編碼為兩字節(jié)時,應(yīng)先寫入高位字節(jié),再寫入低位字節(jié)。ST7920的字符顯示地址RAM地址從80H到9FH,與4行8列共32個字符顯示區(qū)域一一對應(yīng)。另外,顯示ASCII字符過程與顯示中文字符過程相同,不過在顯示連續(xù)字符時,只須設(shè)定一次顯示位置,有模塊自動對地址加1指向下一個字符位置,否則,顯示的字符中將會有一個空ASCII字符位置。本文以從字庫中顯示“液晶”字樣為例,給出顯示“液晶”字符的主程序如下:
main()
{
InitialLCD();//初始化液晶
writeINS(0x80);//設(shè)定顯示地址為首行首列
writeDATA (0xD2);
writeDATA (0xBA);//顯示“液”
writeDATA (0xBE);
writeDATA (0xA6);//顯示“晶”
for(;;);
}
3 結(jié)論
從上面的應(yīng)用介紹可看出,本文所采用的方法不需要增加硬件,電路結(jié)構(gòu)簡單,只占用了TMS320F2812的多達56個I/O引腳中的11個。所以,對剩余較多不用I/O引腳的DSP系統(tǒng)完全可以采用這種接口控制方法,絕大多數(shù)下是可以滿足要求的。通過該設(shè)計我們可以說,采用TMS320F2812模擬外部慢速設(shè)備的時序?qū)崿F(xiàn)與其外設(shè)的接口這種方法是一種簡單有效的方法,并為各種系統(tǒng)顯示、慢速外設(shè)的接口設(shè)計提供了一種可以借鑒的方法。