找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3551|回復(fù): 13
收起左側(cè)

單片機(jī)驅(qū)動(dòng)lcd12864

  [復(fù)制鏈接]
ID:955258 發(fā)表于 2021-8-9 14:24 | 顯示全部樓層 |閱讀模式
lcd12864對于許多小白來說是很困難的,尤其是他的時(shí)序圖,更讓人頭大,相信對剛接觸單片機(jī)的人來說更是煎熬,因而在這里我要分享一下lcd12864的資料,這是我做的用C51單片機(jī)驅(qū)動(dòng)12864的程序,12864是一個(gè)很重要的顯示模塊,有顯示清晰,利于人機(jī)交互,操作簡單等優(yōu)點(diǎn),它相比lcd1602能顯示更多的文字,還能顯示圖片,操作指令簡單,使用很方便,是不少工程師設(shè)計(jì)開發(fā)的首選,因而我整理了一下我之前的項(xiàng)目,把12864的資料特別地整理一下,方便更多的人學(xué)習(xí)和使用。

單片機(jī)源程序如下:
  1. #include "reg52.h"
  2. #include <intrins.h>
  3. #include "12864mokuai.h"
  4. #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
  5. uchar IRDIS[2];
  6. uchar IRCOM[4];
  7. void delay0(uchar x);  //x*0.14MS
  8. void beep();
  9. void  dataconv();
  10. void lcd_pos(uchar X,uchar Y);  //確定顯示位置
  11. /*******************************************************************/
  12. /*                                                                 */
  13. /*  延時(shí)函數(shù)                                                       */
  14. /*                                                                 */
  15. /*******************************************************************/
  16. void delay(int ms)
  17. {
  18.     while(ms--)
  19.         {
  20.       uchar i;
  21.           for(i=0;i<250;i++)  
  22.            {
  23.             _nop_();                           
  24.                 _nop_();
  25.                 _nop_();
  26.                 _nop_();
  27.            }
  28.         }
  29. }               
  30. /*******************************************************************/
  31. /*                                                                 */
  32. /*檢查LCD忙狀態(tài)                                                    */
  33. /*lcd_busy為1時(shí),忙,等待。lcd-busy為0時(shí),閑,可寫指令與數(shù)據(jù)。      */
  34. /*                                                                 */
  35. /*******************************************************************/
  36. bit lcd_busy()
  37. {                          
  38.     bit result;
  39.     LCD_RS = 0;
  40.     LCD_RW = 1;
  41.     LCD_EN = 1;
  42.     delayNOP();
  43.     result = (bit)(P0&0x80);
  44.     LCD_EN = 0;
  45.     return(result);
  46. }
  47. /*******************************************************************/
  48. /*                                                                 */
  49. /*寫指令數(shù)據(jù)到LCD                                                  */
  50. /*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。                             */
  51. /*                                                                 */
  52. /*******************************************************************/
  53. void lcd_wcmd(uchar cmd)
  54. {                          
  55.    while(lcd_busy());
  56.     LCD_RS = 0;
  57.     LCD_RW = 0;
  58.     LCD_EN = 0;
  59.     _nop_();
  60.     _nop_();
  61.     P0 = cmd;
  62.     delayNOP();
  63.     LCD_EN = 1;
  64. //    delayNOP();
  65.     LCD_EN = 0;  
  66. }
  67. /*******************************************************************/
  68. /*                                                                 */
  69. /*寫顯示數(shù)據(jù)到LCD                                                  */
  70. /*RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)。                               */
  71. /*                                                                 */
  72. /*******************************************************************/
  73. void lcd_wdat(uchar dat)
  74. {                          
  75.    while(lcd_busy());
  76.     LCD_RS = 1;
  77.     LCD_RW = 0;
  78.     LCD_EN = 0;
  79.     P0 = dat;
  80.     delayNOP();
  81.     LCD_EN = 1;
  82.     delayNOP();
  83.     LCD_EN = 0;
  84. }
  85. /*******************************************************************/
  86. /*                                                                 */
  87. /*  LCD初始化設(shè)定                                                  */
  88. /*                                                                 */
  89. /*******************************************************************/
  90. void lcd_init()
  91. {

  92.     LCD_PSB    = 1;         //并口方式
  93.     lcd_wcmd(0x34);      //擴(kuò)充指令操作
  94.     delay(5);
  95.     lcd_wcmd(0x30);      //基本指令操作
  96.     delay(5);
  97.     lcd_wcmd(0x0C);      //顯示開,關(guān)光標(biāo)
  98.     delay(5);
  99.     lcd_wcmd(0x01);      //清除LCD的顯示內(nèi)容
  100.     delay(5);
  101. }


  102. void delay0(uchar x)    //x*0.14MS
  103. {
  104.   uchar i;
  105.   while(x--)
  106. {
  107.   for (i = 0; i<13; i++) {}
  108. }
  109. }
  110. /*********************************************************/
  111. /*                                                       */
  112. /* 設(shè)定顯示位置                                          */
  113. /*                                                       */
  114. /*********************************************************/
  115. void lcd_pos(uchar X,uchar Y)
  116. {                          
  117.    uchar  pos;
  118.    if (X==0)
  119.      {X=0x80;}
  120.    else if (X==1)
  121.      {X=0x90;}
  122.    else if (X==2)
  123.      {X=0x88;}
  124.    else if (X==3)
  125.      {X=0x98;}
  126.    pos = X+Y ;  
  127.    lcd_wcmd(pos);     //顯示地址
  128. }


