由于液晶顯示器(LCD)具有功耗低、體積小、質(zhì)量輕、超薄等其他顯示器無(wú)法比擬的優(yōu)點(diǎn),它廣泛用于各種智能型儀器和低功耗電子產(chǎn)品中。點(diǎn)陣式(或圖形式) LCD不僅可以顯示字符、數字,還可以顯示各種圖形、曲線(xiàn)及漢字,并且可以實(shí)現屏幕上下左右滾動(dòng)、動(dòng)畫(huà)、閃爍、文本特征顯示等功能,用途十分廣泛。本文在簡(jiǎn)介液晶顯示器MG-12232的驅動(dòng)器SED1520F0A的結構、功能的基礎上,介紹了PIC16F877單片機的LCD硬件接口電路和軟件編程特點(diǎn)。 一、PIC16F877與MG-12232的硬件接口電路 1.SED1520F0A的接口信號 SED1520F0A屬行列驅動(dòng)及控制合一的小規模液晶顯示驅動(dòng)芯片,電路簡(jiǎn)單,經(jīng)濟實(shí)用,內含振蕩器,只須外接振蕩電阻即可工作。模塊工作的穩定性好。SED1520F0A與微處理器的接口信號如下。 DB0~DB7:數據總線(xiàn)。 A0:數據/指令選擇信號。A0=1表示出現在數據總線(xiàn)上的是數據;A0=0,表示出現在數據總線(xiàn)上的是指令或讀出的狀態(tài)。 RES:接口時(shí)序類(lèi)型選擇。RES=1為M6800時(shí)序,其操作信號是E和R/W;RES=0為Intel8080時(shí)序,操作信號是RD和WR。 RD(E):在Intel 8080時(shí)序時(shí)為讀,低電平有效;在M6800時(shí)序時(shí)為使能信號,是個(gè)正脈沖,在下降沿處為寫(xiě)操作,在高電平時(shí)為讀操作。 WR(R/W):在Intel 8080時(shí)序時(shí)為寫(xiě),低電平有效;在M6800時(shí)序時(shí)為讀、寫(xiě)選擇信號,R/W=1為讀,R/W=0為寫(xiě)。 SED1520F0A與兩種總線(xiàn)的接口信號和時(shí)序的詳細資料見(jiàn)液晶顯示模塊使用手冊。 2.MG-12232模塊的引腳說(shuō)明 MG-12232模塊共有18個(gè)引腳,各引腳定義如表1所列。 表1 MG-12232模塊的引腳定義
3.PIC16F877與MG-12232模塊的接口電路 現以功能強、價(jià)格低的PIC16F877為例說(shuō)明PIC與MG-12232模塊的硬件接口電路。其接口控制時(shí)序采用M6800操作時(shí)序,這樣 SED1520F0A引出的控制信號R/W,A0,E1和E2由PIC16F877的I/O端口portb的4個(gè)腳控制。接口電路如圖1所示。圖中利用可調電阻R3實(shí)現液晶的背光亮度調節,直接用電阻R2驅動(dòng)液晶的背光燈。由于PIC16F877的位操作指令豐富,所以用軟件不難模擬出M6800操作時(shí)序。 二、接口軟件編程 1.SED1520F0A指令集 SED1520F0A液晶顯示驅動(dòng)器有13條指令。表2所列的以與M6800系列MPU接口為例(RES=1)而總結出的指令。 表2 SED1520F0A指令集
2.MG-12232模塊的編程 下面是以圖1的接口電路為例編寫(xiě)的只含E1主方式的程序(表1中E1=1,E2=0)。E2從方式(表1中E1=0,E2=1)的程序類(lèi)推。 在系統程序的初始化部分應該對程序中用到的寄存器和臨時(shí)變量作說(shuō)明,如: lcdfial equ 0x20 ;存放標志位 sbdata equ lcdflag+1 ;存放顯示數據 clmadd equ sbdata+1 ;存放列地址 pageadd equ clmadd+1 ;存放頁(yè)地址 pagenum equ pageadd+1 ;存放總頁(yè)數 clmsum equ pagenum+1 ;存放總列數 intscode equ clmsum+1 ;存放指令代碼 讀液晶顯示器狀態(tài)子程序 Ste bsf STATUS,RP0;選中存儲區1 movlw 0xff movwf TRISD ;設置D口為輸入 bcf STATUS,RP0;選中存儲區0 bsf PORTB,4 ;E1=1 bsf PORTB,1 ;R/W=1 bcf PORTB,0 ;A0=0 Tae movf PORTD,0 ;將狀態(tài)字讀入W中 movwf lcdfiag ;將W中的狀態(tài)字存入lcdfiag中 btfsc lcdflag,7 ;判斷D7位是否為0 goto Tae ;D7=1,為忙狀態(tài) return 對液晶顯示器發(fā)指令子程序(指令保存在W寄存器中) Cwe Movwf intscode ;指令暫存intscode Bcf PORTB,1 ;R/W=0 Bcf PORTB,0 ;A0=0 movf intscode,0 movwf PORTD bcf PORTB,4 ;E1=0寫(xiě)入指令 return 對液晶顯示器寫(xiě)數據子程序(數據保存在W寄存器中) Dwe Movwf sbdata ;數據暫存sbdata Movf clmadd,0 Call Cwe ;設置列地址 Call Ste Bsf STATUS,RP0 clrf TRISD ;設置D口為輸出方式 bcf STATUS,RP0 bsf PORTB,4 ;E1=1 bcf PORTB,1 ;R/W=0 bsf PORTB,0 ;A0=1 movf sbdata,0 movwf PORTD bcf PORTB,4 ;E1=0,寫(xiě)入數據 call Ste inct clmadd,1 ;列地址加1 return 液晶顯示器開(kāi)顯示、關(guān)顯示和清屏子程序 Disp ;開(kāi)E1顯示 movlw 0xal ;將控制命令放在W中 call Cwe bsf PORTB,4 ;E1=1 call Ste ;判是否忙 bsf STATUS,RP0 clrf TRISD ;設置D口輸出方式 bcf STATUS,RP0 bsf PORTB,4 ;E1=1 bsf PORTB,1 ;R/W=1 bcf PORTB,0 ;A0=0 bsf STATUS,RP0 movlw 0xff movwf TRISD ;設置D口輸入方式 bcf STATUS,RP0 movf PORTD,0 movwf lcdflag ;讀入狀態(tài)并查詢(xún) btfsc lcdflag,5 ;是否確定打開(kāi) goto Disp return Disoff ;關(guān)E1顯示 movlw 0xae ;控制命令入在W中 call Cwe bsf PORTB,4 ;E1=1 bsf PORTB,1 ;R/W=1 bcf PORTB,0 ;A0=0 bsf STATUS,RP0 movlw 0xff movwf TRISD bcf STATUS,RP0 movf PORTD,0 movwf lcdfiag ;讀入狀態(tài)并查詢(xún) btfss lcdfiag,5 ;判是否關(guān)閉 gogo Disoff return Cler ;清屏 movlw 0xb8 ;設置頁(yè)地址代碼 movwf pageadd movlw 0x04 movwf pagenum ;設置總頁(yè)數 clr1 movf pageadd,0 call Cwe movlw 0x50 ;設置總列數 movwf clmsum ;80或60列 movlw 0x00 movwf clmadd ;設置起始列 clr2 movlw 0x00 call Dwe ;寫(xiě)入00H clar decfsz clmsum,1 ;本頁(yè)未清完 goto pageadd,1 ;頁(yè)號增1 decfsz pagenum,1 ;4頁(yè)未清完 goto clr1 ;返回繼續 return 有了以上的通用子程序,就可以構造出各種顯示程序,如字符、漢字、曲線(xiàn)等。當然,在這些程序執行前必須對液晶進(jìn)行初始化。初始化的順序為:關(guān)顯示→正常顯示驅動(dòng)設置→占空比設置→復位→ADC選擇→清屏→開(kāi)顯示。程序如下: 初始化子程序 Lcdinit call Disoff ;關(guān)顯示 movlw 0xa4 ;靜態(tài)顯示驅動(dòng) call Cwe movlw 0xe2 ;復位 call Cwe movlw 0xa0 ;ADC選擇正常輸出 call Cwe movlw 0x9 ;占空比為1/32 call Cwe call Cler ;清零 call Disp ;開(kāi)顯示 return 對于字符、漢字和曲線(xiàn)顯示的原理是類(lèi)似的。它們都是以字節為單位進(jìn)行顯示。關(guān)鍵在于形成字模庫時(shí)必須保證每個(gè)上字節數據的最高位是與每一列最下面一個(gè)點(diǎn)相對應,最低位與每一列最上面點(diǎn)相對應。當然,這可以用專(zhuān)門(mén)的軟件來(lái)生成相應的代碼,然后再將這些代碼逐字節地寫(xiě)到相應的頁(yè)和列。 結束語(yǔ) PIC單片機與液晶模塊的接口只在硬件上滿(mǎn)足液晶模塊的接口要求,軟件上能夠模擬出要求的時(shí)序,并且初始化正確后,就可以隨心所欲地顯示信息了。 以上接口電路和程序在PIC試驗板上調試通過(guò),可作為其他單片機與LCD接口的參考。 |