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