找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1459|回复: 0
收起左侧

根据51hei论坛里高手的帖子整理的1602液晶屏的C语言驱动文件

[复制链接]
ID:353874 发表于 2018-10-24 10:43 | 显示全部楼层 |阅读模式
根据论坛里高手的帖子,整理的1602屏的C文件,经过测试,4块开发板均能顺利使用。
在C文件中调整1602对应的89C52单片机的引脚,即可点亮。

  1. /****************************************************************
  2. 在数据线定义位置选择对应引脚
  3. ****************************************************************/

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

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

  8. /*引脚顺序,可根据不同开发板调整*/

  9. #define IODATA  P2  //数据
  10. sbit  E=P0^5;       //1602使能引脚
  11. sbit RW=P0^6;       //1602读写引脚   
  12. sbit RS=P0^7;       //1602数据/命令选择引脚




  13. /********************************************************************
  14. * 名称 :1602写入字符函数
  15. * 功能 : 显示
  16. * 可以直接复制使用
  17. ***********************************************************************/
  18. /*
  19. lcd1602_char(1,5,'b')    //写字符
  20. lcd1602_string(1,5,"ab cd ef;")           //写字符串
  21. lcd1602_init()    //初始化

  22. */

  23. /********************************************************************
  24. * 名称 : delay()
  25. * 功能 : 延时
  26. * 输入 : 无
  27. * 输出 : 无
  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. * 功能 : 这个是一个读状态函数,读出函数是否处在忙状态
  45. * 输入 : 输入的命令值
  46. * 输出 : 无
  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命令函数
  71. * 输入 : 输入的命令值
  72. * 输出 : 无
  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写数据函数
  91. * 输入 : 需要写入1602的数据
  92. * 输出 : 无
  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初始化,请参考1602的资料
  113. * 输入 : 无
  114. * 输出 : 无
  115. ***********************************************************************/
  116. void lcd1602_init(void)
  117. {
  118.         Delay1602(15);
  119.         wcmd(0x38);                        //8位数据,双行显示,5*7点阵
  120.         Delay1602(5);
  121.         wcmd(0x38);
  122.         Delay1602(5);
  123.         wcmd(0x38);
  124.         wcmd(0x38);
  125.         Busy();
  126.         wcmd(0x08);                        //显示关闭,无光标,光标不显示
  127.         Busy();   
  128.         wcmd(0x01);                        //清显示
  129.         Busy();
  130.         wcmd(0x06);                        //光标右移
  131.         Busy();
  132.         wcmd(0x0c);                         //开显示,有光标,光标闪烁
  133. }

  134. /********************************************************************
  135. * 名称 : L1602_char(uchar hang,uchar lie,char sign)
  136. * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
  137. lcd1602_char(1,5,'b')
  138. * 输入 : 行,列,需要输入1602的数据
  139. * 输出 : 无
  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. * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
  161. lcd1602_string(1,5,"ab cd ef;")
  162. * 输入 : 行,列,需要输入1602的数据
  163. * 输出 : 无
  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. //定位光标
  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. */


复制代码



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表