這是我最近在做MSP430開發(fā)時(shí)整理出的一些關(guān)于12864的資料,供大家參考。
單片機(jī)課程設(shè)計(jì)報(bào)告 基于單片機(jī)MSP430G2553的LCD 12864的顯示 專業(yè)班級(jí): 學(xué)生姓名: 學(xué) 號(hào): 指導(dǎo)教師: 設(shè)計(jì)時(shí)間:
一、設(shè)計(jì)任務(wù)與要求 1、在LCD上顯示文字,字符 2、用C語(yǔ)言寫關(guān)于MSP430G2553相關(guān)的代碼 3、掌握LCD12864的運(yùn)用方法 二、硬件模塊介紹 1、MSP430芯片 MSP430 是美國(guó)Texas Instruments(TI)公司于1996年開始推向市場(chǎng)的超低功耗微處理器。除了超低功耗這一特點(diǎn)外,在MSP430 系列產(chǎn)品中還集成了很多功能模塊,可以應(yīng)用于各個(gè)方面,使得用一片MSP430 芯片就能完成以前要用多片芯片組合才能完成的功能,大大地縮小了產(chǎn)品的體積,并且降低了成本。因此,MSP430 系列一經(jīng)推出,就受到了業(yè)內(nèi)人士的歡迎。迄今為止,MSP430 已經(jīng)廣泛應(yīng)用于各個(gè)領(lǐng)域,尤其是便攜式儀器儀表、監(jiān)測(cè)、醫(yī)療器械以及汽車電子等領(lǐng)域。 2、LCD12864 (1)概述 帶中文字庫(kù)的128×64是一種具有4位/8位并行、2線或3線串行多種接口方式,內(nèi)部含有國(guó)標(biāo)一級(jí)、二級(jí)簡(jiǎn)體中文字庫(kù)的點(diǎn)陣圖形液晶顯示模塊;其顯示分辨率為128×64, 內(nèi)置8192個(gè)16×16點(diǎn)漢字,和128個(gè)16×8點(diǎn)ASCII字符集.利用該模塊靈活的接口方式和簡(jiǎn)單、方便的操作指令,可構(gòu)成全中文人機(jī)交互圖形界面。可以顯示8×4行16×16點(diǎn)陣的漢字. 也可完成圖形顯示.低電壓低功耗是其又一顯著特點(diǎn)。由該模塊構(gòu)成的液晶顯示方案與同類型的圖形點(diǎn)陣液晶顯示模塊相比,不論硬件電路結(jié)構(gòu)或顯示程序都要簡(jiǎn)潔得多,且該模塊的價(jià)格也略低于相同點(diǎn)陣的圖形液晶模塊。 (2)基本特性 - 低電源電壓(VDD:+3.0--+5.5V)
- 顯示分辨率:128×64點(diǎn)
- 內(nèi)置漢字字庫(kù),提供8192個(gè)16×16點(diǎn)陣漢字(簡(jiǎn)繁體可選)
- 內(nèi)置 128個(gè)16×8點(diǎn)陣字符
- 2MHZ時(shí)鐘頻率
- 顯示方式:STN、半透、正顯
- 驅(qū)動(dòng)方式:1/32DUTY,1/5BIAS
- 視角方向:6點(diǎn)
- 背光方式:側(cè)部高亮白色LED,功耗僅為普通LED的1/5—1/10
- 通訊方式:串行、并口可選
- 內(nèi)置DC-DC轉(zhuǎn)換電路,無(wú)需外加負(fù)壓
- 無(wú)需片選信號(hào),簡(jiǎn)化軟件設(shè)計(jì)
- 工作溫度: 0℃ - +55℃ ,存儲(chǔ)溫度: -20℃ - +60℃
(3)模塊接口說(shuō)明如表3-5所示: 表3-5 LCD12864接口說(shuō)明 管腳號(hào) | 管腳名稱 | 電平 | 管腳功能描述 | 1 | VSS | 0V | 電源地 | 2 | VCC | 3.0+5V | 電源正 | 3 | V0 | - | 對(duì)比度(亮度)調(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 | 使能信號(hào) | 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ū)動(dòng)電壓輸出端 | 19 | A | VDD | 背光源正端(+5V)(見注釋3) | 20 | K | VSS | 背光源負(fù)端(見注釋3) |
*注釋1:如在實(shí)際應(yīng)用中僅使用串口通訊模式,可將PSB接固定低電平,也可以將模塊上的J8和“GND”用焊錫短接。 *注釋2:模塊內(nèi)部接有上電復(fù)位電路,因此在不需要經(jīng)常復(fù)位的場(chǎng)合可將該端懸空。 *注釋3:如背光和模塊共用一個(gè)電源,可以將模塊上的JA、JK用焊錫短接。 三、方案設(shè)計(jì)與論證 12864有兩種工作模式 1、方案一 LCD12864的并行模式: 并行模式就是常用的8位數(shù)據(jù)線,4為控制線。這種方式雖然占用的IO口較多,但是向液晶收發(fā)數(shù)據(jù)較容易實(shí)現(xiàn),數(shù)據(jù)傳輸速度較快。所以在一些連續(xù)顯示多幅圖畫,演示動(dòng)畫或?qū)︼@示的實(shí)時(shí)性要求較高的場(chǎng)合應(yīng)該考慮這種方式。其中在并行模式中,在向液晶寫數(shù)據(jù)或命令前,要進(jìn)行液晶忙標(biāo)志判斷 BF,要確定液晶顯示不忙了,才能進(jìn)行操作。接線方式如圖: 
2、方案二 LCD12864的串行模式: 串行模式只用到了兩根線WR,EN于單片機(jī)進(jìn)行通信。這種方式可以大大減少單片機(jī)IO口的開銷,適用于IO口資源有限的單片機(jī)(如msp430g2553)。但是這種方式實(shí)現(xiàn)起來(lái)較麻煩,數(shù)據(jù)的傳輸效率不高。對(duì)于一般的文字,簡(jiǎn)單圖形的顯示還是可以的。 SCLK:串行同步時(shí)鐘線,每操作一位數(shù)據(jù)都要有一個(gè)SCLK跳變沿,而且在這里是上升沿有效。也即是說(shuō),每次SCLK由低電平變?yōu)楦唠娖降乃查g,液晶控制器將SID上的數(shù)據(jù)讀入或輸出。 SID:串行數(shù)據(jù),每一次操作都由三個(gè)字節(jié)數(shù)據(jù)組成,第一個(gè)字節(jié)向控制器發(fā)送命令控制字,告訴控制器接下來(lái)是什么操作,若為寫指令則發(fā)送11111000 (0xf8),若為若為寫數(shù)據(jù)則發(fā)送11111010(0xfa),若為讀狀態(tài)則發(fā)送11111100(0xfc),若為讀數(shù)據(jù)則發(fā)送11111110(0xfe)。 第二個(gè)字節(jié)的高4位為發(fā)送指令或數(shù)據(jù)的高4位,第二個(gè)字節(jié)的低4位補(bǔ)0. 第三個(gè)字節(jié)的高4位為發(fā)送指令或數(shù)據(jù)的低4位,第三個(gè)字節(jié)的低4位補(bǔ)0 接線方式如圖: 
綜上,由于MSP430G2553的IO口比較少,所以我選方案二 四、硬件設(shè)計(jì) 雖然開發(fā)板上的電壓有3.8V,但是由于LCD的最佳工作電壓是5V,所以在3.8V工作下的LCD12864并不能正常工作,所以我采用的是外接5V電壓,將IO口輸出的3.8V電壓用74HC04芯片做成的緩沖器轉(zhuǎn)換成5V,總體設(shè)計(jì)如下圖: 
五、軟件設(shè)計(jì) 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)時(shí)鐘為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;//第一個(gè)字節(jié)s_id為oxf8,寫命令
- }
- else
- {
- s_id|=0x04;//第一個(gè)字節(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ù)一次輸入為三個(gè)字節(jié),第一個(gè)為控制字,第二個(gè)為數(shù)據(jù)或命令的高四位,第三個(gè)為數(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點(diǎn)陣,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)試 剛開始的時(shí)候以為3.8V的電壓可以使LCD12864正常工作,結(jié)果怎么修改程序都不顯示文字,以為是程序中的時(shí)序?qū)戝e(cuò)了,但是改了還是沒用,又以為是電路接線出錯(cuò)了,重新接 線后還是沒用,后來(lái)才想到可能是電壓不夠,結(jié)果外接電源真的有用了。  七、總結(jié) 通過這次設(shè)計(jì),我學(xué)會(huì)了LCD12864的基本工作原理和運(yùn)用,掌握了一些MSP430單片機(jī)的基本運(yùn)用和編程方法,最重要的是在調(diào)試過程中讓我懂得了最什么是都要考慮周全,遇到什么事都不能慌,問題要一個(gè)一個(gè)解決,不能急,也不能輕易放棄。 八、參考文獻(xiàn) [1] 蘇小紅等編著.C語(yǔ)言大學(xué)實(shí)用教程(第三版).北京:電子工業(yè)出版社,2012 [2] 張晞,王德銀,張晨編著.MSP430 系列單片機(jī)實(shí)用C 語(yǔ)言程序設(shè)計(jì).北京:人民郵電出版社,2005
完整的Word格式文檔51黑下載地址,還附帶了430驅(qū)動(dòng)12864的其他相關(guān)資料:
http://www.raoushi.com/bbs/dpj-103116-1.html
|