1.簡介
LCD1602是很多單片機愛好者較早接觸的字符型液晶顯示器,它的主控芯片是HD44780或者其它兼容芯片。與此相仿的是LCD12864液晶顯示器,它是一種圖形點陣顯示器,能顯示的内容比LCD1602要豐富得多,除了普通字符外,還可以顯示點陣圖案,帶有漢字庫的還可以顯示漢字,它的并行驅動方式與LCD1602相差無幾,所以,在這裡花點時間是值得的。
一般來說,LCD1602有16條引腳,據說還有14條引腳的,與16腳的相比缺少了背光電源A(15腳)和地線K(16腳)。這塊LCD1602的型号是HJ1602A,是繪晶科技公司的産品,它有16條引腳。如圖1所示:
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) 引腳定義
首先,1602液晶顯示屏除了電源、地以外,有3個控制引腳 RS R/W E 和8個數據引腳DB0-7。建議8個數據引腳接在同一組上,程序寫起來比較簡單。硬件連接參考如圖。
當我們想在指定位置寫入内容時,要先指定地址,如在第一行第一位寫入,地址位是00H,再加上DB7的1,即80H(0010000000),第二行第一位是40H,再加上DB7的1,即C0H(0011000000),依次類推。
LCD的已有的字模存儲在CGROM中,自定義的存儲在CGRAM,留給自定義的位置隻有8個地址,字模地址為01000000-01000111八個地址,也就是最多自定義8個符号或者圖形。
根據這條指令,來寫一個攝氏度℃的自定義符号,對應圖如下
**上面的數據也可以用8X8的字模軟件進行獲取字符數據**
用zimo221軟件, 新建一個8*8的圖像,留出左邊3列,用右邊5列點出自定義字符,選擇取模方式C51,就可得到對應的編碼
字符對應的數組為table【】={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00},将℃寫入指定的位置之前,要先把對應數組寫入CGRAM存儲,再寫入DDRAM顯示。如果直接用已有的字符,可以直接把數組寫入DDRAM顯示。
區分清楚自定義字符和已有字符,程序就簡單了。主要步驟是延時函數、寫指令、寫數據、初始化、主函數。
下面舉兩個例子,寫入常規字符串12345,寫入字符串℃。
```c
程序一
#include<reg52.h> //包含頭文件
#define uint unsigned int //預定義
#define uchar unsigned char
sbit rs=P2^6; //1602的數據/指令選擇控制線
sbit rw=P2^5; //1602的讀寫控制線
sbit en=P2^7; //1602的使能控制線
/*P0口接1602的D0~D7*/
uchar code table[]="1234"; //要顯示的内容放入數組table
void delay(uint n) //延時函數
{
uint x,y;
for(x=n;x>0;x--)
for(y=110;y>0;y--);
}
void lcd_wcom(uchar com) //1602寫命令函數
{
rs=0; //選擇指令寄存器
rw=0; //選擇寫
P0=com; //把命令字送入P2
delay(5); //延時一小會兒,讓1602準備接收數據
en=1; //使能線電平變化,命令送入1602的8位數據口
en=0;
}
void lcd_wdat(uchar dat) //1602寫數據函數
{
rs=1; //選擇數據寄存器
rw=0; //選擇寫
P0=dat; //把要顯示的數據送入P2
delay(5); //延時一小會兒,讓1602準備接收數據
en=1; //使能線電平變化,數據送入1602的8位數據口
en=0;
}
void lcd_init() //1602初始化函數
{
lcd_wcom(0x38); //8位數據,雙列,5*7字形
lcd_wcom(0x0c); //開啟顯示屏,關光标,光标不閃爍
lcd_wcom(0x06); //顯示地址遞增,即寫一個數據後,顯示位置右移一位
lcd_wcom(0x01); //清屏
}
void main() //主函數
{
uchar m=0;
lcd_init(); //液晶初始化
lcd_wcom(0x80); //顯示地址設為80H(即00H,)上排第一位
for(m=0;m<4;m ) //将table[]中的數據依次寫入1602顯示
{
lcd_wdat(table[m]);
delay(200);
}
while(1); //動态停機
}
```
```c
程序二
#include<reg52.h> //包含頭文件
#define uint unsigned int //預定義
#define uchar unsigned char
sbit rs=P2^6; //1602的數據/指令選擇控制線
sbit rw=P2^5; //1602的讀寫控制線
sbit en=P2^7; //1602的使能控制線
/*P0口接1602的D0~D7*/
uchar code table[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00}; //要顯示的内容放入數組table
void delay(uint n) //延時函數
{
uint x,y;
for(x=n;x>0;x--)
for(y=110;y>0;y--);
}
void lcd_wcom(uchar com) //1602寫命令函數
{
rs=0; //選擇指令寄存器
rw=0; //選擇寫
P0=com; //把命令字送入P2
delay(5); //延時一小會兒,讓1602準備接收數據
en=1; //使能線電平變化,命令送入1602的8位數據口
en=0;
}
void lcd_wdat(uchar dat) //1602寫數據函數
{
rs=1; //選擇數據寄存器
rw=0; //選擇寫
P0=dat; //把要顯示的數據送入P2
delay(5); //延時一小會兒,讓1602準備接收數據
en=1; //使能線電平變化,數據送入1602的8位數據口
en=0;
}
void lcd_init() //1602初始化函數
{
lcd_wcom(0x38); //8位數據,雙列,5*7字形
lcd_wcom(0x0c); //開啟顯示屏,關光标,光标不閃爍
lcd_wcom(0x06); //顯示地址遞增,即寫一個數據後,顯示位置右移一位
lcd_wcom(0x01); //清屏
}
void main() //主函數
{
uchar m;
lcd_init(); //液晶初始化
lcd_wcom(0x40);//設定CGRAM地址,把自定義字符存儲進去
for(m=0;m<8;m ) //将table[]中的數據依次寫入1602顯示
{
lcd_wdat(table[m]);
delay(200);
}
lcd_wcom(0x85); //顯示地址設為85H,上排中間位
lcd_wdat(0);
while(1); //動态停機
}
```
總結:區分DDRAM和CGRAM,DDRAM是字符對應在屏幕上的位置,CGRAM是把自己定義的字符存在8個字節裡,即lcd_wcom(0x40)。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!