———————————————————————————————————————————— LCD1602 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ...
————————————————————————————————————————————
LCD1602
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- 1602的意思是每行顯示16個字元,一共可以顯示兩行。如果是12232液晶(圖形型液晶)則表示由122列32行組成,即共有122*32個點
- p.s.註意使用溫度,通常液晶的工作範圍為0~+55℃,存儲溫度範圍為-22~+60℃。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
引腳情況:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
基本操作時序:
狀態 |
輸入 |
輸出 |
讀狀態 |
|
|
讀數據 |
|
|
寫指令 |
|
無 |
寫數據 |
|
無 |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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 }