欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: LCD1602的單片機(jī)驅(qū)動(dòng)超詳細(xì)的學(xué)習(xí)教程 [打印本頁(yè)]

作者: 井繩開    時(shí)間: 2017-10-30 19:19
標(biāo)題: LCD1602的單片機(jī)驅(qū)動(dòng)超詳細(xì)的學(xué)習(xí)教程
寫在開始:(借此灌下水^_^ ) 之前,發(fā)了一個(gè)帖子,大意是看見殺手和水劍寫的帖子,心里也癢癢了,想寫一寫以前學(xué)習(xí)單片機(jī)過(guò)程中的一些經(jīng)歷,希望能給大家一點(diǎn)參考。無(wú)奈最近時(shí)間很是緊張,因此,一直都沒(méi)能著手整理。本打算星期六寫的,但是接到一個(gè)朋友的電話,說(shuō)想買CPLD的開發(fā)板。于是,計(jì)劃被迫打亂,只好先陪他去電子市場(chǎng)買板子。回來(lái)之后,雖然頭很暈(坐車的原因),但是不能再拖了,否則留給大家一個(gè)只說(shuō)不做的印象就不好了。雖然頭暈,但是下面的寫出來(lái)的東西可不暈。OK,LET’S GO !

       1602字符液晶在實(shí)際的產(chǎn)品中運(yùn)用的也比較多了,前幾天留意了一下,發(fā)現(xiàn)宿舍門前的自動(dòng)售水機(jī)就是采用的1602液晶進(jìn)行顯示的。而且對(duì)于單片機(jī)的學(xué)習(xí)而言,掌握1602的用法是每一個(gè)學(xué)習(xí)者必然要經(jīng)歷的過(guò)程。在此,我將使用1602過(guò)程中遇到的問(wèn)題以及感受記錄下來(lái),希望能夠給初學(xué)者帶來(lái)一點(diǎn)指導(dǎo),少走一點(diǎn)彎路。
        所謂1602是指顯示的內(nèi)容為16*2,即可以顯示兩行,每行16個(gè)字符。目前市面上字符液晶絕大多數(shù)是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780寫的控制程序可以很方便地應(yīng)用于市面上大部分的字符型液晶。

     下面我們來(lái)驅(qū)動(dòng)1602吧在1602的上排顯示“LCD1602 check ok”下排顯示“study up”程序中沒(méi)有用到忙檢測(cè),而是用的是延時(shí)函數(shù)來(lái)替代忙檢測(cè)
  1. #include<reg52.h>    //包含頭文件,這個(gè)嘛,就不用多說(shuō)了~~
  2. #define uint unsigned int  //預(yù)定義一下
  3. #define uchar unsigned char
  4. sbit rs=P3^5;    //1602的數(shù)據(jù)/指令選擇控制線
  5. sbit rw=P3^6;        //1602的讀寫控制線
  6. sbit en=P3^7;        //1602的使能控制線
  7. /*P2口接1602的D0~D7,注意不要接錯(cuò)了順序,我以前可在這上面吃過(guò)虧~*/
  8. uchar code table[]="LCD1602 check ok"; //要顯示的內(nèi)容1放入數(shù)組tablel
  9. uchar code table1[]="study up";             //要顯示的內(nèi)容2放入數(shù)組table1
  10. void delay(uint n)       //延時(shí)函數(shù)                       
  11. {
  12.     uint x,y;  
  13.     for(x=n;x>0;x--)
  14.         for(y=110;y>0;y--);
  15. }
  16. void lcd_wcom(uchar com)  //1602寫命令函數(shù)                 
  17. {
  18.     rs=0;            //選擇指令寄存器
  19.     rw=0;            //選擇寫
  20.     P2=com;            //把命令字送入P2
  21.     delay(5);            //延時(shí)一小會(huì)兒,讓1602準(zhǔn)備接收數(shù)據(jù)
  22.     en=1;           //使能線電平變化,命令送入1602的8位數(shù)據(jù)口
  23.     en=0;
  24. }
  25. void lcd_wdat(uchar dat)        //1602寫數(shù)據(jù)函數(shù)      
  26. {
  27.     rs=1;        //選擇數(shù)據(jù)寄存器
  28.     rw=0;        //選擇寫
  29.     P2=dat;        //把要顯示的數(shù)據(jù)送入P2
  30.     delay(5);        //延時(shí)一小會(huì)兒,讓1602準(zhǔn)備接收數(shù)據(jù)
  31.     en=1;        //使能線電平變化,數(shù)據(jù)送入1602的8位數(shù)據(jù)口
  32.     en=0;
  33. }
  34. void lcd_init()              //1602初始化函數(shù)      
  35. {
  36.     lcd_wcom(0x38);       //8位數(shù)據(jù),雙列,5*7字形      
  37.     lcd_wcom(0x0c);      //開啟顯示屏,關(guān)光標(biāo),光標(biāo)不閃爍
  38.     lcd_wcom(0x06);    //顯示地址遞增,即寫一個(gè)數(shù)據(jù)后,顯示位置右移一位
  39.     lcd_wcom(0x01);    //清屏
  40. }
  41. void main()            //主函數(shù)
  42. {     
  43.     uchar n,m=0;
  44.     lcd_init();                 //液晶初始化
  45.     lcd_wcom(0x80);   //顯示地址設(shè)為80H(即00H,)上排第一位      
  46.     for(m=0;m<16;m++)     //將table[]中的數(shù)據(jù)依次寫入1602顯示
  47.     {
  48.             lcd_wdat(table[m]);           
  49.             delay(200);
  50.     }
  51.     lcd_wcom(0x80+0x44); //重新設(shè)定顯示地址為0xc4,即下排第5位
  52.     for(n=0;n<8;n++)   //將table1[]中的數(shù)據(jù)依次寫入1602顯示
  53.     {     
  54.             lcd_wdat(table1[n]);
  55.            delay(200);
  56.     }
  57.     while(1);        //動(dòng)態(tài)停機(jī)
  58. }
