這篇篇講解一下LCD1602,學過單片機的朋友們都知道它了吧,可以說是用的最廣,最簡單,也是學液晶入門級別的一塊液晶了。LCD1602顧名思義就是兩行顯示的液晶,每行最多顯示16個字符(里面總共有160個字符),其中包括阿拉伯數(shù)字、英文字母的大小寫,常用符號,及日文的假名!每個字符對應一個ASCII碼,我們通過向液晶送相應符號的ASCII碼來顯示這個字符。
下面看一下Proteus軟件中的LCD1602,在Proteus軟件的元件庫中,LCD1602為LM016L,下面是這塊液晶的引腳圖:
具體的相關引腳和功能設定參看LCD1602的PDF文檔資料,由于篇幅問題,這里就不贅述了!
還有一點要說的就是大家在仿真LCD1602時,要是用的是DB7~DB0連單片機的P0口的話,一定要加上拉電阻,要不然驅動不了,因為單片機的四組IO口就P0的內部無上拉,驅動能力弱!看下面的圖:在P0口加了排阻(RESPACK-8)
對于自帶字符的顯示,只需要將對應的ASCII碼寫入LCD中顯示即可,這個是每個人開始學習液晶最開始要學會的了,看看數(shù)據(jù)手冊,寫寫程序,想必大家都會了,這里就不做介紹,本篇著重講解一下怎樣自定義顯示字符,比如顯示自定的字符、顯示漢字等等這些!
要顯示我們自定義的字符,就要用到LCD中的CGRAM存儲器(character generate RAM),而我們之前用的顯示自帶的字符用到的是DDRAM,兩個是不同的。看液晶手冊我們知道,CGRAM的容量是64個字節(jié),而一個字符是8個字節(jié),所以一共能顯示8個自定義的字符。內部常用字符的顯示是從0x20開始的,0x00 ~ 0x0F是專門留給自定義字符顯示用的,0x00~0x07和0x80~0x0F顯示的內容是一樣的,也就是說0x00=0x08,0x01=0x09,以此類推。CGRAM共128個位,地址是0x40~0x7F,128/8=16正好對應的是0x00~0x0F共16個,剛才說了,0x00與0x08對應,0x01與0x09對應,共16個,這并不矛盾!說了這么多,那么怎樣顯示一個自定義字符呢?
首先我們要清楚LCD1602顯示字符的點陣大小,眼力好的可以看出來,LCD1602一個顯示字符的位置是5*8的點陣,也就是說它所能顯示的點陣圖形的大小是5*8的!要顯示一個自定義的字符,首先我們要知道所顯示自定義字符的點陣數(shù)據(jù),也就是在一個5*8的點陣上那個點是黑的(將該點點黑,就是高電平----1),哪個點是白的(該點不顯示,為低電平----0),但是我們送入到LCD中的是ASCII碼,它是8位的數(shù)據(jù),而一個顯示字符的點陣大小只是5*8的,顯然不夠,顯示的辦法是8*8點陣的前三列不用,也就是不顯示,我們只用后面的5列來顯示。
然后設定我們是要定義第幾個自定義字符,前面已經(jīng)介紹了,LCD1602最多顯示8個自定義字符;然后要規(guī)定在液晶的什么位置顯示自定義字符,看過數(shù)據(jù)手冊我們知道,第一行第一個位置的地址是0x80,第二行一個位置的地址是0xC0。最后就是要顯示我們定義的第幾個字符其對應CGRAM地址的關系式是:
0x00:第一個(0x40) 0x01:第二個(0x48)
0x02:第三個(0x50) 0x03:第四個(0x58)
0x04:第五個(0x60) 0x05:第六個(0x68)
0x06:第七個(0x70) 0x07:第八個(0x78)
算了,還是畫個流程圖,這樣大家看的更清楚:(第一個顯示字符的數(shù)組數(shù)據(jù),不小心打錯了,呵呵)
接下來介紹怎樣對顯示的數(shù)組取模:給大家介紹個取模軟件,這個軟件很常見叫做zimo221,玩過點陣的和液晶的估計都知道吧,打開軟件,首先我們創(chuàng)建一個8*8點陣大小的圖形,如下圖所示:
然后呢,在里面打點,注意前三列空著不打點。這里我們顯示自定義字符顯示黑白相間的點吧,這個是我打好的,看下圖:
然后設定取模的方式:
然后生成代碼:看你是用什么程序寫,這里我是用C寫的就用C51的格式
OK,字符取模就結束了,接下來時程序:
/**********************
程序:LCD1602的驅動原理及應用
內容:顯示自定義字符
軟件:Keil uVisoin4
開發(fā)板:proteus仿真圖
作者:大海橡樹
***********************/
#include
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;//LCD的三個控制端
unsigned char table[]={0x15,0x0A,0x15,0x0A,0x15,0x0A,0x15,0x0A};
void delay(unsigned int i)
{
while(--i);
}
void Read_busy() //忙檢測,DB7為1則busy,不能進行讀寫操作 ;每次讀寫前應"讀忙"檢測
{
P0=0x00;
RS=0;
RW=1;
EN=1;
while(P0 & 0x80);
EN=0;
}
void write_LCD_command(unsigned char value)//寫命令函數(shù)
{
Read_busy();
RS=0;
RW=0;
EN=1;
P0=value;
delay(100);
EN=0;
}
void write_LCD_data(unsigned char value)//寫命令函數(shù)
{
Read_busy();
RS=1;
RW=0;
EN=1;
P0=value;
delay(100);
EN=0;
}
void init_LCD()
{
write_LCD_command(0x38);
write_LCD_command(0x0c);//開顯示,不顯示光標,且不閃爍
write_LCD_command(0x06);//每次寫入數(shù)據(jù)后地址指針加1
write_LCD_command(0x01);//清屏
}
void main()
{
unsigned char num;
init_LCD();
write_LCD_command(0x40); //對CGRAM第一個自定義字符操作,若是第二個則為0x48,其次類推(上面有對頂?shù)年P系)
for(num=0;num<8;num++)
{
write_LCD_data(table[num]);
}
write_LCD_command(0x80); //規(guī)定顯示在第一行第一個位置
write_LCD_data(0x00); //顯示第一個自定義字符 (0x40對應第一個:0x00)
while(1);
}
仿真圖:
仿真效果和我們預設的一樣,至此,自定義顯示字符就結束了。想必大家已經(jīng)會了,這個簡單的會了,就來個復雜點的,用1602顯示漢字,其實這個也是用自定義顯示的方法,只不過我們要用幾個顯示塊合成在一起拼接成一個漢字!有興趣的自己可以試一下!
下面是我寫個一個顯示漢字的,把8個自定義的字符全都用上了:
顯示:“大”字
顯示的漢字不是很好看!呵呵,不過還是能看清的!我們在LCD1602做數(shù)字鐘的時候可以用一個或兩個CGRAM來顯示年、月、日;上面的這個字8個CGRAM地址都用上了,其實我們可以用數(shù)碼管動態(tài)掃描的原理在LCD1602上顯示四個大的漢字,因為每次顯示一個漢字是8個CGRAM都用上了,所以沒次只顯示一個!根據(jù)動態(tài)掃描的原理就能夠實現(xiàn)四個漢字同時顯示!有興趣的朋友可以試一下!
顯示單個5*7點陣大小的漢字也可以,下面是我寫了個萬年歷的程序,用的就是單個的字符顯示漢字,效果不是很好,不過還行吧,如下圖所示:
LCD1602就介紹到這里,想必大家都會了!下一篇給大家介紹LCD12864液晶,帶字庫的和不帶字庫的兩種!用12864顯示動畫、溫度曲線,正弦曲線等!
|