找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2378|回复: 0
打印 上一主题 下一主题
收起左侧

LCD1602A-5V使用说明和程序

[复制链接]
跳转到指定楼层
楼主
ID:427921 发表于 2018-11-29 15:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. //#include <at89x51.h>

  4. sbit LCD_RS=P1^0;//定义引脚
  5. sbit LCD_RW=P1^1;
  6. sbit LCD_E=P1^2;
  7. #define LCD_Data P2
  8. #define Busy    0x80 //用于检测LCD状态字中的Busy标识



  9. void WriteDataLCD(unsigned char WDLCD);
  10. void WriteCommandLCD(unsigned char WCLCD,BuysC);
  11. unsigned char ReadDataLCD(void);
  12. unsigned char ReadStatusLCD(void);
  13. void LCDInit(void);
  14. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
  15. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
  16. void Delay5Ms(void);
  17. void Delay400Ms(void);


  18. unsigned char code uctech[] = {"ic2012.taobao.co"};
  19. unsigned char code net[] = {"Happy every day!"};

  20. void main(void)
  21. {
  22. Delay400Ms(); //启动等待,等LCD讲入工作状态
  23. LCDInit(); //LCM初始化
  24. Delay5Ms(); //延时片刻(可不要)

  25. DisplayListChar(0, 0, uctech);
  26. DisplayListChar(0, 5, net);
  27. ReadDataLCD();//测试用句无意义
  28. while(1);
  29. }

  30. //写数据
  31. void WriteDataLCD(unsigned char WDLCD)
  32. {
  33. ReadStatusLCD(); //检测忙
  34. LCD_Data = WDLCD;
  35. LCD_RS = 1;
  36. LCD_RW = 0;
  37. LCD_E = 0; //若晶振速度太高可以在这后加小的延时
  38. LCD_E = 0; //延时
  39. LCD_E = 1;
  40. }

  41. //写指令
  42. void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测
  43. {
  44. if (BuysC) ReadStatusLCD(); //根据需要检测忙
  45. LCD_Data = WCLCD;
  46. LCD_RS = 0;
  47. LCD_RW = 0;
  48. LCD_E = 0;
  49. LCD_E = 0;
  50. LCD_E = 1;
  51. }

  52. //读数据
  53. unsigned char ReadDataLCD(void)
  54. {
  55. LCD_RS = 1;
  56. LCD_RW = 1;
  57. LCD_E = 0;
  58. LCD_E = 0;
  59. LCD_E = 1;
  60. return(LCD_Data);
  61. }

  62. //读状态
  63. unsigned char ReadStatusLCD(void)
  64. {
  65. LCD_Data = 0xFF;
  66. LCD_RS = 0;
  67. LCD_RW = 1;
  68. LCD_E = 0;
  69. LCD_E = 0;
  70. LCD_E = 1;
  71. while (LCD_Data & Busy); //检测忙信号
  72. return(LCD_Data);
  73. }

  74. void LCDInit(void) //LCM初始化
  75. {
  76. LCD_Data = 0;
  77. WriteCommandLCD(0x38,0); //三次显示模式设置,不检测忙信号
  78. Delay5Ms();
  79. WriteCommandLCD(0x38,0);
  80. Delay5Ms();
  81. WriteCommandLCD(0x38,0);
  82. Delay5Ms();

  83. WriteCommandLCD(0x38,1); //显示模式设置,开始要求每次检测忙信号
  84. WriteCommandLCD(0x08,1); //关闭显示
  85. WriteCommandLCD(0x01,1); //显示清屏
  86. WriteCommandLCD(0x06,1); // 显示光标移动设置
  87. WriteCommandLCD(0x0C,1); // 显示开及光标设置
  88. }

  89. //按指定位置显示一个字符
  90. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
  91. {
  92. Y &= 0x1;
  93. X &= 0xF; //限制X不能大于15,Y不能大于1
  94. if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
  95. X |= 0x80; // 算出指令码
  96. WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码
  97. WriteDataLCD(DData);
  98. }

  99. //按指定位置显示一串字符
  100. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
  101. {
  102. unsigned char ListLength;

  103.   ListLength = 0;
  104. Y &= 0x1;
  105. X &= 0xF; //限制X不能大于15,Y不能大于1
  106. while (DData[ListLength]>=0x20) //若到达字串尾则退出
  107.   {
  108.    if (X <= 0xF) //X坐标应小于0xF
  109.     {
  110.      DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
  111.      ListLength++;
  112.      X++;
  113.     }
  114.   }
  115. }

  116. //5ms延时
  117. void Delay5Ms(void)
  118. {
  119. unsigned int TempCyc = 5552;
  120. while(TempCyc--);
  121. }

  122. //400ms延时
  123. void Delay400Ms(void)
  124. {
  125. unsigned char TempCycA = 5;
  126. unsigned int TempCycB;
  127. while(TempCycA--)
  128. {
  129.   TempCycB=7269;
  130.   while(TempCycB--);
  131. };
  132. }
复制代码


LCD1602A-5V厂家说明书.pdf

348.56 KB, 下载次数: 38, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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