復(fù)制代碼

程序?qū)懞煤鬅龑戇M(jìn)單片機(jī),現(xiàn)在讓我們看看效果吧

       這就是顯示的效果,你做成功了嗎?

        下面讓我們來(lái)看看如何顯示一個(gè)自定義的字符吧  
        我們從CGROM表上可以看到,在表的最左邊是一列可以允許用戶自定義的CGRAM,從上往下看著是16個(gè),實(shí)際只有8個(gè)字節(jié)可用。它的字符碼是00000000-00000111這8個(gè)地址,表的下面還有8個(gè)字節(jié),但因?yàn)檫@個(gè)CGRAM的字符碼規(guī)定0-2位為地址,3位無(wú)效,4-7全為零。因此CGRAM的字符碼只有最后三位能用也就是8個(gè)字節(jié)了。等效為0000X111,X為無(wú)效位,最后三位為000-111共8個(gè)。  
        如果我們要想顯示這8個(gè)用戶自定義的字符,操作方法和顯示CGROM的一樣,先設(shè)置DDRAM位置,再向DDRAM寫入字符碼,例如“A”就是41H。現(xiàn)在我們要顯示CGRAM的第一個(gè)自定義字符,就向DDRAM寫入00000000B(00H),如果要顯示第8個(gè)就寫入00000111(08H),簡(jiǎn)單吧!  
        好!現(xiàn)在我們來(lái)看怎么向這八個(gè)自定義字符寫入字模。有個(gè)設(shè)置CGRAM地址的指令大家還記得嗎?趕快再找出來(lái)看看。

       從這個(gè)指令可以看出指令數(shù)據(jù)的高2位已固定是01,只有后面的6位是地址數(shù)據(jù),而這6位中的高3位就表示這八個(gè)自定義字符,最后的3位就是字模數(shù)據(jù)的八個(gè)地址了。例如第一個(gè)自定義字符的字模地址為01000000-01000111八個(gè)地址。我們向這8個(gè)字節(jié)寫入字模數(shù)據(jù),讓它能顯示出“℃”