復(fù)制代碼




  1. #ifndef __lcd12864mokuai_H
  2. #define __lcd12864mokuai_H

  3. #include "reg52.h"
  4. #ifndef uchar
  5. #define uchar unsigned char
  6. #endif

  7. #ifndef uint
  8. #define uint unsigned int
  9. #endif
  10. #define LCD_data  P0             //數(shù)據(jù)口



  11. //開發(fā)板引腳配置
  12. sbit LCD_RS  =  P2^6;             //(數(shù)據(jù)命令)寄存器選擇輸入
  13. sbit LCD_RW  =  P2^5;             //液晶讀/寫控制
  14. sbit LCD_EN  =  P2^7;             //液晶使能控制
  15. sbit LCD_PSB =  P2^2;             //串/并方式控制
  16. sbit LCD_RST =  P2^1;        


  17. void delay0(uchar x);  //x*0.14MS
  18. void beep();
  19. void  dataconv();
  20. void lcd_pos(uchar X,uchar Y);  //確定顯示位置
  21. void lcd_init();
  22. void lcd_wdat(uchar dat);
  23. void LCD_ShowNum(uchar X,uchar Y,uint Number,uchar Length);
  24. #endif

復(fù)制代碼


  1. #include "reg52.h"
  2. #include "12864mokuai.h"
  3. unsigned char code dis1[] = {"中國加油!"};
  4. unsigned char code dis2[] = {"中國必勝!"};
  5. unsigned char i;

  6. void main()
  7. {
  8.         lcd_init();
  9.         lcd_pos(0,0);
  10.                         i = 0;
  11.         while(1)
  12.         {
  13.                
  14.         
  15.                 while(dis1[i] != '\0')
  16.                 {                         //顯示字符
  17.                         lcd_wdat(dis1[i]);
  18.                         i++;
  19.                 }
  20.                 lcd_pos(1,0);
  21.                         i = 0;
  22.                 while(dis2[i] != '\0')
  23.                 {                         //顯示字符
  24.                         lcd_wdat(dis2[i]);
  25.                         i++;
  26.                 }
  27.         }
  28. }
復(fù)制代碼

評(píng)分

參與人數(shù) 1黑幣 +30 收起 理由
admin + 30 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:328014 發(fā)表于 2021-8-9 15:16 | 顯示全部樓層
樓主你好 缺少"12864mokuai.h" 無法編譯啊
回復(fù)

使用道具 舉報(bào)

ID:955258 發(fā)表于 2021-8-9 16:02 | 顯示全部樓層
51hei團(tuán)團(tuán) 發(fā)表于 2021-8-9 15:16
樓主你好 缺少"12864mokuai.h" 無法編譯啊

里面有的,我是按模塊化編程的
回復(fù)

使用道具 舉報(bào)

ID:955258 發(fā)表于 2021-8-9 16:05 | 顯示全部樓層
51hei團(tuán)團(tuán) 發(fā)表于 2021-8-9 15:16
樓主你好 缺少"12864mokuai.h" 無法編譯啊

12864mokuai.h在程序里面呢,我用的是模塊編程

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:97554 發(fā)表于 2021-8-9 21:42 | 顯示全部樓層
12864有幾種,有字庫的7920,和沒字庫的7565什么的,驅(qū)動(dòng)是不一樣的,有字庫的7920可以用一般的LCD1602的字符液晶驅(qū)動(dòng)程序,把字符改成漢字還有地址改一下就可以。而沒有字庫的幾種驅(qū)動(dòng)程序又不盡相同,所以,樓主給的程序?qū)τ诔鯇W(xué)的很可能會(huì)踩雷。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:97554 發(fā)表于 2021-8-9 21:46 | 顯示全部樓層
樓主的程序應(yīng)該是帶字庫得到12864的驅(qū)動(dòng),其實(shí)可以簡化很多。這樣的程序高手用不上,新手又使用不了,樓主也沒有細(xì)說,初學(xué)的需要注意下。
回復(fù)

