1.簡介
作爲各類單片機實物設計的常用顯示屏,LCD1602是一種專門用於顯示字母、數字、符號等點陣式LCD,其1602是指LCD顯示的內容爲16X2,即可以顯示兩行,每行16個字符(1個漢字佔用2個字符)。
2.硬件參數
(1) LCD1602主要技術參數
a.顯示容量:16×2個字符
b.芯片工作電壓:4.5—5.5V
c.工作電流:2.0mA(5.0V)
d.模塊最佳工作電壓:5.0V
e.字符尺寸:2.95×4.35(W×H)mm
(2) 引腳定義
LCD1602引腳主要有邏輯電源引腳VDD,VSS;背光帶電源引腳BLA,BLK;數據引腳D0-D7、RS、R/W、EN;偏壓信號引腳VL;其中:
- VL引腳:爲液晶顯示器對比度調整端,接正電源時對比度最弱,接地時對比度最高,對比度過高時會產生“鬼影”,使用時可以通過一個10K的電位器調整對比度;
- RS引腳:RS爲寄存器選擇,高電平時選擇數據寄存器、低電平時選擇指令寄存器
- R/W引腳:R/W爲讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。當RS和R/W共同爲低電平時可以寫入指令或者顯示地址,當RS爲低電平R/W爲高電平時可以讀忙信號,當RS爲高電平R/W爲低電平時可以寫入數據。
- EN引腳:E端爲使能端,當E端由高電平跳變成低電平時,液晶模塊執行命令。
(3)電路圖
其中可調電阻P用於調整顯示器的對比度。電阻R作爲限流電阻,防止過流燒壞顯示屏背光燈。
3.控制程序
LCD1602顯示屏控制程序簡化下來,也相對簡單,只需要實現寫數據、寫指令、初始化三個控制函數即可實現對LCD1602的控制。(寫操作一般不用,這裏就省略不說)
(1)寫操作時序
要實現下面的寫數據和寫指令函數,都是以寫操作時序來進行編程,實現有效的控制;其中,可以通過寫時序和RS引腳的定義,寫數據和寫指令的區別在於RS引腳的電平;RS爲高電平時,寫數據;RS爲低電平時,寫指令。
(2)寫數據函數
//寫數據
void write_data(uchar date)
{
LCDRS=1;
P0=date;
LCDdelay(5);
LCDEN=1;
LCDdelay(5);
LCDEN=0;
}
(3)寫指令函數
//寫命令
void write_com(uchar com)
{
LCDRS=0;
P0=com;
LCDdelay(5);
LCDEN=1;
LCDdelay(5);
LCDEN=0;
}
(4)初始化函數
LCD1602初始化需要做以下設置:
a.設置寫操作:R/W設爲低電平;
b.屏幕設置模式:寫指令38H;
c.打開顯示,關閉光標:寫指令0CH;
d.設置顯示光標移動位置:寫指令06H;
e.設置字符顯示位置:寫指令(字符顯示的起始位置);
void Init1602()
{
uchar i=0;
LCDRW = 0;
write_com(0x38);//屏幕初始化
write_com(0x0c);//打開顯示 無光標 無光標閃爍
write_com(0x06);//當讀或寫一個字符是指針後一一位
write_com(0x01);//清屏
write_com(0x80);//設置位置
}
注:由於對LCD1602進行控制時不需要實現讀操作,所以R/W在初始化後恆爲低電平(或者此引腳直接對地短路)。
4.顯示字符
要在LCD1602上顯示特定的字符,實際上就是對LCD1602的DDRAM上寫入對應的數據,顯示屏便顯示你想要的字符。
(1)DDRAM地址映射圖
從RAM可以看出來,是讀的意思,地址與顯示位置如下,每行40個地址,1602只用到前16個,共兩行,對應關係如圖:
根據寫指令格式,由於地址爲7位,在寫入地址是,第8位恆爲1,如圖:
當我們想在指定位置寫入內容時,要先指定地址,如在第一行第一位寫入,地址位是00H,再加上DB7的1,即80H(0010000000),第二行第一位是40H,再加上DB7的1,即C0H(0011000000),依次類推。
比如要在第1行第3位寫入“HELLO WOLRD”,即先寫入地址,再寫入數據:
write_com(0x40+0); //第1行第3位
write_com(‘H’);
write_com(‘O’);
.....
write_com(‘D’);
如果是寫在第2行第2位:
write_com(0x40+0x80+2); //第2行第2位
//寫數據與上面一樣
(2)顯示函數
爲了程序的簡潔與方便,我們將顯示程序整合成一個顯示函數:
void Display_1602(uchar x,uchar y,uchar *str)
{
unsigned char addr;
if (y == 0)
{
addr = 0x00 + x; //第一行的x位置顯示
}
else
{
addr = 0x40 + x; //第二行x的位置顯示
}
write_com(addr + 0x80);
while (*str != '\0')
{
write_data(*str++);
}
}
要實現上面顯示就比較簡單:
第1行第3位顯示“HELLO WOLRD”:
Display_1602(3,1,”HELLO WOLRD”);
第2行第2位顯示“HELLO WOLRD”:
Display_1602(2,2,”HELLO WOLRD”);
更多LCD1602設計資料及例程 請關注公衆號,首頁回覆“1602”獲取資料