地址:01000000  數(shù)據(jù):00010000       圖示:○○○■○○○○
   01000001     00000110               ○○○○○■■○
   01000010     00001001               ○○○○■○○■
   01000011     00001000               ○○○○■○○○
   01000100     00001000               ○○○○■○○○
   01000101     00001001               ○○○○■○○■
   01000110     00000110               ○○○○○■■○
   01000111     00000000               ○○○○○○○○  

        下面我們寫一段程序讓這8個(gè)自定義字符顯示出一個(gè)心的圖案: (由于上面那個(gè)顯示程序已經(jīng)有很詳細(xì)的注釋了,因此這個(gè)程序只對(duì)與上個(gè)程序不同的地方寫注釋)
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit rs=P3^5;
  5. sbit rw=P3^6;
  6. sbit en=P3^7;
  7. uchar code table[]={0x03,0x07,0x0f,0x1f,0x1f,0x1f,0x1f,0x1f,
  8.                     0x18,0x1E,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
  9.                     0x07,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
  10.                     0x10,0x18,0x1c,0x1E,0x1E,0x1E,0x1E,0x1E,
  11.                     0x0f,0x07,0x03,0x01,0x00,0x00,0x00,0x00,
  12.                     0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x07,0x01,
  13.                     0x1f,0x1f,0x1f,0x1f,0x1f,0x1c,0x18,0x00,
  14.                     0x1c,0x18,0x10,0x00,0x00,0x00,0x00,0x00};//心圖案
  15. /*uchar  code table1[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//字符℃ */
  16. void delay(uint n)                              
  17. {
  18.     uint x,y;
  19.     for(x=n;x>0;x--)
  20.             for(y=110;y>0;y--);
  21. }
  22. void lcd_wcom(uchar com)                  
  23. {
  24.     rs=0;
  25.     rw=0;
  26.     P2=com;
  27.     delay(5);
  28.     en=1;
  29.     en=0;
  30. }
  31. void lcd_wdat(uchar dat)               
  32. {
  33.     rs=1;
  34.     rw=0;
  35.     P2=dat;
  36.     delay(5);
  37.     en=1;
  38.     en=0;
  39. }
  40. void lcd_init()                     
  41. {
  42.          lcd_wcom(0x38);            
  43.          lcd_wcom(0x0c);           
  44.          lcd_wcom(0x06);            
  45.          lcd_wcom(0x01);            
  46. }
  47. void main()
  48. {     
  49.                     char m=0;
  50.     lcd_init();
  51.     lcd_wcom(0x40);             //設(shè)定CGRAM地址
  52.     for(m=0;m<64;m++)    //將心型代碼寫入CGRAM中
  53.     {
  54.             lcd_wdat(table[m]);           
  55.     }
  56.     lcd_wcom(0x85);        //設(shè)定上排的顯示位置
  57.     for(m=0;m<4;m++)        //顯示心型圖案的上半部分
  58.     {
  59.             lcd_wdat(m);
  60.     }
  61.     lcd_wcom(0xc5);        //將顯示坐標(biāo)轉(zhuǎn)移到下排和上排相對(duì)應(yīng)的地方
  62.     for(m=4;m<8;m++)        //顯示心型圖案的下半部分
  63.     {
  64.             lcd_wdat(m);
  65.     }
  66.     while(1);
  67. }
復(fù)制代碼
讓我們一起來(lái)看看顯示的效果吧~~
在綠底黑字液晶模塊和藍(lán)底白字液晶模塊上分別顯示的效果。

