| 摘 要:本文詳述了MSP430F149和圖形液晶顯示模塊LM12864FBC接口性能特點及方法, 設計了硬件電路以及接口軟件。 關鍵詞:低功耗;MSP430F149;LM12864FBC;硬件電路
概述
MSP430F149是德州儀器公司最近推出的MSP430系列超低功耗控制器中的一種,電源電壓范圍為1.8V至3.6V,可以用電池工作,而且使用時間長,適用于電池供電的手持設備使用。另外,液晶顯示器具有功耗低、體積小、重量輕等特點,圖形LCD除了顯示字符、數字外,還可以顯示漢字、圖形、曲線等LED無法顯示的功能,用途廣泛。因此以MSP430為核心的LCD在智能儀器儀表和低功耗電子產品行業有廣泛的發展前途。
本文在簡單介紹液晶顯示器LM12864FBC的驅動器KS0108B和KS0107B的結構和功能基礎上,介紹了MSP430F149的LCD硬件接口和軟件編程特點。
圖1 MSP430F149與LM12864FBC接口原理圖(略)
硬件設計
KS0108B的接口信號
KS0108B和KS0107B是LM12864FBC的共同驅動芯片,其中KS0107B是公共行驅動芯片,KS0108B是通過它產生的時序控制的。二片KS0108B是列驅動及控制芯片,KS0108B與微處理器的接口信號如下: DB0-DB7:數據總線; CSA、CSB:芯片選擇信號A、B,CSA(B)=1,選通列驅動左、右半部分,CSA(B)=0,不選通列驅動左、右半部分; D/I:D/I=1操作數據,D/I=0操作指令代碼; R/W:R/W=1讀操作,R/W=0寫操作; E:輸入使能。
LM12864FBC模塊的引腳說明
MSP430F149與LM12864FBC接口電路
本液晶顯示模塊是128 64的LCD,利用P3.0-P3.4作為LCD的CSA、CSB、D/I、R/W和E的控制線,P4為LCD的數據線。由于MSP430的I/O口都是復用端口,因此必須將用到的引腳設為輸入/出口。此外,MSP430是3.3V供電,而LCD是5V驅動的。
圖2 KS0108B操作流程圖(略)
軟件設計
KS0108B指令集
KS0108B一共有七條指令,從作用上可分為兩類。第一條和第二條指令為顯示狀態設置類;其余指令為數據讀/寫操作指令。 LM12864FBC的軟件編程 (1)讀液晶顯示器狀態子程序 void lcdstate(int cs) //cs代表液晶的邊csa,csb { int csflag; P4DIR=0x00;//P4口為輸入口 while(1) { if(cs==1) {P3OUT =BIT0; P3OUT&=~BIT1; P3OUT&=~BIT2; P3OUT =BIT3; //CSA=1,CSB=0,D/I=0,R/W=1,以便讀液晶狀態 } else { P3OUT&=~BIT0; P3OUT =BIT1; P3OUT&=~BIT2; P3OUT =BIT3; //CSA=1,CSB=0,D/I=0,R/W=1,以便讀液晶狀態 } P30UT&=~BIT4; delay(3); P30UT =BIT4; delay(3); P30UT&=~BIT4; //E信號低-高-低滿足時序要求 csflage=P4DIR&0x80; if(csflag=0) break;//若液晶空閑,停止等待 } }
(2)對液晶顯示器發指令子程序 void transport(trans,cs) //該函數采用形參和實參傳送數據,trans為一個形參 int trans,cs; { lcdstate(cs);//判斷液晶是否忙? P4DIR= 0xFF;//P4口為輸出口 delay(3); if(cs==1) {P3OUT =BIT0; P3OUT&=~BIT1; P3OUT&=~BIT2; P3OUT&=~BIT3; //CSA=1,CSB=0,D/I=0,R/W=0,以便寫入指令 } else { P3OUT&=~BIT0; P3OUT =BIT1; P3OUT&=~BIT2; P3OUT&=~BIT3;//CSA=0,CSB=1,D/I=0,R/W=0,以便寫入指令 } P4DIR=0xFF trans; //需要寫入的命令字送數據線 P30UT&=~BIT4; delay(3); P30UT =BIT4; delay(3); P30UT&=~BIT4; //E信號低-高-低滿足時序要求 }
(3) 寫數據子程序 void wdata(write,clmadd,cs) //write為需寫入的數據,clmadd為列地址 int write,clmadd,cs; { transport(clmadd,cs);//設置列地址 lcdstate(cs) ;//判斷液晶是否忙? P4DIR= 0xFF;//P4口為輸出口 delay(3); if(cs==1) {P3OUT =BIT0; P3OUT&=~BIT1; P3OUT =BIT2; P3OUT&=~BIT3; //CSA=1,CSB=0,D/I=1,R/W=0,以便寫入要顯示的數據 } else { P3OUT&=~BIT0; P3OUT =BIT1; P3OUT =BIT2; P3OUT&=~BIT3; //CSA=1,CSB=0,D/I=1,R/W=0,以便寫入要顯示的數據 } P4DIR=0xFF write; //需要寫入的命令字送數據線 P30UT&=~BIT4; delay(3); P30UT =BIT4; delay(3); P30UT&=~BIT4; //E信號低-高-低滿足時序要求 }
(4)開,關,清屏子程序 void dison(cs) //顯示開(關) int cs; { int csflage; while(1) {transport(0x03e,cs);//發送控制命令,若關顯示則為transport(0x03f,cs) lcdstate(cs); P4DIR=0x00;//P4口為輸入口 while(1) if(cs==1) {P3OUT =BIT0; P3OUT&=~BIT1; P3OUT&=~BIT2; P3OUT =BIT3; //CSA=1,CSB=0,D/I=0,R/W=1,以便讀液晶狀態 } else { P3OUT&=~BIT0; P3OUT =BIT1; P3OUT&=~BIT2; P3OUT =BIT3; //CSA=1,CSB=0,D/I=0,R/W=1,以便讀液晶狀態 } P30UT&=~BIT4; delay(3); P30UT =BIT4; delay(3); P30UT&=~BIT4; //E信號低-高-低滿足時序要求 csflage=P4DIR&0x80; if(csflag=0) break;//若液晶空閑,停止等待 } } void clear(int cs) //清屏子程序 { int pagenum,pageadd,clmadd,clmsum;//定義局部變量 for(pagenum=0x08,pageadd=0x0b8;pagenum>0;pagenum--,pageadd++) { transport(pageadd,cs); for(clmsum=0x40;clmsum<0x7f;clmsum++) {lcdstate(cs) ;//判斷液晶是否忙? wdata(0x00,clmsum,cs); } } }
有了上述各子程序后,就可以在顯示屏上任意位置顯示漢字、字符、數字和其他圖形。
結束語 上述部分只是我們在開發輸電線測量變頻電源系統時使用的顯示模塊部分,已經在MSP430仿真器fet_r304上調試通過,在整個系統中效果不錯。本系統體積小、功耗少、接口簡單,值得在智能儀器儀表和低功耗電子產品行業推廣。 |