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