下面再為大家展示幾種可能出現(xiàn)的問(wèn)題  
        1:通電之后,程序也燒寫進(jìn)去了,但是1602就是不顯示,只顯示一排黑塊(一般都是在上排8個(gè)小黑塊,記得剛開始用1602液晶的時(shí)候,被這個(gè)整怕了~~),怎么樣,你郁悶了吧,其實(shí)出現(xiàn)這種問(wèn)題的原因無(wú)非以下幾種:硬件連線上的錯(cuò)誤,這種錯(cuò)誤一般用萬(wàn)用表仔細(xì)檢查后很容易找出來(lái)。第二種情況就是硬件連接上是正確的,那么此時(shí)出問(wèn)題最大的就是程序上了,如果你用的是忙檢測(cè),看一下忙檢測(cè)函數(shù)寫對(duì)了沒(méi),如果用的是延時(shí)函數(shù),那么看看延時(shí)的時(shí)間是否夠長(zhǎng)。再就是看看時(shí)序圖,這點(diǎn)很重要的哦。如果硬件和軟件都沒(méi)有錯(cuò),那么就要考慮1602是否壞了,但是出現(xiàn)這種情況的幾率很小,如果遇到這種情況,你可以考慮去買彩票了~~  
        下面這種情況你遇到過(guò)嗎?我遇到過(guò)了的,搞得我很是郁悶~~

     我做的實(shí)驗(yàn)是要液晶顯示ABC這三個(gè)字母,并且開光標(biāo),光標(biāo)閃爍。大家可以在第一排的最后幾位看到ABC和光標(biāo)都已經(jīng)顯示出來(lái)了。但是為什么其它位會(huì)顯示這么多8呢?嘿嘿~~郁悶吧。出現(xiàn)這種情況的原因就是在初始化液晶的時(shí)候,要把清屏指令放在最后面,否則就會(huì)出現(xiàn)上圖這種情況。怎么樣,第一次聽說(shuō)吧~不過(guò),我不知道其它的液晶是否也有這個(gè)問(wèn)題出現(xiàn),至少我用的這塊就有這種情況,但是我的另一個(gè)液晶則沒(méi)有這種情況出現(xiàn),不管是在一開始就清屏還是最后清屏。大家注意下就可以了,萬(wàn)一出現(xiàn)了這種情況,就會(huì)處理了~~

    上面這張圖是用1602作為顯示的溫度電子鐘~~上面的年月日三個(gè)字就是用自定義字符的方法顯示的。呵呵,怎么樣~~到此1602的驅(qū)動(dòng)基本上結(jié)束了,剩下的就靠大家自己去發(fā)揮了。

完整的Word格式文檔51黑下載地址(共68頁(yè)):

51單片機(jī)好學(xué)1602全過(guò)程C語(yǔ)言編程顯示很全的哦.doc (1.64 MB, 下載次數(shù): 219)



作者: bowbow123    時(shí)間: 2018-4-18 09:37
感謝lz的資料。
作者: 孫124    時(shí)間: 2018-4-23 12:28
程序燒錄完成之后LCD1602沒(méi)有任何顯示是怎么回事
作者: czj_    時(shí)間: 2018-4-23 18:11
程序燒進(jìn)去之后,一直顯示的都是第一行亮著16個(gè)塊,很難受,怎么都調(diào)不出來(lái)
作者: 000lll    時(shí)間: 2018-5-3 18:18
孫124 發(fā)表于 2018-4-23 12:28
程序燒錄完成之后LCD1602沒(méi)有任何顯示是怎么回事

同問(wèn)

作者: ok195688    時(shí)間: 2018-5-4 11:04
czj_ 發(fā)表于 2018-4-23 18:11
程序燒進(jìn)去之后,一直顯示的都是第一行亮著16個(gè)塊,很難受,怎么都調(diào)不出來(lái)

端口改一下!單片機(jī)是以P0為數(shù)據(jù)口的把P2改為P0就好了!
作者: xiaoxuzhou    時(shí)間: 2018-5-31 14:26
想把a(bǔ)dc0809模數(shù)轉(zhuǎn)換之后的數(shù)據(jù)顯示出來(lái)也是這么操作嗎
作者: 楊雪飛    時(shí)間: 2018-6-10 22:31
孫124 發(fā)表于 2018-4-23 12:28
程序燒錄完成之后LCD1602沒(méi)有任何顯示是怎么回事

