【51微控制器】(手把手教你)1602液晶屏-基礎篇
1602液晶簡介
1602液晶也叫1602字元型液晶,16x02,每行16個字元顯示兩行。它是一種專門用來顯示字母、數字、符號等的點陣型液晶模組。它由若干個5X7或者5X11等點陣字元位組成,每個點陣字元位都可以顯示一個字元,每位之間有一個點距的間隔,每行之間也有間隔,起到了字元間距和行間距的作用,正因為如此所以它不能很好地顯示圖形(用自定義CGRAM,顯示效果也不好)。
#度娘告知
引腳介面說明
1602液晶上有16個引腳,上面依次標了上述符號,與微控制器上的介面依次對應連線即可,如圖:
原理圖
想知道如何操作液晶屏就需要看清楚自己微控制器上與液晶屏連線引腳的控制原理圖,我使用的是郭天祥的51微控制器中的原理圖。線上標的相同符號的地方是連在一起的。
1.直接接地
2.接VCC
3.接在一個滑動變阻上再與地相接 。VL為液晶顯示器對比度調整端,接正電源時對比度最弱,接地時對比度最高,對比度過高時會產生“鬼影”,使用時可以通過一個10K的電位器調整對比度。
4.接RS->P3.5 。RS為暫存器選擇,高電平時選擇資料暫存器、低電平時選擇指令暫存器。
5.直接接地(因為我們一般都只讓液晶屏顯示即寫入,所以這個微控制器原理圖直接接地)
6.LCDEN使能端->P3.4。當E端由高電平跳變成低電平時,液晶模組執行命令。
7-14.資料寫入->P0
15.接一個電阻後(電阻為了限流,延長LCD的使用壽命也防止燒壞背光燈)與VCC連線(液晶屏背光正極)
16.直接接地(液晶屏背光負極)
1602 11條指令
指令1:清屏指令。
(1)清楚液晶顯示器,即將DDRAM的內容全部填入空白的ASCII碼20H
(2)地址計數器(AC)的值設為0
(3)游標復位到地址00H位置(顯示器的左上方)
指令2:游標復位指令。
(1)游標返回地址00H
(2)AC值設為0
(3)DDRAM的內容不變
指令3:游標和顯示模式設定。設定每次輸入1位資料後游標的移位方向,並且設定輸入後字元是否移動。
I/D(游標移動方向): 高:右移 低:左移
S(螢幕上所有文字是否移動):高 :有效右移 低:無效
指令4:顯示開關控制。控制顯示器開/關、游標顯示/關閉以及游標是否閃爍
D(控制整體顯示的開與關):高:開顯示 低:關顯示
C(控制游標的開與關): 高:有游標 低:無游標
B(控制游標是否閃爍): 高:閃爍 低:不閃爍
指令5:游標或顯示移位。
S/C(移動文字/標) | R/L | |
0 | 0 | 游標左移1格且AC-1 |
0 | 1 | 游標右移1格且AC+1 |
1 | 0 | 顯示器上字元全部左移1格但游標不動 |
1 | 1 | 顯示器上字元全部右移1格但游標不動 |
指令6:功能設定命令。設定資料匯流排位數、顯示的行數及字型。
DL(資料匯流排位數):高:8 低:4
N(顯示行數) :高:2 低:1
F(顯示點陣型別) :高:5*7點陣 低:5*10點陣
指令7:設定CGRAM地址指令。
設定下一個要存入資料的CGRAM的地址。
指令8:設定DDRAM地址指令。
設定下一個要存入資料的DDRAM的地址。
指令9:讀取忙訊號或AC地址指令。
(1)讀取忙訊號BF的內容
BF(液晶顯示器是否忙):高:忙,暫時無法接收微控制器送來的資料或指令 低:可接收
(2)讀取地址計數器(AC)的內容
指令10:資料寫入DDRAM或CGRAM指令。
(1)將字元碼寫入DDRAM,以使液晶顯示屏顯示出相對於的字元
(2)使用者自己設計的圖形存入CGRAM
指令11:從CGRAM或DDRAM讀出資料的指令。讀取DDRAM或CGRAM中的內容。
時序圖
這裡我們只講寫所以讀的時序圖我就不放出來了。感興趣的讀者這些資料買1602的商家都有提供。看到這裡對於才接觸液晶屏的你來說應該也不是問題,前面已經接觸過串列埠通訊等內容學會了如何看時序圖(還是不會的話可以對應後面的程式碼看),這裡唯一阻攔你的應該就是時間問題。商家也為我們提供了資料,不過查了很多資料都說不同廠家的時間是不一樣的,不過時間單位應該都差不了多少所以有些東西還是要看廠家的不同來定。
時間都是ns級別的,而微控制器的操作都是us級的,所以我們基本不用擔心,如果不放心或者不成功可以適當利用延時函式。 還是不太理解CGROM、CGRAM及DDRAM的朋友可以看看:
程式碼
/*
用液晶1602以從右側移入方式第一行顯示“Hello everyone!”
第二行顯示“Welcome to my blog!”
*/
#include <reg52.h>
#include <string.h> //strlen包含的標頭檔案
#define uint unsigned int
#define uint8 unsigned char
uint8 code table[]="Hello everyone!";
uint8 code table1[]="Welcome to my blog!";
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit dula=P2^6;
sbit wela=P2^7;
uint8 num;
void delay(uint z);
void write_com(uint8 com);
void write_data(uint8 date);
void init();
void Write1602_Str(uint addr,uint length,uint *pbuf);
void main()
{
init();
Write1602_Str(0x80+0x10,strlen(table),table); //Hello everyone!
Write1602_Str(0x80+0x50,strlen(table1),table1); //Welcome to my blog!
while(1)
{
write_com(0x18);
delay(200); //移動速度,可自定
}
}
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=0;j<921;j++);
}
void write_com(uint8 com)
{
lcdrs=0; //RS=0->指令
// R/W我的微控制器上引腳直接接地了所以不用設定
delay(1); //tsp1
P0=com; //DB0-DB7
delay(1); //tsp2
lcden=1; //tR
delay(1); //tpW
lcden=0; //tF、tHD1、tHD2
}
void write_data(uint8 date)
{
lcdrs=1; //RS=1->資料
delay(1);
P0=date;
delay(1);
lcden=1;
delay(1);
lcden=0;
}
void init()
{
dula=0; //段選位關閉,因為P0口同時也是控制資料管的口
wela=0; //同上
lcden=0; //使能關(操作之前看時序圖都需要E開始是0後來變為1)
write_com(0x38); //設定16*2顯示,5*7點陣,8位資料口
write_com(0x0e); //設定開顯示,不顯示游標
write_com(0x06); //寫一個字元後地址指標加1
write_com(0x01); //顯示清0,資料指標清0
}
void Write1602_Str(uint8 addr,uint8 length,uint8 *pbuf)
{
uint8 i;
write_com(addr);
for(i=0;i<length;i++)
write_data(pbuf[i]);
}
總結: 1602顯示字元必要條件: (1)液晶顯示模式的設定 (2)字元顯示位置的指定 (3)待顯示字元的字模程式碼