找回密码
 立即注册

QQ登录

只需一步,快速开始

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

我想用单片机按键控制数码管但是结果显示按只能增加而不能减少?

[复制链接]
跳转到指定楼层
楼主
ID:828119 发表于 2020-10-11 08:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机源程序如下:
  1. #include"reg52.h"
  2. typedef unsigned int u16;
  3. typedef unsigned char u8;
  4. u8 num=0;
  5. u8 buff[2];
  6. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  7.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  8. sbit k2=P3^0;
  9. sbit k1=P3^1;
  10. sbit p22=P2^2;
  11. sbit p23=P2^3;
  12. sbit p24=P2^4;
  13. void delay(){
  14. u16 i=100;
  15. while(i--);
  16. }
  17. void digdisplay()
  18. {
  19.         u8 i;
  20.         for(i=0;i<=1;i++)
  21.         {
  22.                 switch(i)
  23.                 {
  24.                         case 0:p22=0;p23=0;p24=0;break;
  25.                         case 1:p22=0;p23=0;p24=1;break;}
  26.                          P0=buff[i];
  27.                         delay();
  28.                         P0=0x00;
  29.                
  30.         
  31.         }

  32. }
  33. u8 keyscanf()
  34. {
  35.         static u8 keyan=1;
  36.         if(keyan==1&&(k1==0||k2==0))
  37.         {        
  38.         delay();
  39.         keyan=0;
  40.         
  41. if(k1==0)return 2;
  42. else if(k2==0)return 1;
  43. }
  44. else if(k1==1&&k2==1){
  45.         keyan=1;
  46. }
  47. return 0;

  48. }


  49. void datpros()
  50. {
  51.         if(keyscanf()==1)
  52.         {num++;
  53.          if(num==100){
  54.          num=0;}
  55.         }
  56.         else if(keyscanf()==2)
  57.         {num--;
  58.         if(num==0)
  59.         {
  60.         num=99;}
  61.         }
  62.         buff[0]=smgduan[num%10];
  63.         buff[1]=smgduan[num/10];
  64. }




  65. void main()
  66. {
  67.         while(1){
  68.          datpros();
  69.          digdisplay();
  70.                    }

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

使用道具 举报

沙发
ID:368534 发表于 2020-10-11 10:16 | 只看该作者
程序没有细看,有仿真器的话,看看程序有没有进入减法的相关代码,应该很好检查的。
回复

使用道具 举报

板凳
ID:160500 发表于 2020-10-11 10:24 | 只看该作者
程序逻辑不对啊。我没有看你的程序,只是从问题来推测BUG
回复

使用道具 举报

地板
ID:21069 发表于 2020-10-11 19:54 | 只看该作者
不要else if(keyscanf()==2),直接 if(keyscanf()==2),可先将值设一个3,4,5,按减看结果,也可屏蔽加的部份直接调减的部份
回复

使用道具 举报

5#
ID:239055 发表于 2020-10-12 08:05 来自手机 | 只看该作者
你按钮检测返回逻辑有问题,你可以直接写K1==0的时候执行加,k2执行减,没必要执行一个返回,然后再用返回值来判断加还是减
回复

使用道具 举报

6#
ID:828434 发表于 2020-10-12 09:42 | 只看该作者
程序没有细看,有仿真器的话,看看程序有没有进入减法的相关代码,应该很好检查的。
回复

使用道具 举报

7#
ID:584814 发表于 2020-10-12 11:05 | 只看该作者
keyscanf()中的
if(k1==0)return 2;
else if(k2==0)return 1;
}
else if(k1==1&&k2==1){
        keyan=1;
}
都是顺次执行写成这样条理就清楚了:
if(k1==0)return 2;
if(k2==0)return 1;
if(k1==1&&k2==1)keyan=1;
keyscanf()不管前面return了什么结尾都return 0。
先理清程序,其他问题自己查。
回复

使用道具 举报

8#
ID:451718 发表于 2020-10-12 17:35 | 只看该作者
判断问题:
按键检测那里是自己写,还是抄回来改的。那个keyan变量,是处理连按效果用的么?  建议删除这个判断,先直接简单的检测按键。
解决办法:
先不处理数字,把按键值直接反馈到显示界面,看看按键起到效果没有。 是不是你要的结果。
回复

使用道具 举报

9#
ID:828119 发表于 2020-10-12 21:01 | 只看该作者
好的,正在改,谢谢各位
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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