找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机LCD1602液晶显示器(LM016L)显示功能实现+Proteus仿真+常见问题原因

[复制链接]
ID:1025094 发表于 2022-5-9 21:14 | 显示全部楼层 |阅读模式
常见问题:
液晶显示器只有背光无法显示字符
将判忙函数替换成延时函数,延时5ms左右即可
proteus仿真图

1.png

代码:
  1. #include<reg51.h>
  2. #include<intrins.h>  //包含_nop_()函数定义的头文件

  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit RS=P2^0;
  6. sbit RW=P2^1;
  7. sbit E=P2^2;
  8. sbit BF=P1^7;

  9. uchar code dis1[]={"hellow world"};
  10. uchar code dis2[]={"1 2 3 4 5 6"};

  11. void delay(uchar ms){  //延时ms时间
  12. uchar i;
  13. while(ms--){
  14. for(i=0;i<250;i++){
  15. _nop_();_nop_();_nop_();_nop_();  //延时4个机器周期
  16. }
  17. }
  18. }

  19. bit busy(){  //检查是否忙碌
  20. bit result;
  21. RS=0;
  22. RW=1;
  23. E=1;
  24. _nop_();_nop_();_nop_();_nop_()
  25. result=BF;
  26. E=0;
  27. return result;
  28. }

  29. void wcmd(uchar cmd){  //写命令
  30. //while(busy()==1);  //判断LCD是否忙碌
  31. delay(20);  //将判忙函数换成延时函数(5毫秒左右)可以改变LM016L只有背光不显示的情况,还可以多次初始化
  32. RS=0;
  33. RW=0;  //RS和RW同时为低电平时,可以写入命令
  34. E=0;  //为了使E正跳变,先置低电平
  35. _nop_();_nop_();_nop_();_nop_();
  36. P1=cmd;  //将命令输入P1口
  37. _nop_();_nop_();_nop_();_nop_();
  38. E=1;  //E置高电平,产生正跳变,将指令写入液晶模块
  39. _nop_();_nop_();_nop_();_nop_();
  40. E=0;


  41. }

  42. void pos(uchar y,uchar x){  //设置显示位置y行x列
  43. y&=0x1;  //最多两行,限制y的范围0~1
  44. x&=0xf;  //最多每行16个字符,限制x的范围0~15
  45. if(y==1) x|=0xc0;
  46. if(y==0) x|=0x80;
  47. wcmd(x);  //发送地址码
  48. }

  49. void wdat(uchar dat){  //写要显示的内容
  50. //while(busy()==1);
  51. delay(20);
  52. RS=1;
  53. RW=0;
  54. E=0;
  55. P1=dat;
  56. _nop_();_nop_();_nop_();_nop_();
  57. E=1;
  58. _nop_();_nop_();_nop_();_nop_();
  59. E=0;

  60. }

  61. void init(){  //初始化
  62. delay(15);
  63. wcmd(0x38);
  64. delay(10);
  65. wcmd(0x38);
  66. delay(10);
  67. wcmd(0x38);
  68. delay(10);
  69. wcmd(0x0c);
  70. delay(10);
  71. wcmd(0x06);
  72. delay(10);
  73. wcmd(0x01);
  74. delay(10);
  75. }

  76. void main(void){
  77. uchar i;
  78. init();
  79. delay(1);
  80. pos(0,0);
  81. i=0;
  82. while(dis1[i]!='\0'){
  83. wdat(dis1[i]);
  84. i++;
  85. }
  86.         
  87. pos(1,0);
  88. i=0;
  89. while(dis2[i]!='\0'){
  90. wdat(dis2[i]);
  91. i++;
  92. }

  93. while(1);
  94. }
复制代码

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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