久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 44799|回復: 40
打印 上一主題 下一主題
收起左側

51單片機驅動LCD1602程序設計(C語言)很詳細的教程

  [復制鏈接]
跳轉到指定樓層
樓主
ID:116487 發表于 2018-10-24 17:13 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
51單片機驅動LCD1602程序設計C語言)

字符液晶絕大多數是基于HD44780液晶芯片的,控制原理是完全相同的,因此HD44780寫的控制程序可以很方便地應用于市面上大部分的字符型液晶。字符型LCD通常有14條引腳線或16條引腳線的LCD,多出來的2條線是背光電源線VCC(15腳)和地線GND(16腳),其控制原理與14腳的LCD完全一樣,定義如下表所示:

                                            字符型LCD的引腳定義

HD44780內置了DDRAM、CGROM和CGRAM。DDRAM就是顯示數據RAM,用來寄存待顯示的字符代碼。共80個字節,其地址和屏幕的對應關系如下表:

也就是說想要在LCD1602屏幕的第一行第一列顯示一個"A"字,就要向DDRAM的00H地址寫入“A”字的代碼就行了。但具體的寫入是要按LCD模塊的指令格式來進行的。在1602中我們用前16個就行了。第二行也一樣用前16個地址。對應如下:
                           

DDRAM地址與顯示位置的對應關系


文本文件中每一個字符都是用一個字節的代碼記錄的。一個漢字是用兩個字節的代碼記錄。在PC上我們只要打開文本文件就能在屏幕上看到對應的字符是因為在操作系統里和BIOS里都固化有字符字模。什么是字模?就代表了是在點陣屏幕上點亮和熄滅的信息數據。

例如“A”字的字模:
           01110     ○■■■○
           10001     ■○○○■
           10001     ■○○○■
           10001     ■○○○■
           11111     ■■■■■
           10001     ■○○○■
           10001     ■○○○■
     上圖左邊的數據就是字模數據,右邊就是將左邊數據用“○”代表0,用“■”代表1。看出是個“A”字了嗎?在文本文件中“A”字的代碼是41H,PC收到41H的代碼后就去字模文件中將代表A字的這一組數據送到顯卡去點亮屏幕上相應的點,你就看到“A”這個字了。
     剛才說了想要在LCD1602屏幕的第一行第一列顯示一個"A"字,就要向DDRAM的00H地址寫入“A”字的代碼41H就行了,可41H這一個字節的代碼如何才能讓LCD模塊在屏幕的陣點上顯示“A”字呢?同樣,在LCD模塊上也固化了字模存儲器,這就是CGROM和CGRAM。HD44780內置了192個常用字符的字模,存于字符產生器CGROM(Character Generator ROM)中,另外還有8個允許用戶自定義的字符產生RAM,稱為CGRAM(Character Generator RAM)。下圖說明了CGROM和CGRAM與字符的對應關系。

      
從上圖可以看出,“A”字的對應上面高位代碼為0100,對應左邊低位代碼為0001,合起來就是01000001,也就是41H。可見它的代碼與我們PC中的字符代碼是基本一致的。因此我們在向DDRAM寫C51字符代碼程序時甚至可以直接用P1='A'這樣的方法。PC在編譯時就把“A”先轉為41H代碼了。
    字符代碼0x00~0x0F為用戶自定義的字符圖形RAM(對于5X8點陣的字符,可以存放8組,5X10點陣的字符,存放4組),就是CGRAM了。后面我會詳細說的。
    0x20~0x7F為標準的ASCII碼,0xA0~0xFF為日文字符和希臘文字符,其余字符碼(0x10~0x1F及0x80~0x9F)沒有定義。

那么如何對DDRAM的內容和地址進行具體操作呢,下面先說說HD44780的指令集及其設置說明,請瀏覽該指令集,并找出對DDRAM的內容和地址進行操作的指令。共11條指令:

1.清屏指令

功能:<1> 清除液晶顯示器,即將DDRAM的內容全部填入"空白"的ASCII碼20H;
           <2> 光標歸位,即將光標撤回液晶顯示屏的左上方;
            <3> 將地址計數器(AC)的值設為0。

2.光標歸位指令

功能:<1> 把光標撤回到顯示器的左上方;
           <2> 把地址計數器(AC)的值設置為0;
            <3> 保持DDRAM的內容不變。

