從前村裏的狗蛋撿到了阿拉丁神燈,狗蛋向神燈許了三個願望。第一個願望狗蛋說“我想學會如何驅動LCD1602”,神燈說:“so easy”,然後把這篇博客的鏈接發給了他。神燈問他還有兩個願望是什麼,狗蛋說:“希望神燈給這篇博客點贊加評論”,神燈看了文章但是忘記點贊,三天後,神燈猝。
目錄
1. LCD1602基本介紹
2. LCD1602原理圖
3. 引腳說明
4. 基本時序操作
5. 狀態字說明
6. 1602地址映射
7. 指令說明
8. 程序及仿真
OK,這當然是和大家開個玩笑,你們的肯定就是對我最大的支持與鼓勵,在接觸我們的1602之前先來放鬆一下神經,接下來,我們就來了解LCD1602不能說的祕密。
管他三七二十一,我用液晶顯示器————我國著名詩人1602。
LCD1602基本介紹:
從他的名言中我們可以定性的知道,LCD1602是一款液晶顯示器。
LCD是 Liquid Crystal Display也就是液晶顯示器的英文縮寫。
1602是由於他可顯示的區域是由16列2行的小黑塊構成,如下圖:
LCD1602原理圖:
引腳說明:
引腳 | 功能說明 |
---|---|
GND、VCC | 1,2號是電源正負極,15,16號是LCD背光電源正負極 |
VEE | 液晶顯示偏壓信號,給的電壓不同對比度有所區別 |
RS | 數據/命令選擇端(H/L) |
RW | 讀寫選擇端(H/L) |
E | 液晶使能端 |
D0~D7 | 寫入數據/命令端 |
基本時序操作:
操作 | 輸入 | 輸出 |
---|---|---|
讀狀態 | RS=L,RW=H,E=H | D0~D7狀態字 |
寫指令 | RS=L,RW=L.D0~D7=指令碼,E=高脈衝 | 無 |
讀數據 | RS=H,RW=H,E=H | D0~D7數據 |
寫數據 | RS=H,RW=L,D0~D7=數據,E=高脈衝 | 無 |
(高脈衝就是一個信號由0到1再到0一個非常短暫而迅速的過程)
狀態字說明:
在每次進行讀寫操作時,要進行讀寫檢測,確保STA7(D7)爲0。
STA0~STA6(D0-D6)爲最開始寫入的指針地址。
1602地址映射圖:
每一行有40個字節,但是隻能顯示前16個字節,後面的地址主要是爲了顯示移動字幕而設置。
指令說明:
具體程序:
#include <reg52.h>
#define DB P3
sbit RS = P2^5;
sbit RW = P2^6;
sbit E = P2^7;
void read_sta(); //讀狀態
void write_data(unsigned char dat); //寫數據
void write_cmd(unsigned char cmd); //寫指令
void set_cursor(unsigned int x,unsigned int y); //設置初始顯示位置
void show_str(unsigned int x,unsigned int y,unsigned char *str); //顯示字符
void lcd_init(); //初始化LCD1602
void main()
{
lcd_init();
show_str(0,0,"LQJ_LCD1206");
show_str(0,1,"HELLO_WORLD");
while(1);
}
void read_sta()
{
unsigned char sta;
DB = 0XFF;
RS = 0;
RW = 1;
do
{
E = 1;
sta = DB;
E = 0;
}
while(sta & 0x80); //檢測到STA7=0,即可開始讀寫操作
}
void write_data(unsigned char dat)
{
read_sta(); //對照寫數據的時序來看
RS = 1;
RW = 0;
DB = dat;
E = 1;
E = 0;
}
void write_cmd(unsigned char cmd)
{
read_sta();
RS = 0; //寫指令的時序來看
RW = 0;
DB = cmd;
E = 1;
E = 0;
}
void set_cursor(unsigned int x,unsigned int y)
{
unsigned char address;
if(y == 0)
address = 0x00 + x; //第一行,第x-1列
else
address = 0x40 +x; //第二行,第x-1列
write_cmd(address | 0x80); //地址或上1000 0000,寫入STA0~STA6地址值
}
void show_str(unsigned int x,unsigned int y,unsigned char *str)
{
set_cursor(x,y); //設置起始位置
while(*str != '\0') //不等於結束符就繼續寫入數據
{
write_data(*str++);
}
}
void lcd_init()
{
write_cmd(0x38); //0011 1000,設置16X2顯示,5X7點陣,8位數據接口
write_cmd(0x0c); //0000 1100,開顯示,不顯示光標
write_cmd(0x06); //0000 0110,讀一個字符後地址指針加一
write_cmd(0x01); //0000 0001,顯示清屏
}