1. 程式人生 > >51單片機實現SMC1602液晶屏顯示實例

51單片機實現SMC1602液晶屏顯示實例

del 遍歷 思路 unsigned 初始化 移動 display -1 當前

————————————————————————————————————————————

LCD1602

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

  • 1602的意思是每行顯示16個字符,一共可以顯示兩行。如果是12232液晶(圖形型液晶)則表示由122列32行組成,即共有122*32個點
  • p.s.註意使用溫度,通常液晶的工作範圍為0~+55℃,存儲溫度範圍為-22~+60℃。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

引腳情況:

技術分享

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

基本操作時序:

狀態

輸入

輸出

讀狀態

  • RS=0
  • R/W=1
  • E=1
  • D0~D7=狀態字

讀數據

  • RS=1
  • R/W=1
  • E=1
  • D0~D7=數據

寫指令

  • RS=0
  • R/W=0
  • E=1
  • D0~D7=指令碼
  • E=1

寫數據

  • RS=1
  • R/W=0
  • E=1
  • D0~D7=數據
  • E=1

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

RAM內部映射:80個字節

技術分享

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

狀態字說明://狀態字反應了當前液晶屏的情況,當STA7為1時說明顯示器正在忙碌狀態,不可進行操作

  • STA0~STA6表示當前地址指針的數值
  • STA7表示讀/寫使能,=1表示進制,=0表示允許

    技術分享

    p.s.原則上每次對控制器讀寫操作之前都必須進行讀寫檢測,確保STA7=0,實際操作中由於單片機操作速度慢於液晶控制的反應速度,可以不進行讀寫檢測而只進行簡短的延時。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

數據指針設置:

用戶可以通過以下的數據地址指針訪問內部的80個字節RAM,用來設置數據地址

80H+地址碼(0~27H,40~67H

例:對第一個地址進行操作,0x80+0x01

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

其他指令碼:

01H

顯示清屏(數據指針清零,所有顯示清零)

02H

顯示回車(數據指針清零)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

初始化:

  • 顯示模式設置:38H

    技術分享

  • 顯示開/關及光標設置

    技術分享

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

讀寫操作時序:

  • 讀操作

技術分享

  • 寫操作

    技術分享

  • 操作時間參數

    技術分享

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

操作方式:

  • 對LCD的操作可以分為數據和指令兩部分。
  • 通過操作RS,R/W,E,執行四種操作:讀狀態,讀數據,寫指令,寫數據
  • D0~D7用來輸入輸出指令碼和數據

————————————————————————————————————————————

LCD1602使用實例:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

設計要求:

使用LCD1602顯示兩行字符,顯示兩行字,兩個按鍵控制著顯示或清屏

技術分享

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

設計思路:

  • 初始化液晶顯示屏 //參照上文"初始化"
    • 打開使能
    • 指令碼操作
      • 設置16*2顯示,5*7點陣,8位數據結構
      • 開顯示,顯示光標,不閃爍
      • 讀寫完字符後地址指針+1,光標+1,整屏顯示不移動
      • 清屏
      • 設置地址顯示的首字符
  • 初始化中斷
    • 打開中斷
    • 外部中斷0和1
  • 死循環等待中斷
  • 按鍵中斷
    • 按鍵"顯示"
      • 循環寫入數據(字符數組)
      • 指令"換行"
      • 循環寫入第二行數據
    • 按鍵"清屏"
      • 指令"清屏"
  • 子函數 //參照上文"讀寫操作時序表"
    • 寫數據
    • 寫指令

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

實現代碼:

 1 #include <reg52.h>
 2 typedef unsigned char uchar;
 3 sbit en = P3 ^ 4;
 4 sbit rs = P3 ^ 5;
 5 uchar code table1[] =
 6 {
 7     "SMC1602 0x01..."
 8 };
 9 uchar code table2[] =
10 {
11     "      Hugh Dong."
12 };
13 void Delay(uchar m)
14 {
15     uchar i, j;
16     for (i = m; i > 0; --i)
17         for (j = 110; j > 0; --j);
18 }
19 /* 寫數據 */
20 void write_date(uchar date)
21 {
22     //參考寫操作時序圖
23     rs = 1; //RS高電平,寫數據
24     P2 = date; //寫入數據,對應時序圖t_SP2數據建立
25     Delay(5);
26     en = 1; //打開使能,給E一個高脈沖,開始寫入數據
27     Delay(5);
28     en = 0; //關閉使能,寫入數據完成
29 }
30 /* 寫指令 */
31 void write_com(uchar com)
32 {
33     //基本原理同寫數據
34     rs = 0; //RS低電平,寫指令
35     P2 = com;
36     Delay(5);
37     en = 1;
38     Delay(5);
39     en = 0;
40 }
41 /* 初始化LCD */
42 void Init()
43 {
44     en = 1;
45     write_com(0x38); //00111000 設置16*2顯示,5*7點陣,8位數據接口
46     write_com(0x0E); //00001110 開顯示,顯示光標,不閃爍
47     write_com(0x06); //00000110 讀寫字符後地址指針+1,光標+1,屏幕不移動
48     write_com(0x01); //清屏
49     write_com(0x80 + 0x01); //設置數據地址指針從第一個開始
50 }
51 int main()
52 {
53     /* 初始化LCD */
54     Init();
55     Delay(100);
56     /* 初始化中斷 */
57     EA = 1;
58     EX0 = 1;
59     EX1 = 1;
60     /* 死循環 */
61     while(1);
62 }
63 void Display()interrupt 0 using 1
64 {
65     uchar i;
66     for (i = 0; i < 16; ++i) //遍歷逐個寫入第一行數據
67     {
68         write_date(table1[i]);
69         Delay(20);
70     }
71     write_com(0x02); //換行
72     write_com(0x80 + 0x40); //數據地址指針指向第二行
73     for(i = 0; i < 16; ++i) //逐個遍歷寫入第二行數據
74     {
75         write_date(table2[i]);
76         Delay(20);
77     }
78 }
79 void Clear() interrupt 1 using 1
80 {
81     write_com(0x01);
82 }

51單片機實現SMC1602液晶屏顯示實例