找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 58990|回復: 14
收起左側

常用液晶的使用之LCD1602顯示自定義字符及漢字

  [復制鏈接]
ID:102668 發(fā)表于 2016-1-16 05:36 | 顯示全部樓層 |閱讀模式
這篇篇講解一下LCD1602,學過單片機的朋友們都知道它了吧,可以說是用的最廣,最簡單,也是學液晶入門級別的一塊液晶了。LCD1602顧名思義就是兩行顯示的液晶,每行最多顯示16個字符(里面總共有160個字符),其中包括阿拉伯數(shù)字、英文字母的大小寫,常用符號,及日文的假名!每個字符對應一個ASCII碼,我們通過向液晶送相應符號的ASCII碼來顯示這個字符。
下面看一下Proteus軟件中的LCD1602,在Proteus軟件的元件庫中,LCD1602為LM016L,下面是這塊液晶的引腳圖:
201210041349354711562.jpg

   具體的相關引腳和功能設定參看LCD1602的PDF文檔資料,由于篇幅問題,這里就不贅述了!
   還有一點要說的就是大家在仿真LCD1602時,要是用的是DB7~DB0連單片機的P0口的話,一定要加上拉電阻,要不然驅動不了,因為單片機的四組IO口就P0的內部無上拉,驅動能力弱!看下面的圖:在P0口加了排阻(RESPACK-8)
201210041349354728561.jpg
對于自帶字符的顯示,只需要將對應的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ù),不小心打錯了,呵呵)
201210041349354748218.jpg
接下來介紹怎樣對顯示的數(shù)組取模:給大家介紹個取模軟件,這個軟件很常見叫做zimo221,玩過點陣的和液晶的估計都知道吧,打開軟件,首先我們創(chuàng)建一個8*8點陣大小的圖形,如下圖所示:
201210041349354764481.jpg
然后呢,在里面打點,注意前三列空著不打點。這里我們顯示自定義字符顯示黑白相間的點吧,這個是我打好的,看下圖:
201210041349354784746.jpg
然后設定取模的方式:
201210041349354804819.jpg
然后生成代碼:看你是用什么程序寫,這里我是用C寫的就用C51的格式
201210041349354827416.jpg
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);
}

仿真圖:
201210041349354846799.jpg
仿真效果和我們預設的一樣,至此,自定義顯示字符就結束了。想必大家已經(jīng)會了,這個簡單的會了,就來個復雜點的,用1602顯示漢字,其實這個也是用自定義顯示的方法,只不過我們要用幾個顯示塊合成在一起拼接成一個漢字!有興趣的自己可以試一下!
下面是我寫個一個顯示漢字的,把8個自定義的字符全都用上了:
顯示:“大”字
201210041349354863640.jpg
               顯示的漢字不是很好看!呵呵,不過還是能看清的!我們在LCD1602做數(shù)字鐘的時候可以用一個或兩個CGRAM來顯示年、月、日;上面的這個字8個CGRAM地址都用上了,其實我們可以用數(shù)碼管動態(tài)掃描的原理在LCD1602上顯示四個大的漢字,因為每次顯示一個漢字是8個CGRAM都用上了,所以沒次只顯示一個!根據(jù)動態(tài)掃描的原理就能夠實現(xiàn)四個漢字同時顯示!有興趣的朋友可以試一下!
顯示單個5*7點陣大小的漢字也可以,下面是我寫了個萬年歷的程序,用的就是單個的字符顯示漢字,效果不是很好,不過還行吧,如下圖所示:
201210041349354883151.jpg

LCD1602就介紹到這里,想必大家都會了!下一篇給大家介紹LCD12864液晶,帶字庫的和不帶字庫的兩種!用12864顯示動畫、溫度曲線,正弦曲線等!


評分

參與人數(shù) 1黑幣 +30 收起 理由
北長無識 + 30

查看全部評分

回復

使用道具 舉報

ID:143128 發(fā)表于 2016-10-19 14:18 | 顯示全部樓層
仿真圖右邊那個RP1什么來的。
回復

使用道具 舉報

ID:73944 發(fā)表于 2016-10-19 18:07 | 顯示全部樓層
fresh 發(fā)表于 2016-10-19 14:18
仿真圖右邊那個RP1什么來的。

9針的排阻
回復

使用道具 舉報

ID:188580 發(fā)表于 2017-4-11 19:08 | 顯示全部樓層
為什么不能自定義顯示
回復

使用道具 舉報

ID:227688 發(fā)表于 2017-12-5 12:23 | 顯示全部樓層
哈哈  謝謝分享  51有你更精彩
回復

使用道具 舉報

ID:291815 發(fā)表于 2018-4-4 13:34 | 顯示全部樓層
感謝分享
回復

使用道具 舉報

ID:296540 發(fā)表于 2018-4-4 15:20 | 顯示全部樓層
fresh 發(fā)表于 2016-10-19 14:18
仿真圖右邊那個RP1什么來的。

下拉電阻
回復

使用道具 舉報

ID:337484 發(fā)表于 2018-6-2 11:46 | 顯示全部樓層
有幫助,感謝分享。
回復

使用道具 舉報

ID:73182 發(fā)表于 2018-6-30 15:50 | 顯示全部樓層
感謝分享,代碼實測好象延時不夠
回復

使用道具 舉報

ID:315599 發(fā)表于 2018-7-23 13:37 來自觸屏版 | 顯示全部樓層
顯示第一個字符 0x40對應0x00,    第二個字符0x48對應啥?
回復

使用道具 舉報

ID:411147 發(fā)表于 2018-10-18 15:48 | 顯示全部樓層
非常感謝樓主的分享,有收獲
回復

使用道具 舉報

ID:280405 發(fā)表于 2018-12-30 15:48 | 顯示全部樓層
謝謝樓主的分享,保存了。
回復

使用道具 舉報

ID:459303 發(fā)表于 2019-1-1 14:26 | 顯示全部樓層
萬年歷的程序是哪個?這上面只有一個程序,應該不是的吧
回復

使用道具 舉報

ID:459030 發(fā)表于 2019-2-26 14:00 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:695902 發(fā)表于 2020-3-8 23:36 | 顯示全部樓層
非常感謝,終于明白了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表