3.進入模式設置指令

功能:設定每次定入1位數據后光標的移位方向,并且設定每次寫入的一個字符是否移動。參數設定的
       情況如下所示:
位名              設置
I/D   0=寫入新數據后光標左移          1=寫入新數據后光標右移
S     0=寫入新數據后顯示屏不移動   1=寫入新數據后顯示屏整體右移1個字符

4.顯示開關控制指令

功能:控制顯示器開/關、光標顯示/關閉以及光標是否閃爍。參數設定的情況如下:
                位名              設置
                 D                0=顯示功能關               1=顯示功能開
                 C                0=無光標                   1=有光標
                 B                0=光標閃爍                 1=光標不閃爍

5.設定顯示屏或光標移動方向指令

功能:使光標移位或使整個顯示屏幕移位。參數設定的情況如下:
                S/C               R/L                設定情況
                0                 0                  光標左移1格,且AC值減1
                0                 1                  光標右移1格,且AC值加1
                1                 0                  顯示器上字符全部左移一格,但光標不動
                1                 1                  顯示器上字符全部右移一格,但光標不動

6.功能設定指令

功能:設定數據總線位數、顯示的行數及字型。參數設定的情況如下:
                位名              設置
                DL                0=數據總線為4位                  1=數據總線為8位
                N                 0=顯示1行                        1=顯示2行
                F                 0=5×7點陣/每字符                1=5×10點陣/每字符

7.設定CGRAM地址指令

功能:設定下一個要存入數據的CGRAM的地址。

8.設定DDRAM地址指令

功能:設定下一個要存入數據的CGRAM的地址。

9.讀取忙信號或AC地址指令

功能:<1> 讀取忙碌信號BF的內容,BF=1表示液晶顯示器忙,暫時無法接收單片機送來的數據或指令;當BF=0時,液晶顯示器可以接收單片機送來的數據或指令;
         <2> 讀取地址計數器(AC)的內容。

10.數據寫入DDRAM或CGRAM指令一覽

功能:<1> 將字符碼寫入DDRAM,以使液晶顯示屏顯示出相對應的字符;
            <2> 將使用者自己設計的圖形存入CGRAM。

11.從CGRAM或DDRAM讀出數據的指令一覽

功能:讀取DDRAM或CGRAM中的內容。

基本操作時序:

讀狀態   輸入:RS=L,RW=H,E=H               輸出:DB0~DB7=狀態字
寫指令  輸入:RS=L,RW=L,E=下降沿脈沖,DB0~DB7=指令碼   輸出:無
讀數據  輸入:RS=H,RW=H,E=H       輸出:DB0~DB7=數據
寫數據   輸入:RS=H,RW=L,E=下降沿脈沖,DB0~DB7=數據    輸出:無

顯示操作的過程:首先確認顯示的位置,即在第幾行,第幾個字符開始顯示。也就是要顯示的地址,如下表所示的顯示地址。
  第一行的顯示地址是0x80-0x8F,第二行的顯示地址是0xC0-0xCF。例如想要在第2行,第3個位置顯示一個字符,那么地址碼就是0xC2。在編程過程中,通常編寫一個函數確定在某行某個位置顯示[url=]數據[/url]。函數需要 行[url=]參數[/url](y),和 列參數(x)來確定顯示位置。[url=]程序[/url]參考如下
/***************設置顯示位置**************************/
void LCD_set_xy( unsigned char x, unsigned char y )
{
unsigned char address;
    if (0 == y) x |= 0x80; //當要顯示第一行時地址碼+0x80;
    else x |= 0xC0; //在第二行顯示是地址碼+0xC0;
    Write_com(x); //發送地址碼 0x80-0x8F 或者0xC0-0xCF
}   
其次設置要顯示的內容,即上面提到的CGROM內的字符編碼。如顯示“A”,將編碼41H寫入到液晶屏顯示即可。通常設置地址和顯示內容用一個函數來完成。代碼參考如下:
//功能:按指定位置顯示一個字符
//輸入:列顯示地址x(取值范圍0-15) 行顯示地址y(取值范圍0-1), 指定字符
void DisplayOneChar(unsigned char x, unsigned char y, unsigned char Data)
{
    if (0 == y) x |= 0x80; //當要顯示第一行時地址碼+0x80;
    else x |= 0xC0; //在第二行顯示是地址碼+0xC0;
    Write_com(x); //發送地址碼
    Write_dat(Data); //發送要顯示的字符編碼
}
    顯示字符“A”調用過程如下代碼:
