找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机按键控制LCD1602,实现数值加减的源程序

[复制链接]
跳转到指定楼层
楼主
电路原理图如下:


/*不知道,为什莫上传不了,压缩包,有图,自己画吧,我感觉注释详细啦。本人也是刚开始学。有更好的方法请评论,有需要的直接拿走*/

  1. #include <reg52.h>
  2. typedef unsigned char uchar;
  3. typedef unsigned int uint;
  4. uchar code table[] = {"Welcome!"};
  5. uchar code ren[] = {"RenShu:"};
  6. uchar code dat[2];
  7. sbit RS = P3^5;         //RS端
  8. sbit RW = P3^6;
  9. sbit EN = P3^4;         //EN端
  10. sbit du=P2^6;
  11. sbit we=P2^7;
  12. sbit k1=P3^0;
  13. sbit k2=P3^1;
  14. uint num,i,c;
  15. void delay(uint z)
  16. {
  17.         uint x,y;
  18.         for(x = z; x > 0; x--)
  19.                 for(y = 114; y > 0 ; y--);
  20. }
  21. void Read_Busy()
  22. {
  23.         uchar busy;
  24.         P0 = 0xff;
  25.         RS = 0;
  26.         RW = 1;
  27.         do
  28.         {
  29.                 EN = 1;
  30.                 busy = P0;
  31.                 EN = 0;
  32.         }while(busy & 0x80);
  33. }
  34. void Write_Cmd(uchar cmd)
  35. {
  36.         Read_Busy();//判断忙
  37.         RS = 0;
  38.         RW = 0;
  39.         P0 = cmd;
  40.         EN = 1;
  41.         EN = 0;
  42. }
  43. //写一个字节数据
  44. void Write_Dat(uchar dat)
  45. {
  46.         Read_Busy();
  47.         RS = 1;
  48.         RW = 0;
  49.         P0 = dat;
  50.         EN = 1;
  51.         EN = 0;
  52. }
  53. void Init_LCD1602()
  54. {
  55.         du=0;
  56.         we=0;
  57.         EN=0;
  58.         Write_Cmd(0x38); //        设置16*2显示,5*7点阵,8位数据接口
  59.         Write_Cmd(0x0c);        
  60.         Write_Cmd(0x06); //读写一字节后地址指针加1
  61.         Write_Cmd(0x01); //清除显示
  62. }
  63. void key()
  64. {
  65.          if(k1==0)
  66.                    {
  67.                                    delay(5);
  68.                                 if(k1==0)
  69.                                 {                        
  70.                 c++;
  71.                                 }
  72.                                 while(!k1);
  73.                    }
  74.         if(k2==0)
  75.                    {
  76.                                    delay(5);
  77.                                 if(k2==0)
  78.                                 {
  79.                 c--;
  80.                                 }
  81.                                 while(!k2);
  82.                    }
  83. }
  84. void main()
  85. {
  86. Init_LCD1602();//1602初始化
  87.         c=0;        
  88. while(1)
  89. {
  90.         Write_Cmd(0x80 | 0x00);//显示地址
  91.         for(num=0;num<8;num++)
  92.         {
  93.                  Write_Dat(table[num]);
  94.                  delay(5);        
  95.         }
  96.         Write_Cmd(0x80 | 0x40);//显示地址
  97.         for(i=0;i<7;i++)
  98.         {
  99.                  Write_Dat(ren[i]);
  100.                  delay(5);        
  101.         }
  102.     Write_Cmd(0x80 | 0x48);//设置显示地址0x00,第一行从第一个字符开始显示
  103.         key();
  104.         Write_Dat(c/10+0x30);
  105.     Write_Dat(c%10+0x30);
  106.         }
  107. }
复制代码

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:1073848 发表于 2023-4-24 21:04 | 只看该作者
在51开发板上不可以诶
回复

使用道具 举报

板凳
ID:863362 发表于 2023-4-25 09:20 | 只看该作者
sbit du=P2^6;
sbit we=P2^7;
请问一下,这两个语句有什么作用?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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