使用道具 舉報(bào)

ID:321836 發(fā)表于 2021-8-10 11:13 | 顯示全部樓層
楊雪飛 發(fā)表于 2021-8-9 21:46
樓主的程序應(yīng)該是帶字庫得到12864的驅(qū)動(dòng),其實(shí)可以簡化很多。這樣的程序高手用不上,新手又使用不了,樓主 ...

現(xiàn)在非字庫的LCD12864市面上用得不多了吧,我在某1個(gè)寶買到的基本都是帶字庫的,這個(gè)程序帶字庫12864可以順利顯示,而且思路清晰,很適合初學(xué)者。。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:955258 發(fā)表于 2021-8-10 21:43 | 顯示全部樓層
楊雪飛 發(fā)表于 2021-8-9 21:42
12864有幾種,有字庫的7920,和沒字庫的7565什么的,驅(qū)動(dòng)是不一樣的,有字庫的7920可以用一般的LCD1602的字 ...

你說的沒錯(cuò),這個(gè)是帶字庫的,帶字庫的是比較常見的,用的人也比較多,無論是功能還是使用方面,帶字庫的都比不帶字庫的好很多
回復(fù)

使用道具 舉報(bào)

ID:955258 發(fā)表于 2021-8-10 21:47 | 顯示全部樓層
已飛的鷹 發(fā)表于 2021-8-10 11:13
現(xiàn)在非字庫的LCD12864市面上用得不多了吧,我在某1個(gè)寶買到的基本都是帶字庫的,這個(gè)程序帶字庫12864可以 ...

沒錯(cuò),一般工程項(xiàng)目還是首選帶字庫的
回復(fù)

使用道具 舉報(bào)

ID:815949 發(fā)表于 2021-9-4 12:11 | 顯示全部樓層
不帶字庫的可以自己編字形碼,尤其是顯示特殊字體的時(shí)候就有優(yōu)勢,缺點(diǎn)是會(huì)占用單片機(jī)的空間,有字庫的就沒有這個(gè)問題,兩種屏的驅(qū)動(dòng)不一樣,不通用,初學(xué)者要注意
回復(fù)

使用道具 舉報(bào)

ID:857072 發(fā)表于 2021-9-4 13:16 來自觸屏版 | 顯示全部樓層
玩點(diǎn)個(gè)性化的字體還得沒字庫的。
回復(fù)

使用道具 舉報(bào)

ID:97554 發(fā)表于 2021-9-4 18:03 | 顯示全部樓層
已飛的鷹 發(fā)表于 2021-8-10 11:13
現(xiàn)在非字庫的LCD12864市面上用得不多了吧,我在某1個(gè)寶買到的基本都是帶字庫的,這個(gè)程序帶字庫12864可以 ...

相對來說,不帶字庫的用的多,因?yàn)轱@示更靈活。
回復(fù)

使用道具 舉報(bào)

ID:97554 發(fā)表于 2021-9-4 18:04 | 顯示全部樓層
0901 發(fā)表于 2021-8-10 21:43
你說的沒錯(cuò),這個(gè)是帶字庫的,帶字庫的是比較常見的,用的人也比較多,無論是功能還是使用方面,帶字庫的 ...

我倒是覺得不帶字庫的好用,畫點(diǎn)畫線任意坐標(biāo)顯示,價(jià)格便宜,從我自己拆過的電子設(shè)備來看,70
%以上用的還是不帶字庫的。
回復(fù)

使用道具 舉報(bào)

ID:97554 發(fā)表于 2021-9-4 18:16 | 顯示全部樓層
已飛的鷹 發(fā)表于 2021-8-10 11:13
現(xiàn)在非字庫的LCD12864市面上用得不多了吧,我在某1個(gè)寶買到的基本都是帶字庫的,這個(gè)程序帶字庫12864可以 ...

說實(shí)話帶字庫的做簡單顯示尚可,復(fù)雜的顯示根本無法實(shí)現(xiàn)。所以,市面大部分設(shè)備都是不帶字庫的,比如ST7565之類的cog屏。另外你覺得樓主這貼思路清晰適合初學(xué)者,那我可以告訴你,對于7920的帶字庫屏的驅(qū)動(dòng)只需要將最簡單的LCD1602字符屏的程序把字母和數(shù)字改成漢字即可顯示,四步;1、引腳定義、函數(shù)定義。2、寫命令函數(shù)、3、寫數(shù)據(jù)函數(shù) 4、主函數(shù)。就完事了,無需什么POS(0,0)什么的,只需要寫指令函數(shù)把地址寫上就行。
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表