DisplayOneChar(0,0,0x41);
//功能:在第1行 第1個字符 顯示一個大寫字母A
在C語言操作時,還可以顯示整個字符串。定義一個字符串顯示函數,可
以通過直接輸入字符方式進行顯示
//功能:按指定位置顯示一串字符
//輸入:列顯示地址x(取值范圍0-15) 行顯示地址y(取值范圍0-1), 指定字符串指針*p,要顯示的字符個數count (取值范圍1-16)
void DisplayListChar (unsigned char x,unsigned char y,unsigned char *p,unsigned char count)
{
unsigned char i;   
    for(i=0;i<count;i++)
    {
        if (0 == y) x |= 0x80; //當要顯示第一行時地址碼+0x80;
        else x |= 0xC0; //在第二行顯示是地址碼+0xC0;
        Write_com(x); //發送地址碼
        Write_dat(*p); //發送要顯示的字符編碼
        x++;
        p++;
    }      
}     
調用方法如下:
DisplayListChar(0,0,"hello world",11);  //液晶1602第一行顯示
DisplayListChar(0,1,"www*qm999*cn",12);    //液晶1602第二行顯示

舉個實例,就在LCD1602屏幕上第一行第一列顯示個“A”字。


  1. //先定義接口
  2. # include <AT89x51.h>
  3. /*****************************************
  4.                     P1------DB0~DB7         
  5. P2.0------RS
  6.                               P2.1------RW
  7.                               P2.2------E
  8. *****************************************/
  9. # define LCD_DB        P1
  10.         sbit         LCD_RS=P2^0;
  11.         sbit         LCD_RW=P2^1;
  12.         sbit         LCD_E=P2^2;
  13. /******定義函數****************/
  14. # define uchar unsigned char
  15. # define uint unsigned int
  16. void LCD_init(void);//初始化函數
  17. void LCD_write_command(uchar command);//寫指令函數
  18. void LCD_write_data(uchar dat);//寫數據函數
  19. void LCD_disp_char(uchar x,uchar y,uchar dat);//在某個屏幕位置上顯示一個字符,X(0-16),y(1-2)
  20. //void LCD_check_busy(void);//檢查忙函數。我沒用到此函數,因為通過率極低。
  21. void delay_n40us(uint n);//延時函數
  22. //********************************
  23. //*******初始化函數***************
  24. void LCD_init(void)
  25. {
  26. LCD_write_command(0x38);//設置8位格式,2行,5x7
  27. LCD_write_command(0x0c);//整體顯示,關光標,不閃爍
  28. LCD_write_command(0x06);//設定輸入方式,增量不移位
  29. LCD_write_command(0x01);//清除屏幕顯示
  30. delay_n40us(100);//實踐證明,用for循環200次就能可靠完成清屏指令。
  31. }
  32. //********************************
  33. //********寫指令函數************
  34. void LCD_write_command(uchar dat)
  35. {
  36. LCD_DB=dat;
  37. LCD_RS=0;//指令
  38. LCD_RW=0;//寫入
  39. LCD_E=1;//允許
  40. LCD_E=0;
  41. delay_n40us(1);//實踐證明,我的LCD1602上,用for循環1次就能完成普通寫指令。
  42. }
  43. //*******************************
  44. //********寫數據函數*************
  45. void LCD_write_data(uchar dat)
  46. {
  47. LCD_DB=dat;
  48. LCD_RS=1;//數據
  49. LCD_RW=0;//寫入
  50. LCD_E=1;//允許
  51. LCD_E=0;
  52. delay_n40us(1);
  53. }
  54. //********************************
  55. //*******顯示一個字符函數*********
  56. void LCD_disp_char(uchar x,uchar y,uchar dat)
  57. {
  58. uchar address;
  59. if(y==1)
  60.          address=0x80+x;
  61. else
  62.          address=0xc0+x;
  63. LCD_write_command(address);
  64. LCD_write_data(dat);
  65. }
  66. //********************************
  67. /*******檢查忙函數*************
  68. void LCD_check_busy()      //實踐證明,在我的LCD1602上,檢查忙指令通過率極低,以
  69. {                                          //至于不能正常使用LCD。因此我沒有再用檢查忙函數。而使
  70. do                                       //用了延時的方法,延時還是非常好用的。我試了一下,用
  71.         { LCD_E=0;                   //for循環作延時,普通指令只要1次循就可完成。清屏指令
  72.           LCD_RS=0;                 //要用200次循環便能完成。   
  73.           LCD_RW=1;
  74.           LCD_DB=0xff;
  75.           LCD_E=1;
  76.         }while(LCD_DB^7==1);

  77. ******************************/
  78. //********延時函數***************
  79. void delay_n40us(uint n)
  80. { uint i;
  81.       uchar j;            
  82.         for(i=n;i>0;i--)
  83.            for(j=0;j<2;j++);          //在這個延時循環函數中我只做了2次循環,
  84. }                                         //實踐證明我的LCD1602上普通的指令只需1次循環就能可靠完成。
  85. //*******************************
  86. //*********主函數*****************
  87. void main(void)
  88. {
  89.         LCD_init();
  90.         LCD_disp_char(0,1,’A’);
  91.         while(1);
  92. }
  93. //*******************************
