找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 12008|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

基于單片機MSP430G2553的LCD12864的顯示課程設(shè)計報告

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:267370 發(fā)表于 2017-12-26 21:13 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這是我最近在做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)置漢字字庫,提供819216×16點陣漢字(簡繁體可選)
  • 內(nèi)置 12816×8點陣字符
  • 2MHZ時鐘頻率
  • 顯示方式:STN、半透、正顯
  • 驅(qū)動方式:1/32DUTY1/5BIAS
  • 視角方向:6
  • 背光方式:側(cè)部高亮白色LED,功耗僅為普通LED1/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程序

  1. #include  "msp430g2553.h"
  2. #include  "lcd.h"
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. void InitSys();
  6. void main(void)
  7. {
  8.        WDTCTL = WDTPW + WDTHOLD;                 // 關(guān)閉看門狗
  9.        InitSys();
  10.       Lcd_Init();
  11.        write_com(0x01);
  12.        W_str(1,1,"床前明月光,");
  13.        W_str(1,2,"疑是地上霜。");
  14.        W_str(1,3,"舉頭望明月,");
  15.        W_str(1,4,"低頭思故鄉(xiāng)。");           
  16. }
  17. void InitSys()
  18. {
  19.   if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)//判斷系統(tǒng)的宏是否被刪除                                    
  20.   {
  21.     while(1);//如果刪除程序就停在這里                              
  22.   }
  23.   BCSCTL1 = CALBC1_8MHZ;                  
  24.   DCOCTL = CALDCO_8MHZ;  //設(shè)置系統(tǒng)時鐘為8MHZ                 
  25. }
復(fù)制代碼

2、lcd.c程序

  1. #include <msp430g2553.h>
  2. #include "lcd.h"
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. /*=============================
  6. #define SID P2.1;
  7. #define CLCLK P2.0;
  8. 接線:LCD12864的5腳接P2.1
  9.       LCD12864的6腳接P2.0
  10.       LCD12864的4引腳直接接VCC

  11. ==============================*/

  12. #define SID_1 P2OUT|=0x02;
  13. #define SID_0 P2OUT&=~0x02;
  14. #define CLK_1 P2OUT|=0x01;
  15. #define CLK_0 P2OUT&=~0x01;
  16. #define CPU_F ((double)8000000)
  17. #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
  18. #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

  19. void W_str(uchar x,uchar y,uchar *s);
  20. void write_com(uchar x);
  21. void write_data(uchar x);
  22. void delay(uint z);
  23. void W_8bits(uchar W_bits);
  24. void W_byte(uchar rw,uchar rs,uchar W_data);
  25. void Lcd_Init(void);
  26. void delay(uint z)
  27. {
  28. uint x,y;
  29. for(x=z;x>0;x--)
  30. for(y=240;y>0;y--);
  31. }

  32. void W_8bits(uchar W_bits)
  33. {
  34. uchar i,temp;
  35. for(i=0;i<8;i++)
  36. {
  37. temp=W_bits;
  38. temp<<=i;//將數(shù)據(jù)每一位依次移到最高位
  39. if((temp&0x80)==0)//判斷每位是否為0,如果是,則SID為0,即寫入數(shù)據(jù)0
  40. {
  41. SID_0;
  42. delay_us(20);
  43. CLK_1;
  44. delay_us(40);
  45. CLK_0;
  46. delay_us(20);
  47. SID_0;
  48. }
  49. else
  50. {
  51. SID_1;
  52. delay_us(20);

  53. CLK_1;
  54. delay_us(40);

  55. CLK_0;

  56. delay_us(20);

  57. SID_0;
  58. }
  59. }
  60. }
  61. /*
  62. rw=1 則表示讀出
  63. rw=0 則表示輸入
  64. rs=1 則表示寫數(shù)據(jù)
  65. rs=0 則表示寫命令
  66. W_byte(0,0,x)寫命令x;
  67. W_byte(0,1,y)寫數(shù)據(jù)y;
  68. */
  69. void W_byte(uchar rw,uchar rs,uchar W_data)
  70. {
  71. uchar H_data,L_data,s_id=0xf8;
  72. if(rw==0)
  73. {
  74. s_id&=~0x04;//第一個字節(jié)s_id為oxf8,寫命令
  75. }
  76. else
  77. {
  78. s_id|=0x04;//第一個字節(jié)s_id為0xfa,寫數(shù)據(jù)
  79. }
  80. if(rs==0)
  81. {
  82. s_id&=~0x02;
  83. }
  84. else
  85. {
  86. s_id|=0x02;
  87. }
  88. H_data=W_data;
  89. H_data&=0xf0;//取出高四位
  90. L_data=W_data;
  91. L_data&=0x0f;//取出第四位
  92. L_data<<=4;
  93. /*串口數(shù)據(jù)一次輸入為三個字節(jié),第一個為控制字,第二個為數(shù)據(jù)或命令的高四位,第三個為數(shù)據(jù)或命令的第四位*/
  94. W_8bits(s_id);//寫入控制字
  95. W_8bits(H_data);//寫入數(shù)據(jù)或命令的高四位
  96. W_8bits(L_data);//寫入數(shù)據(jù)或命令的第四位

  97. }
  98. void Lcd_Init()
  99. {
  100. P2DIR|=0x03;//P2的低兩位為輸出
  101. CLK_0;
  102. SID_0;

  103. delay_us(5);
  104. W_byte(0,0,0x38);//設(shè)置16X2顯示,顯示5X7點陣,8位數(shù)據(jù)接口
  105. delay_us(5);
  106. W_byte(0,0,0x38);
  107. delay_us(5);
  108. W_byte(0,0,0x0c);//整體顯示開,游標(biāo)關(guān),反白關(guān)
  109. delay_us(5);
  110. W_byte(0,0,0x01);//寫入空格清屏
  111. delay_us(5);
  112. W_byte(0,0,0x02);//清DDRAM
  113. delay_us(5);
  114. W_byte(0,0,0x80);//設(shè)定首次顯示位置
  115. delay_us(5);
  116. }

  117. // x代表偏移量
  118. //y代表第幾行
  119. //*S是字符串的指針
  120. void W_str(uchar x,uchar y,uchar *s)
  121. {
  122. switch(y)
  123. {
  124. case 1:W_byte(0,0,0x80+x);break;//0x80是第一行起始位置
  125. case 2:W_byte(0,0,0x90+x);break;//0x90是第二行起始位置
  126. case 3:W_byte(0,0,0x88+x);break;//0x88是第三行起始位置
  127. case 4:W_byte(0,0,0x98+x);break;//0x98是第四行起始位置
  128. default:W_byte(0,0,0x80+x);//否則都當(dāng)成第一行處理
  129. }
  130. while(*s)
  131. {
  132. W_byte(0,1,*s);
  133. s++;
  134. }
  135. }
  136. void write_com(uchar x)
  137. {
  138. W_byte(0,0,x);
  139. }
  140. void write_data(uchar x)
  141. {
  142. W_byte(0,1,x);
  143. }

復(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




評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:30541 發(fā)表于 2019-1-2 13:56 | 只看該作者
謝謝樓主分享
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表