有個(gè)V0腳,接定位器那個(gè),電位器調(diào)一下,電壓合適了才會(huì)顯示,如果引腳接線對(duì)應(yīng)程序沒(méi)有問(wèn)題,除了這個(gè)調(diào)對(duì)比度的電位器,再就是屏壞了。
作者: 楊雪飛    時(shí)間: 2018-6-10 22:33
czj_ 發(fā)表于 2018-4-23 18:11
程序燒進(jìn)去之后,一直顯示的都是第一行亮著16個(gè)塊,很難受,怎么都調(diào)不出來(lái)

重點(diǎn)檢查RS  EN什么的那幾個(gè)引腳的線接好沒(méi)有,或者與程序?qū)?yīng)了沒(méi)有
作者: 張明211    時(shí)間: 2018-10-15 14:17
學(xué)習(xí)了
作者: zhanghao0095    時(shí)間: 2018-12-9 21:10
謝謝樓主
作者: hui3210    時(shí)間: 2019-1-15 18:20
好貼,謝謝樓主


作者: 51單片機(jī)1234    時(shí)間: 2019-1-28 11:47
學(xué)習(xí)了,謝謝樓主
作者: sutuile    時(shí)間: 2019-3-15 16:28
#include "intrins.h"
unsigned char lcd_busy()               //查忙 這部很重要 否則有的顯示容易出現(xiàn)亂碼                                             
{                                                                          
    unsigned char result;                                                            
    rs = 0;
        delay(5);                                                         
    rw = 1;   
        delay(5);                                                         
    en = 1;   
        delay(5);                                                                                                                 
    result = (P0&0x80);
        delay(5);                                             
    en= 0;   
        delay(5);                                                   
    return result;             //返回值                                            
}  

void lcd_wcom(uchar com)  //1602寫命令函數(shù)                 
{
                while(lcd_busy());
    rs=0;            //選擇指令寄存器
    rw=0;            //選擇寫
    P0=com;            //把命令字送入P0
    delay(5);            //延時(shí)一小會(huì)兒,讓1602準(zhǔn)備接收數(shù)據(jù)
    en=1;           //使能線電平變化,命令送入1602的8位數(shù)據(jù)口
                _nop_();
                _nop_();
                _nop_();
    en=0;
}

......................................................


作者: sutuile    時(shí)間: 2019-3-15 16:29
  1. #include "intrins.h"

  2. unsigned char lcd_busy()               //查忙 這部很重要 否則有的顯示容易出現(xiàn)亂碼                                             

  3. {                                                                          

  4.     unsigned char result;                                                            

  5.     rs = 0;

  6.         delay(5);                                                         

  7.     rw = 1;   

  8.         delay(5);                                                         

  9.     en = 1;   

  10.         delay(5);                                                                                                                 

  11.     result = (P0&0x80);

  12.         delay(5);                                             

  13.     en= 0;   

  14.         delay(5);                                                   

  15.     return result;             //返回值                                            

  16. }  


  17. void lcd_wcom(uchar com)  //1602寫命令函數(shù)                 
  18. {
  19.                 while(lcd_busy());
  20.     rs=0;            //選擇指令寄存器
  21.     rw=0;            //選擇寫
  22.     P0=com;            //把命令字送入P0
  23.     delay(5);            //延時(shí)一小會(huì)兒,讓1602準(zhǔn)備接收數(shù)據(jù)
  24.     en=1;           //使能線電平變化,命令送入1602的8位數(shù)據(jù)口
  25.                 _nop_();
  26.                 _nop_();
  27.                 _nop_();
  28.     en=0;
  29. }
  30. ......................................................
復(fù)制代碼



作者: 太陽(yáng)黑子1    時(shí)間: 2019-4-6 21:16
對(duì)于我等初學(xué)者真的是太好了!謝謝!
作者: zxy2266    時(shí)間: 2019-4-7 09:21
要是有IIC 就好了
作者: wcs1668    時(shí)間: 2019-7-12 16:25
謝謝樓主正在用
作者: 太陽(yáng)黑子1    時(shí)間: 2020-4-9 08:50
很實(shí)用哦,謝謝!




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1