找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 1865|回復(fù): 0
收起左側(cè)

根據(jù)51hei論壇里高手的帖子整理的1602液晶屏的C語(yǔ)言驅(qū)動(dòng)文件

[復(fù)制鏈接]
ID:353874 發(fā)表于 2018-10-24 10:43 | 顯示全部樓層 |閱讀模式
根據(jù)論壇里高手的帖子,整理的1602屏的C文件,經(jīng)過(guò)測(cè)試,4塊開(kāi)發(fā)板均能順利使用。
在C文件中調(diào)整1602對(duì)應(yīng)的89C52單片機(jī)的引腳,即可點(diǎn)亮。

  1. /****************************************************************
  2. 在數(shù)據(jù)線定義位置選擇對(duì)應(yīng)引腳
  3. ****************************************************************/

  4. #include<reg51.h>
  5. #include <intrins.h>

  6. #define uchar unsigned char
  7. #define uint  unsigned int

  8. /*引腳順序,可根據(jù)不同開(kāi)發(fā)板調(diào)整*/

  9. #define IODATA  P2  //數(shù)據(jù)
  10. sbit  E=P0^5;       //1602使能引腳
  11. sbit RW=P0^6;       //1602讀寫(xiě)引腳   
  12. sbit RS=P0^7;       //1602數(shù)據(jù)/命令選擇引腳




  13. /********************************************************************
  14. * 名稱 :1602寫(xiě)入字符函數(shù)
  15. * 功能 : 顯示
  16. * 可以直接復(fù)制使用
  17. ***********************************************************************/
  18. /*
  19. lcd1602_char(1,5,'b')    //寫(xiě)字符
  20. lcd1602_string(1,5,"ab cd ef;")           //寫(xiě)字符串
  21. lcd1602_init()    //初始化

  22. */

  23. /********************************************************************
  24. * 名稱 : delay()
  25. * 功能 : 延時(shí)
  26. * 輸入 : 無(wú)
  27. * 輸出 : 無(wú)
  28. ***********************************************************************/
  29. void delay1602()
  30. {
  31.         _nop_();
  32.         _nop_();
  33. }

  34. void Delay1602(uint del)
  35. {
  36.         uint i,j;
  37.         for(i=0;i<del;i++)
  38.         for(j=0;j<=148;j++)
  39.         {
  40.         }   
  41. }


  42. /********************************************************************
  43. * 名稱 : bit Busy(void)
  44. * 功能 : 這個(gè)是一個(gè)讀狀態(tài)函數(shù),讀出函數(shù)是否處在忙狀態(tài)
  45. * 輸入 : 輸入的命令值
  46. * 輸出 : 無(wú)
  47. ***********************************************************************/
  48. void Busy(void)
  49. {
  50.         bit busy_flag = 1;
  51.         IODATA  = 0xff;
  52.         RS = 0;
  53.         delay1602();
  54.         RW = 1;
  55.         delay1602();
  56.         E = 1;
  57.         //Delay(1);
  58.         while(1)
  59.         {
  60.                 busy_flag = (bit)(IODATA  & 0x80);
  61.                 if(busy_flag == 0)
  62.                 {
  63.                         break;
  64.                 }
  65.         }
  66.         E = 0;
  67. }

  68. /********************************************************************
  69. * 名稱 : wcmd(uchar del)
  70. * 功能 : 1602命令函數(shù)
  71. * 輸入 : 輸入的命令值
  72. * 輸出 : 無(wú)
  73. ***********************************************************************/
  74. void wcmd(uchar del)
  75. {
  76.         RS = 0;
  77.         delay1602();
  78.         RW = 0;
  79.         delay1602();
  80.         E = 0;
  81.         delay1602();
  82.         IODATA  = del;
  83.         delay1602();
  84.         E = 1;
  85.         delay1602();
  86.         E = 0;
  87. }

  88. /********************************************************************
  89. * 名稱 : wdata(uchar del)
  90. * 功能 : 1602寫(xiě)數(shù)據(jù)函數(shù)
  91. * 輸入 : 需要寫(xiě)入1602的數(shù)據(jù)
  92. * 輸出 : 無(wú)
  93. ***********************************************************************/
  94. void lcd1602_write_data(uchar del)
  95. {
  96.         Busy();      
  97.         delay1602();
  98.         RS = 1;
  99.         delay1602();
  100.         RW = 0;
  101.         delay1602();
  102.         E = 0;
  103.         delay1602();
  104.         IODATA  = del;
  105.         delay1602();
  106.         E = 1;
  107.         delay1602();
  108.         E = 0;
  109. }

  110. /********************************************************************
  111. * 名稱 : L1602_init()
  112. * 功能 : 1602初始化,請(qǐng)參考1602的資料
  113. * 輸入 : 無(wú)
  114. * 輸出 : 無(wú)
  115. ***********************************************************************/
  116. void lcd1602_init(void)
  117. {
  118.         Delay1602(15);
  119.         wcmd(0x38);                        //8位數(shù)據(jù),雙行顯示,5*7點(diǎn)陣
  120.         Delay1602(5);
  121.         wcmd(0x38);
  122.         Delay1602(5);
  123.         wcmd(0x38);
  124.         wcmd(0x38);
  125.         Busy();
  126.         wcmd(0x08);                        //顯示關(guān)閉,無(wú)光標(biāo),光標(biāo)不顯示
  127.         Busy();   
  128.         wcmd(0x01);                        //清顯示
  129.         Busy();
  130.         wcmd(0x06);                        //光標(biāo)右移
  131.         Busy();
  132.         wcmd(0x0c);                         //開(kāi)顯示,有光標(biāo),光標(biāo)閃爍
  133. }

  134. /********************************************************************
  135. * 名稱 : L1602_char(uchar hang,uchar lie,char sign)
  136. * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個(gè)字符顯示"b" ,調(diào)用該函數(shù)如下
  137. lcd1602_char(1,5,'b')
  138. * 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
  139. * 輸出 : 無(wú)
  140. ***********************************************************************/
  141. void lcd1602_char(uchar hang,uchar lie,char sign)
  142. {
  143.         uchar a;
  144.         if(hang == 1)
  145.         {
  146.                 a = 0x80;
  147.         }
  148.         if(hang == 2)
  149.         {
  150.                 a = 0xc0;
  151.         }
  152.         a = a + lie - 1;
  153.         Busy();
  154.         wcmd(a);
  155.         Busy();
  156.         lcd1602_write_data(sign);
  157. }

  158. /********************************************************************
  159. * 名稱 : L1602_string(uchar hang,uchar lie,uchar *p)
  160. * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個(gè)字符開(kāi)始顯示"ab cd ef" ,調(diào)用該函數(shù)如下
  161. lcd1602_string(1,5,"ab cd ef;")
  162. * 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
  163. * 輸出 : 無(wú)
  164. ***********************************************************************/
  165. void lcd1602_string(uchar hang,uchar lie,uchar *p)
  166. {
  167.         uchar a;
  168.         if(hang == 1)
  169.         {
  170.                 a = 0x80;
  171.         }
  172.         if(hang == 2)
  173.         {
  174.                 a = 0xc0;
  175.         }
  176.         a = a + lie - 1;
  177.         while(1)
  178.         {
  179.                 Busy();
  180.                 wcmd(a);
  181.                 Busy();
  182.                 lcd1602_write_data(*p);
  183.                 a++;
  184.                 p++;   
  185.                 if((*p == '\0')||(a==0x90)||(a==0xd0))
  186.                 {
  187.                         break;
  188.                 }
  189.         }
  190. }


  191. /*
  192. //定位光標(biāo)
  193. void lcd1602_locate(unsigned char x,unsigned char y)
  194. {
  195.         unsigned char aa;
  196.         if (x==1) aa=0x80;
  197.         if (x==2) aa=0x80+0x40;
  198.         Busy();
  199.         wcmd(aa+y-1);
  200.         Busy();
  201. }
  202. */


復(fù)制代碼



評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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