復制代碼

具體電路的制作是很簡單的,就接了兩個電阻,一個是10歐姆的背光限流電阻,另一個是2K的LCD極板電壓調節電阻。這兩個電阻的阻值怎么定呢?背光比較簡單,它就相當于在后面接了幾個發光二極管,任何時候你只要在15、16腳串上個100歐的電位器接上電源,調節電位器,覺得亮度合適。此時的阻值便可。LCD液晶極板驅動電壓調節電阻的確定就稍微麻煩一點。在各數據線,控制線接好關通上電源的前提下在第3腳(VEE)和地之間接一個10K的電位器。調節電位器。當3腳電壓高時為全亮,電壓為0時為全暗(液晶全顯示為黑塊)。你用電位器把屏幕從全暗剛好調到變亮。這時便可調試程序。待屏幕能正確顯示后再細調電位器,使對比度合適。這時的阻值便可確定,然后換成等值的固定電阻焊上便可。


組裝后:

具體電路圖:

接口說明:

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

從這個指令可以看出指令數據的高2位已固定是01,只有后面的6位是地址數據,而這6位中的高3位就表示這八個自定義字符,最后的3位就是字模數據的八個地址了。例如第一個自定義字符的字模地址為01000000-01000111八個地址。我們向這8個字節寫入字模數據,讓它能顯示出“℃”
地址:01000000  數據:00010000       圖示:○○○■○○○○
   01000001     00000110               ○○○○○■■○
   01000010     00001001               ○○○○■○○■
   01000011     00001000               ○○○○■○○○
   01000100     00001000               ○○○○■○○○
   01000101     00001001               ○○○○■○○■
   01000110     00000110               ○○○○○■■○
   01000111     00000000               ○○○○○○○○
可以通過手動提取的方法。如下圖所示,對應一個字符顯示區域。每8個字節,組成一個點陣數組。
     
“日”的點陣數組即為 {0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00}
                 
“車”字取模數組為:{0x00,0x0f,0x02,0x04,0x07,0x00,0x0f,0x00,
                        0x10,0x1e,0x00,0x10,0x1c,0x10,0x1e,0x10}
               
    將生成的點陣數組保存到CGRAM存儲器中,生成自定義字符。1602內部CGRAM用于自定義的字符點陣的存儲,總共64字節。由上一步點陣提取可知,每一個字符由8個字節數據組成。所以64字節CGRAM存儲器,能夠存儲8組自定義字符的點陣數組。按照CGRAM地址劃分為0-7為第一組,8-15為第二組,依次類推56-63為第8組數據。把自定義字符的數組按8個字節一組存儲到CGRAM中,程序代碼參考如下。
