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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機驅動lcd12864

  [復制鏈接]
跳轉到指定樓層
樓主
ID:955258 發表于 2021-8-9 14:24 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
lcd12864對于許多小白來說是很困難的,尤其是他的時序圖,更讓人頭大,相信對剛接觸單片機的人來說更是煎熬,因而在這里我要分享一下lcd12864的資料,這是我做的用C51單片機驅動12864的程序,12864是一個很重要的顯示模塊,有顯示清晰,利于人機交互,操作簡單等優點,它相比lcd1602能顯示更多的文字,還能顯示圖片,操作指令簡單,使用很方便,是不少工程師設計開發的首選,因而我整理了一下我之前的項目,把12864的資料特別地整理一下,方便更多的人學習和使用。

單片機源程序如下:
  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. /*  延時函數                                                       */
  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忙狀態                                                    */
  33. /*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數據。      */
  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. /*寫指令數據到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. /*寫顯示數據到LCD                                                  */
  70. /*RS=H,RW=L,E=高脈沖,D0-D7=數據。                               */
  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初始化設定                                                  */
  88. /*                                                                 */
  89. /*******************************************************************/
  90. void lcd_init()
  91. {

  92.     LCD_PSB    = 1;         //并口方式
  93.     lcd_wcmd(0x34);      //擴充指令操作
  94.     delay(5);
  95.     lcd_wcmd(0x30);      //基本指令操作
  96.     delay(5);
  97.     lcd_wcmd(0x0C);      //顯示開,關光標
  98.     delay(5);
  99.     lcd_wcmd(0x01);      //清除LCD的顯示內容
  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. /* 設定顯示位置                                          */
  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. }


復制代碼




  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             //數據口



  11. //開發板引腳配置
  12. sbit LCD_RS  =  P2^6;             //(數據命令)寄存器選擇輸入
  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

復制代碼


  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. }
復制代碼

評分

參與人數 1黑幣 +30 收起 理由
admin + 30 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:328014 發表于 2021-8-9 15:16 | 只看該作者
樓主你好 缺少"12864mokuai.h" 無法編譯啊
回復

使用道具 舉報

板凳
ID:955258 發表于 2021-8-9 16:02 | 只看該作者
51hei團團 發表于 2021-8-9 15:16
樓主你好 缺少"12864mokuai.h" 無法編譯啊

里面有的,我是按模塊化編程的
回復

使用道具 舉報

地板
ID:955258 發表于 2021-8-9 16:05 | 只看該作者
51hei團團 發表于 2021-8-9 15:16
樓主你好 缺少"12864mokuai.h" 無法編譯啊

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

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

5#
ID:97554 發表于 2021-8-9 21:42 | 只看該作者
12864有幾種,有字庫的7920,和沒字庫的7565什么的,驅動是不一樣的,有字庫的7920可以用一般的LCD1602的字符液晶驅動程序,把字符改成漢字還有地址改一下就可以。而沒有字庫的幾種驅動程序又不盡相同,所以,樓主給的程序對于初學的很可能會踩雷。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

6#
ID:97554 發表于 2021-8-9 21:46 | 只看該作者
樓主的程序應該是帶字庫得到12864的驅動,其實可以簡化很多。這樣的程序高手用不上,新手又使用不了,樓主也沒有細說,初學的需要注意下。
回復

使用道具 舉報

7#
ID:321836 發表于 2021-8-10 11:13 | 只看該作者
楊雪飛 發表于 2021-8-9 21:46
樓主的程序應該是帶字庫得到12864的驅動,其實可以簡化很多。這樣的程序高手用不上,新手又使用不了,樓主 ...

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

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

8#
ID:955258 發表于 2021-8-10 21:43 | 只看該作者
楊雪飛 發表于 2021-8-9 21:42
12864有幾種,有字庫的7920,和沒字庫的7565什么的,驅動是不一樣的,有字庫的7920可以用一般的LCD1602的字 ...

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

使用道具 舉報

9#
ID:955258 發表于 2021-8-10 21:47 | 只看該作者
已飛的鷹 發表于 2021-8-10 11:13
現在非字庫的LCD12864市面上用得不多了吧,我在某1個寶買到的基本都是帶字庫的,這個程序帶字庫12864可以 ...

沒錯,一般工程項目還是首選帶字庫的
回復

使用道具 舉報

10#
ID:815949 發表于 2021-9-4 12:11 | 只看該作者
不帶字庫的可以自己編字形碼,尤其是顯示特殊字體的時候就有優勢,缺點是會占用單片機的空間,有字庫的就沒有這個問題,兩種屏的驅動不一樣,不通用,初學者要注意
回復

使用道具 舉報

11#
ID:857072 發表于 2021-9-4 13:16 來自觸屏版 | 只看該作者
玩點個性化的字體還得沒字庫的。
回復

使用道具 舉報

12#
ID:97554 發表于 2021-9-4 18:03 | 只看該作者
已飛的鷹 發表于 2021-8-10 11:13
現在非字庫的LCD12864市面上用得不多了吧,我在某1個寶買到的基本都是帶字庫的,這個程序帶字庫12864可以 ...

相對來說,不帶字庫的用的多,因為顯示更靈活。
回復

使用道具 舉報

13#
ID:97554 發表于 2021-9-4 18:04 | 只看該作者
0901 發表于 2021-8-10 21:43
你說的沒錯,這個是帶字庫的,帶字庫的是比較常見的,用的人也比較多,無論是功能還是使用方面,帶字庫的 ...

我倒是覺得不帶字庫的好用,畫點畫線任意坐標顯示,價格便宜,從我自己拆過的電子設備來看,70
%以上用的還是不帶字庫的。
回復

使用道具 舉報

14#
ID:97554 發表于 2021-9-4 18:16 | 只看該作者
已飛的鷹 發表于 2021-8-10 11:13
現在非字庫的LCD12864市面上用得不多了吧,我在某1個寶買到的基本都是帶字庫的,這個程序帶字庫12864可以 ...

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

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