這是我最近在做MSP430開發(fā)時整理出的一些關(guān)于12864的資料,供大家參考。
單片機課程設(shè)計報告 基于單片機MSP430G2553的LCD 12864的顯示 專業(yè)班級: 學(xué)生姓名: 學(xué) 號: 指導(dǎo)教師: 設(shè)計時間:
一、設(shè)計任務(wù)與要求 1、在LCD上顯示文字,字符 2、用C語言寫關(guān)于MSP430G2553相關(guān)的代碼 3、掌握LCD12864的運用方法 二、硬件模塊介紹 1、MSP430芯片 MSP430 是美國Texas Instruments(TI)公司于1996年開始推向市場的超低功耗微處理器。除了超低功耗這一特點外,在MSP430 系列產(chǎn)品中還集成了很多功能模塊,可以應(yīng)用于各個方面,使得用一片MSP430 芯片就能完成以前要用多片芯片組合才能完成的功能,大大地縮小了產(chǎn)品的體積,并且降低了成本。因此,MSP430 系列一經(jīng)推出,就受到了業(yè)內(nèi)人士的歡迎。迄今為止,MSP430 已經(jīng)廣泛應(yīng)用于各個領(lǐng)域,尤其是便攜式儀器儀表、監(jiān)測、醫(yī)療器械以及汽車電子等領(lǐng)域。 2、LCD12864 (1)概述 帶中文字庫的128×64是一種具有4位/8位并行、2線或3線串行多種接口方式,內(nèi)部含有國標(biāo)一級、二級簡體中文字庫的點陣圖形液晶顯示模塊;其顯示分辨率為128×64, 內(nèi)置8192個16×16點漢字,和128個16×8點ASCII字符集.利用該模塊靈活的接口方式和簡單、方便的操作指令,可構(gòu)成全中文人機交互圖形界面?梢燥@示8×4行16×16點陣的漢字. 也可完成圖形顯示.低電壓低功耗是其又一顯著特點。由該模塊構(gòu)成的液晶顯示方案與同類型的圖形點陣液晶顯示模塊相比,不論硬件電路結(jié)構(gòu)或顯示程序都要簡潔得多,且該模塊的價格也略低于相同點陣的圖形液晶模塊。 (2)基本特性 - 低電源電壓(VDD:+3.0--+5.5V)
- 顯示分辨率:128×64點
- 內(nèi)置漢字字庫,提供8192個16×16點陣漢字(簡繁體可選)
- 內(nèi)置 128個16×8點陣字符
- 2MHZ時鐘頻率
- 顯示方式:STN、半透、正顯
- 驅(qū)動方式:1/32DUTY,1/5BIAS
- 視角方向:6點
- 背光方式:側(cè)部高亮白色LED,功耗僅為普通LED的1/5—1/10
- 通訊方式:串行、并口可選
- 內(nèi)置DC-DC轉(zhuǎn)換電路,無需外加負(fù)壓
- 無需片選信號,簡化軟件設(shè)計
- 工作溫度: 0℃ - +55℃ ,存儲溫度: -20℃ - +60℃
(3)模塊接口說明如表3-5所示: 表3-5 LCD12864接口說明 管腳號 | 管腳名稱 | 電平 | 管腳功能描述 | 1 | VSS | 0V | 電源地 | 2 | VCC | 3.0+5V | 電源正 | 3 | V0 | - | 對比度(亮度)調(diào)整 | 4 | RS(CS) | H/L | RS=“H”,表示DB7——DB0為顯示數(shù)據(jù) RS=“L”,表示DB7——DB0為顯示指令數(shù)據(jù) | 5 | R/W(SID) | H/L | R/W=“H”,E=“H”,數(shù)據(jù)被DB7——DB0 R/W=“L”,E=“H→L”, DB7——DB0的數(shù)據(jù)被寫到IR或DR | 6 | E(SCLK) | H/L | 使能信號 | 7 | DB0 | H/L | 三態(tài)數(shù)據(jù)線 | 8 | DB1 | H/L | 三態(tài)數(shù)據(jù)線 | 9 | DB2 | H/L | 三態(tài)數(shù)據(jù)線 | 10 | DB3 | H/L | 三態(tài)數(shù)據(jù)線 | 11 | DB4 | H/L | 三態(tài)數(shù)據(jù)線 | 12 | DB5 | H/L | 三態(tài)數(shù)據(jù)線 | 13 | DB6 | H/L | 三態(tài)數(shù)據(jù)線 | 14 | DB7 | H/L | 三態(tài)數(shù)據(jù)線 | 15 | PSB | H/L | H:8位或4位并口方式,L:串口方式(見注釋1) | 16 | NC | - | 空腳 | 17 | /RESET | H/L | 復(fù)位端,低電平有效(見注釋2) | 18 | VOUT | - | LCD驅(qū)動電壓輸出端 | 19 | A | VDD | 背光源正端(+5V)(見注釋3) | 20 | K | VSS | 背光源負(fù)端(見注釋3) |
*注釋1:如在實際應(yīng)用中僅使用串口通訊模式,可將PSB接固定低電平,也可以將模塊上的J8和“GND”用焊錫短接。 *注釋2:模塊內(nèi)部接有上電復(fù)位電路,因此在不需要經(jīng)常復(fù)位的場合可將該端懸空。 *注釋3:如背光和模塊共用一個電源,可以將模塊上的JA、JK用焊錫短接。 三、方案設(shè)計與論證 12864有兩種工作模式 1、方案一 LCD12864的并行模式: 并行模式就是常用的8位數(shù)據(jù)線,4為控制線。這種方式雖然占用的IO口較多,但是向液晶收發(fā)數(shù)據(jù)較容易實現(xiàn),數(shù)據(jù)傳輸速度較快。所以在一些連續(xù)顯示多幅圖畫,演示動畫或?qū)︼@示的實時性要求較高的場合應(yīng)該考慮這種方式。其中在并行模式中,在向液晶寫數(shù)據(jù)或命令前,要進行液晶忙標(biāo)志判斷 BF,要確定液晶顯示不忙了,才能進行操作。接線方式如圖: 
2、方案二 LCD12864的串行模式: 串行模式只用到了兩根線WR,EN于單片機進行通信。這種方式可以大大減少單片機IO口的開銷,適用于IO口資源有限的單片機(如msp430g2553)。但是這種方式實現(xiàn)起來較麻煩,數(shù)據(jù)的傳輸效率不高。對于一般的文字,簡單圖形的顯示還是可以的。 SCLK:串行同步時鐘線,每操作一位數(shù)據(jù)都要有一個SCLK跳變沿,而且在這里是上升沿有效。也即是說,每次SCLK由低電平變?yōu)楦唠娖降乃查g,液晶控制器將SID上的數(shù)據(jù)讀入或輸出。 SID:串行數(shù)據(jù),每一次操作都由三個字節(jié)數(shù)據(jù)組成,第一個字節(jié)向控制器發(fā)送命令控制字,告訴控制器接下來是什么操作,若為寫指令則發(fā)送11111000 (0xf8),若為若為寫數(shù)據(jù)則發(fā)送11111010(0xfa),若為讀狀態(tài)則發(fā)送11111100(0xfc),若為讀數(shù)據(jù)則發(fā)送11111110(0xfe)。 第二個字節(jié)的高4位為發(fā)送指令或數(shù)據(jù)的高4位,第二個字節(jié)的低4位補0. 第三個字節(jié)的高4位為發(fā)送指令或數(shù)據(jù)的低4位,第三個字節(jié)的低4位補0 接線方式如圖: 
綜上,由于MSP430G2553的IO口比較少,所以我選方案二 四、硬件設(shè)計 雖然開發(fā)板上的電壓有3.8V,但是由于LCD的最佳工作電壓是5V,所以在3.8V工作下的LCD12864并不能正常工作,所以我采用的是外接5V電壓,將IO口輸出的3.8V電壓用74HC04芯片做成的緩沖器轉(zhuǎn)換成5V,總體設(shè)計如下圖: 
五、軟件設(shè)計 1、main.c程序 - #include "msp430g2553.h"
- #include "lcd.h"
- #define uchar unsigned char
- #define uint unsigned int
- void InitSys();
- void main(void)
- {
- WDTCTL = WDTPW + WDTHOLD; // 關(guān)閉看門狗
- InitSys();
- Lcd_Init();
- write_com(0x01);
- W_str(1,1,"床前明月光,");
- W_str(1,2,"疑是地上霜。");
- W_str(1,3,"舉頭望明月,");
- W_str(1,4,"低頭思故鄉(xiāng)。");
- }
- void InitSys()
- {
- if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)//判斷系統(tǒng)的宏是否被刪除
- {
- while(1);//如果刪除程序就停在這里
- }
- BCSCTL1 = CALBC1_8MHZ;
- DCOCTL = CALDCO_8MHZ; //設(shè)置系統(tǒng)時鐘為8MHZ
- }
復(fù)制代碼
2、lcd.c程序 - #include <msp430g2553.h>
- #include "lcd.h"
- #define uchar unsigned char
- #define uint unsigned int
- /*=============================
- #define SID P2.1;
- #define CLCLK P2.0;
- 接線:LCD12864的5腳接P2.1
- LCD12864的6腳接P2.0
- LCD12864的4引腳直接接VCC
- ==============================*/
- #define SID_1 P2OUT|=0x02;
- #define SID_0 P2OUT&=~0x02;
- #define CLK_1 P2OUT|=0x01;
- #define CLK_0 P2OUT&=~0x01;
- #define CPU_F ((double)8000000)
- #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
- #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
- void W_str(uchar x,uchar y,uchar *s);
- void write_com(uchar x);
- void write_data(uchar x);
- void delay(uint z);
- void W_8bits(uchar W_bits);
- void W_byte(uchar rw,uchar rs,uchar W_data);
- void Lcd_Init(void);
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=240;y>0;y--);
- }
- void W_8bits(uchar W_bits)
- {
- uchar i,temp;
- for(i=0;i<8;i++)
- {
- temp=W_bits;
- temp<<=i;//將數(shù)據(jù)每一位依次移到最高位
- if((temp&0x80)==0)//判斷每位是否為0,如果是,則SID為0,即寫入數(shù)據(jù)0
- {
- SID_0;
- delay_us(20);
- CLK_1;
- delay_us(40);
- CLK_0;
- delay_us(20);
- SID_0;
- }
- else
- {
- SID_1;
- delay_us(20);
- CLK_1;
- delay_us(40);
- CLK_0;
- delay_us(20);
- SID_0;
- }
- }
- }
- /*
- rw=1 則表示讀出
- rw=0 則表示輸入
- rs=1 則表示寫數(shù)據(jù)
- rs=0 則表示寫命令
- W_byte(0,0,x)寫命令x;
- W_byte(0,1,y)寫數(shù)據(jù)y;
- */
- void W_byte(uchar rw,uchar rs,uchar W_data)
- {
- uchar H_data,L_data,s_id=0xf8;
- if(rw==0)
- {
- s_id&=~0x04;//第一個字節(jié)s_id為oxf8,寫命令
- }
- else
- {
- s_id|=0x04;//第一個字節(jié)s_id為0xfa,寫數(shù)據(jù)
- }
- if(rs==0)
- {
- s_id&=~0x02;
- }
- else
- {
- s_id|=0x02;
- }
- H_data=W_data;
- H_data&=0xf0;//取出高四位
- L_data=W_data;
- L_data&=0x0f;//取出第四位
- L_data<<=4;
- /*串口數(shù)據(jù)一次輸入為三個字節(jié),第一個為控制字,第二個為數(shù)據(jù)或命令的高四位,第三個為數(shù)據(jù)或命令的第四位*/
- W_8bits(s_id);//寫入控制字
- W_8bits(H_data);//寫入數(shù)據(jù)或命令的高四位
- W_8bits(L_data);//寫入數(shù)據(jù)或命令的第四位
- }
- void Lcd_Init()
- {
- P2DIR|=0x03;//P2的低兩位為輸出
- CLK_0;
- SID_0;
- delay_us(5);
- W_byte(0,0,0x38);//設(shè)置16X2顯示,顯示5X7點陣,8位數(shù)據(jù)接口
- delay_us(5);
- W_byte(0,0,0x38);
- delay_us(5);
- W_byte(0,0,0x0c);//整體顯示開,游標(biāo)關(guān),反白關(guān)
- delay_us(5);
- W_byte(0,0,0x01);//寫入空格清屏
- delay_us(5);
- W_byte(0,0,0x02);//清DDRAM
- delay_us(5);
- W_byte(0,0,0x80);//設(shè)定首次顯示位置
- delay_us(5);
- }
- // x代表偏移量
- //y代表第幾行
- //*S是字符串的指針
- void W_str(uchar x,uchar y,uchar *s)
- {
- switch(y)
- {
- case 1:W_byte(0,0,0x80+x);break;//0x80是第一行起始位置
- case 2:W_byte(0,0,0x90+x);break;//0x90是第二行起始位置
- case 3:W_byte(0,0,0x88+x);break;//0x88是第三行起始位置
- case 4:W_byte(0,0,0x98+x);break;//0x98是第四行起始位置
- default:W_byte(0,0,0x80+x);//否則都當(dāng)成第一行處理
- }
- while(*s)
- {
- W_byte(0,1,*s);
- s++;
- }
- }
- void write_com(uchar x)
- {
- W_byte(0,0,x);
- }
- void write_data(uchar x)
- {
- W_byte(0,1,x);
- }
-
復(fù)制代碼
3、lcd.h程序 #define uchar unsigned char #define uint unsigned int void W_str(uchar x,uchar y,uchar *s); void write_com(uchar x); void write_data(uchar x); void delay(uint z); void W_8bits(uchar W_bits); void W_byte(uchar rw,uchar rs,uchar W_data); void Lcd_Init(void); 六、系統(tǒng)的調(diào)試 剛開始的時候以為3.8V的電壓可以使LCD12864正常工作,結(jié)果怎么修改程序都不顯示文字,以為是程序中的時序?qū)戝e了,但是改了還是沒用,又以為是電路接線出錯了,重新接 線后還是沒用,后來才想到可能是電壓不夠,結(jié)果外接電源真的有用了。  七、總結(jié) 通過這次設(shè)計,我學(xué)會了LCD12864的基本工作原理和運用,掌握了一些MSP430單片機的基本運用和編程方法,最重要的是在調(diào)試過程中讓我懂得了最什么是都要考慮周全,遇到什么事都不能慌,問題要一個一個解決,不能急,也不能輕易放棄。 八、參考文獻 [1] 蘇小紅等編著.C語言大學(xué)實用教程(第三版).北京:電子工業(yè)出版社,2012 [2] 張晞,王德銀,張晨編著.MSP430 系列單片機實用C 語言程序設(shè)計.北京:人民郵電出版社,2005
完整的Word格式文檔51黑下載地址,還附帶了430驅(qū)動12864的其他相關(guān)資料:
http://www.torrancerestoration.com/bbs/dpj-103116-1.html
|