//功能:將自定義字符的編碼數組 寫入到CGRAM中.
//輸入:自定義字符的編碼數組
void Write_CGRAM(unsigned char *p)
{
unsigned char i,j,kk;
unsigned char tmp=0x40;  //操作CGRAM的命令碼
kk=0;
for(j=0;j<8;j++)        //64 字節存儲空間,可以生成 8 個自定義字符點陣
{
    for(i=0;i<8;i++)    // 8 個字節生成 1 個字符點陣
    {
        Write_com(tmp+i);    //操作CGRAM的命令碼+寫入CGRAM地址.
        Write_dat(p[kk]);    //寫入數據
        kk++;
    }
    tmp += 8;
}
}   
上一步中,自定義字符存儲到CGRAM的任意一組以后,每一個組(8個字節)也有一個顯示編碼。按順序依次為00H-07H 。顯示時,只要調用每一組的編碼,即可以顯示相應的字符。

注:內部常用字符顯示時,顯示編碼是從0x20開始的。0x00-0x0f是專門留給自定義字符顯示的。0x00-0x07和0x08-0x0f內容是一樣的。例如:調用0x01 位置和0x09位置,顯示的內容是一樣的。
    直接按照單個字符的顯示方式調用顯示函數,就可以顯示自定義字符了。代碼參考如下:
  //在第1行,第7個位置顯示自定義漢字 “年”
    DisplayOneChar(6,0,0);    //顯示 "年"  //CGRAM 碼 00
說明:此時“年”的8個字節點陣數組 ,存儲空間為CGRAM的 00-07地址
也就是CGRAM的第1組數據存儲區域,編碼為0。 如果存儲在CGRAM的08-15地址,那么編碼就應該是 1了。
    很多資料中,都沒有詳細介紹過CGRAM和CGROM的區別和用法,在1602調試過程中經常會被搞混。這里總結一點小技巧,希望能給需要的人一點幫助。
以下是顯示效果:
單個和兩個點陣的漢字顯示:

圖形顯示效果:

下面一段程序讓這8個自定義字符顯示出一個心的圖案:


  1. #include <reg51.h>
  2. unsigned char table1[]={0x03,0x07,0x0f,0x1f,0x1f,0x1f,0x1f,0x1f,
  3.                            0x18,0x1E,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
  4.                            0x07,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
  5.                            0x10,0x18,0x1c,0x1E,0x1E,0x1E,0x1E,0x1E,
  6.                            0x0f,0x07,0x03,0x01,0x00,0x00,0x00,0x00,
  7.                            0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x07,0x01,
  8.                            0x1f,0x1f,0x1f,0x1f,0x1f,0x1c,0x18,0x00,
  9.                            0x1c,0x18,0x10,0x00,0x00,0x00,0x00,0x00};//心圖案
  10. unsigned char table[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//字符℃
  11. #define     CLEARSCREEN     LCD_write_command(0x01)
  12. /**************定義接口************************/
  13. #define     LCDIO      P2
  14. sbit LCD1602_RS=P3^0;   
  15. sbit LCD1602_RW=P3^1;   
  16. sbit LCD1602_EN=P3^2;   
  17. /**************定義函數************************/
  18. void LCD_write_command(unsigned char command);//寫入指令函數
  19. void LCD_write_dat(unsigned char dat);//寫入數據函數
  20. void LCD_set_xy( unsigned char x, unsigned char y );//設置顯示位置函數
  21. void LCD_dsp_char( unsigned x,unsigned char y,unsigned char dat);//顯示一個字符函數
  22. void LCD_dsp_string(unsigned char X,unsigned char Y,unsigned char *s);//顯示字符串函數
  23. void LCD_init(void);//初始化函數
  24. void delay_nms(unsigned int n);//延時函數
  25. /********************************************/
  26. /************初始化函數****************/
  27. void LCD_init(void)
  28. {
  29. CLEARSCREEN;//clear screen
  30. LCD_write_command(0x38);//set 8 bit data transmission mode
  31. LCD_write_command(0x0c);//open display (enable lcd display)
  32. LCD_write_command(0x80);//set lcd first display address
  33. CLEARSCREEN;//clear screen
  34. }
  35. /****************************************************/
  36. /**************寫指令函數********************************/  
  37. void LCD_write_command(unsigned char command)
  38. {
  39.       LCDIO=command;
  40.       LCD1602_RS=0;   
  41.       LCD1602_RW=0;
  42.       LCD1602_EN=0;
  43.       LCD1602_EN=1;
  44.       delay_nms(10);
  45. }
  46. /***************************************************/
  47. /****************寫數據函數************************/
  48. void LCD_write_dat(unsigned char dat)
  49. {
  50. LCDIO=dat;
  51. LCD1602_RS=1;
  52. LCD1602_RW=0;
  53. LCD1602_EN=0;
  54. delay_nms(1);
  55. LCD1602_EN=1;
  56. }
  57. /****************************************************/
  58. /***************設置顯示位置**************************/
  59. void LCD_set_xy( unsigned char x, unsigned char y )
  60. {
  61. unsigned char address;
  62. if (y == 1)
  63.      address = 0x80 + x;
  64. else
  65.         address =0xc0+ x;
  66. LCD_write_command(address);
  67. }
  68. /***************************************************/
  69. /****************顯示一個字符**********************/
  70. void LCD_dsp_char( unsigned x,unsigned char y,unsigned char dat)
  71. {
  72. LCD_set_xy( x, y );
  73. LCD_write_dat(dat);
  74. }
  75. /**********************************************/
  76. /***************顯示字符串函數***************/
  77. void LCD_dsp_string(unsigned char X,unsigned char Y,unsigned char *s)
  78. {
  79.        LCD_set_xy( X, Y );
  80.        while (*s)  
  81.        {
  82.          LCD_write_dat(*s);   
  83.          s ++;
  84.        }
  85. }
  86. /***********************************************/
  87. /********** 延時**********************/
  88. void delay_nms(unsigned int n)      
  89. {
  90.        unsigned int i=0,j=0;
  91.        for (i=n;i>0;i--)
  92.        for (j=0;j<10;j++);  
  93. }
  94. /**************************************/
  95. /***********主函數**************/
  96. void main(void)
  97. {
  98. unsigned char i,j,k,tmp;
  99. LCD_init();
  100. delay_nms(100);
  101. tmp=0x40;//設置CGRAM地址的格式字
  102. k=0;
  103. for(j=0;j<8;j++)
  104.      {
  105.         for(i=0;i<8;i++)
  106.          {
  107.            LCD_write_command(tmp+i); // 設置自定義字符的 CGRAM 地址  
  108.            delay_nms(2);
  109.            LCD_write_dat(table1[k]); // 向CGRAM寫入自定義字符表的數據
  110.            k++;
  111.            delay_nms(2);
  112.          }
  113.         tmp=tmp+8;
  114.       }
  115.      LCD_dsp_string(1,1,"LCD TEST        ");//在第一行第一列顯示“LCD TEST”
  116.      LCD_dsp_string(1,2,"SUCCESSFUL      ");//在第二行第一列顯示“SUCCESSFUL”
  117.      for (i=0;i<4;i++)
  118.        {
  119.          LCD_dsp_char( 12+i,1,i);//在第一行第12列位置顯示心圖案的上半部
  120.          delay_nms(1);
  121.        }
  122.      for (i=4;i<8;i++)
  123.        {
  124.          LCD_dsp_char( 12+i-4,2,i);在第二行第12列位置顯示心圖案的下半部
  125.          delay_nms(1);
  126.        }
  127.      while (1);
  128. }
  129. /********************************************************************/
復制代碼



實際效果如圖:







LCD1602編程實例詳見附件

完整的Word格式文檔51黑下載地址:
51單片機驅動LCD1602程序設計(C語言).doc (1.7 MB, 下載次數: 340)


評分

參與人數 4黑幣 +71 收起 理由
zy0818 + 10
Jeff_BlindCat + 10 很詳細的內容講解,授精。
dww465757120 + 30 很給力!
anorec + 21 很給力!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏36 分享淘帖 頂6 踩
回復

使用道具 舉報

來自 2#
ID:686782 發表于 2020-3-4 15:32 | 只看該作者
大白菜啊 發表于 2019-8-27 11:51
注意若要顯示第二行字,有時需要0x38初始化兩次以上才行。。。。

帖子例程里面指令函數E使能的下降沿中間加延時比函數最后加延時要好,但是那個時間需要根據參數調整一下。我一開始也是copy過去只能寫一行,修改了以后就比較穩定了,感覺還是那個下降沿讀的問題吧。
初學者,不一定正確。
回復

使用道具 舉報

板凳
ID:421290 發表于 2018-11-7 19:56 | 只看該作者
求仿真圖
回復

使用道具 舉報

地板
ID:248741 發表于 2019-4-15 13:18 | 只看該作者
真的有用,很詳細而且也很容易理解,謝謝!
回復

使用道具 舉報

5#
ID:73182 發表于 2019-4-15 16:08 | 只看該作者
感謝分享,收藏
回復

使用道具 舉報

6#
ID:528308 發表于 2019-5-16 19:38 | 只看該作者
實驗成功了,謝謝分享
回復

使用道具 舉報

7#
ID:542795 發表于 2019-5-30 15:48 | 只看該作者
很詳細!非常感謝——
回復

使用道具 舉報

8#
ID:579035 發表于 2019-7-19 15:05 | 只看該作者
單片機除了cd沒有接任何外圍電路,LCD是不是顯示不出程序里的字符?
回復

使用道具 舉報

9#
ID:601184 發表于 2019-8-27 11:51 | 只看該作者
注意若要顯示第二行字,有時需要0x38初始化兩次以上才行。。。。
回復

使用道具 舉報

10#
ID:603794 發表于 2019-8-27 12:08 | 只看該作者
相當的詳細 適合初學者學習學習
回復

使用道具 舉報

11#
ID:604260 發表于 2019-8-27 12:48 | 只看該作者
不會有求指教
回復

使用道具 舉報

12#
ID:243394 發表于 2019-8-27 17:18 | 只看該作者
很詳細!非常感謝
回復

使用道具 舉報

13#
ID:61950 發表于 2019-9-1 07:41 來自手機 | 只看該作者
哎!只能先照著寫寫看,寫多了應該能明白
回復

使用道具 舉報

14#
ID:627828 發表于 2019-10-22 20:58 | 只看該作者
厲害了,趕緊學習下
回復

使用道具 舉報

15#
ID:636388 發表于 2019-11-7 18:07 | 只看該作者
大佬就是不一樣
回復

使用道具 舉報

16#
ID:468878 發表于 2019-11-7 21:29 | 只看該作者
1寫得深入淺出,很容易理解。學習了
回復

使用道具 舉報

17#
ID:20672 發表于 2019-11-14 13:10 | 只看該作者
謝謝分享~~
回復

使用道具 舉報

18#
ID:701939 發表于 2020-3-4 17:19 | 只看該作者
感謝樓主的熱心分享
回復

使用道具 舉報

19#
ID:24486 發表于 2020-3-4 21:38 | 只看該作者
感謝分享,收藏。
回復

使用道具 舉報

20#
ID:282869 發表于 2020-3-5 19:57 | 只看該作者
謝謝提供資料.....
回復

使用道具 舉報

21#
ID:695749 發表于 2020-3-9 21:15 | 只看該作者
比郭師傅講的還詳細,適合我學習,謝謝分享!
回復

使用道具 舉報

22#
ID:653838 發表于 2020-4-19 14:20 來自手機 | 只看該作者
這個確實詳細,不錯
回復

使用道具 舉報

23#
ID:106422 發表于 2020-4-19 18:10 | 只看該作者
這個確實詳細,學習了!
回復

使用道具 舉報

24#
ID:743654 發表于 2020-5-28 01:32 | 只看該作者
很詳細,學習中
回復

使用道具 舉報

25#
ID:759779 發表于 2020-6-3 10:38 | 只看該作者
學到了很多
回復

使用道具 舉報

26#
ID:775902 發表于 2020-6-15 16:36 | 只看該作者
給力,省了自己很多麻煩,站 在巨人身上就是好
回復

使用道具 舉報

27#
ID:510861 發表于 2020-6-15 20:59 | 只看該作者
受教了
回復

使用道具 舉報

28#
ID:764828 發表于 2020-7-13 14:02 來自手機 | 只看該作者
我這邊什么也看不到啊,下載的文件也沒了
回復

使用道具 舉報

29#
ID:694078 發表于 2020-7-17 10:49 | 只看該作者
關于LCD1602介紹可算是非常詳細了,分享的程序也能用,非常感謝~
回復

使用道具 舉報

30#
ID:495287 發表于 2020-7-17 21:51 | 只看該作者
很詳細的內容講解,從原理到demo,好貼加分。
回復

使用道具 舉報

31#
ID:84745 發表于 2020-7-19 06:15 來自手機 | 只看該作者
感謝分享!收藏了
回復

使用道具 舉報

32#
ID:795562 發表于 2020-7-21 13:29 | 只看該作者
寫的非常全,非常詳細,樓主是用了心分享的,感謝你,對于我這樣的新手太有幫助了,感謝您的分享!
回復

使用道具 舉報

33#
ID:495574 發表于 2020-7-21 17:30 來自手機 | 只看該作者
void Common_Init() {         Phase = 0;         NextPhase = 0;                          TuneDutyRatioCnt = 0;                  PWMDutyCycle = PWM_DUTYCYCLE_05;          CurrentPgaSample = 0;         CurrentSample = 0;        // 電流采樣值         VoltageSample = 0;        // 電壓采樣值         UserSpeedSample = 0;          ADCIntProtectCnt = 0;         flag_ADCSample = 0;          flag_ErrorException = 0;                  LastPhase = 0;         SamePhaseCnt = 0;          flag_SpeedTime = 0;                 SpeedTimeCnt = 0;                 SpeedTime = 0;         SpeedTimeTemp = 0;         SpeedTimeSum = 0;          MotorSpeed = 0;         UserRequireSpeed = 0;        // 用戶請求轉速          RheostatCnt = 0;          VoltageProCnt = 0;         CurrentPgaProCnt = 0;         CurrentProCnt = 0;          #if(SENSORMODE)         NowHallState = 0;         PreHallState = 0;          flag_HallStateRight = 0;
回復

使用道具 舉報

34#
ID:795562 發表于 2020-7-21 18:30 | 只看該作者
寫的很詳細,可惜我還是不懂,門外漢。慢慢的琢磨
回復

使用道具 舉報

35#
ID:600695 發表于 2021-3-13 10:22 | 只看該作者
復制了仿真,只顯示一行,然后看回帖,說的0x38復位兩次,不明白,然后把這句(LCD_write_command(0x38);//set 8 bit data transmission mode)復制了粘貼下一行,就可以顯示兩行了。原理不懂
回復

使用道具 舉報

36#
ID:1086146 發表于 2023-6-27 17:13 來自手機 | 只看該作者
有沒有最下面心形圖案對應的仿真電路圖,我這圖連接有問題
回復

使用道具 舉報

37#
ID:1064915 發表于 2023-7-3 09:08 | 只看該作者
這個教程很詳細
回復

使用道具 舉報

38#
ID:409878 發表于 2023-7-6 10:15 | 只看該作者
很仔細,不過背景里面老有張圖片,不知道怎么消除啊
回復

使用道具 舉報

39#
ID:1112845 發表于 2024-3-16 13:27 | 只看該作者
看的眼花了
回復

使用道具 舉報

40#
ID:1113285 發表于 2024-3-25 16:42 | 只看該作者
很詳細,對我很有幫助
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91久久久www播放日本观看 | 蜜桃视频在线观看免费视频网站www | 国产三级一区二区三区 | 日韩一区二区三区在线 | 成人不卡 | 精品麻豆剧传媒av国产九九九 | 91xxx在线观看| 免费观看黄色片视频 | 成人在线小视频 | 亚洲视频在线看 | 天天操天天操 | 亚洲精品成人免费 | 中文字幕亚洲专区 | 国产激情视频在线观看 | 久久久激情视频 | 欧美精品久久久久久久久久 | 日本一区二区三区在线观看 | 日本精品视频 | 一级毛片视频在线观看 | 人人擦人人干 | 亚洲免费视频一区 | 一区在线播放 | 九九九国产 | 91精品国产一区二区三区 | 日韩免费视频一区二区 | 国产成人99久久亚洲综合精品 | 成人不卡| 亚洲乱码国产乱码精品精98午夜 | 午夜精品视频 | 日韩色综合 | 久草网站 | 在线一级片 | 密色视频 | 狠狠狠色丁香婷婷综合久久五月 | 成年人在线视频 | 日本精品一区二区三区在线观看视频 | 亚洲一区视频在线 | 日韩在线视频一区 | 亚洲人成人一区二区在线观看 | 91精品国产91久久久久久最新 | 午夜在线小视频 |