打印
[51单片机]

按键控制数码管,为什么我的数码管减1之前老是要加1然...

[复制链接]
1394|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
经历|  楼主 | 2017-8-13 20:51 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
#include<at89x52.h>
#define uchar unsigned char
sbit k1=P3^0;
sbit k2=P3^2;
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

void delay1ms(uchar a)  
{
     uchar b,c;
    for(c=1;c>0;c--)
        for(b=142;b>0;b--)
            for(a=2;a>0;a--);
}

void main()
{
  uchar i;
while(1)
{
  if(!k1)
  {
   delay1ms(10);
   if(!k1)
   {
       P2=tab[i++];
      
   }
     while(!k1);
   }

  if(!k2)
  {
    delay1ms(10);
    if(!k2)
    {
        P2=tab[i--];
    }
      while(!k2);
  }
}
}


图1.png (25.14 KB )

k1为加1键,k2为减1键

k1为加1键,k2为减1键

相关帖子

沙发
694844985| | 2017-8-13 21:22 | 只看该作者
控制逻辑有问题,  if(!k2)
  {
    delay1ms(10);
   while(!k2);
    {
        P2=tab[i--];
    }
      
  }

使用特权

评论回复
板凳
694844985| | 2017-8-13 21:22 | 只看该作者
这样改

使用特权

评论回复
地板
zrb5688| | 2017-8-13 23:07 | 只看该作者
延时函数也不对吧!最后一行for(a=2;a>0;a--)应该去掉。

使用特权

评论回复
5
山东电子小菜鸟| | 2017-8-14 09:52 | 只看该作者
进行单步调试,找出问题所在

使用特权

评论回复
6
经历|  楼主 | 2017-8-14 09:57 | 只看该作者

不行,这样改只会显示8(按k2的时候)

使用特权

评论回复
7
经历|  楼主 | 2017-8-14 10:02 | 只看该作者
山东电子小菜鸟 发表于 2017-8-14 09:52
进行单步调试,找出问题所在

怎么进行单步调试啊

使用特权

评论回复
8
经历|  楼主 | 2017-8-14 10:38 | 只看该作者
现在问题已经解决了,谢谢个位。

使用特权

评论回复
9
rankey| | 2018-11-5 15:38 | 只看该作者
你好
  我也编了一个,把你的这个问题给解决了。protues模拟OK


#include<reg52.h>
#define uchar unsigned char
sbit k1=P3^0;   //+
sbit k2=P3^2;   //-
uchar key1_T1=0,key2_T1=0,i=0;
uchar key1_num,key2_num;
uchar Key1_lock,key2_lock;
uchar code tab[]={0x3F,0x6,0x5B,0x4F,0x66,0x6D,0x7D,0x7,0x7F,0x6F};  //共阴

void InitTimer1(void)
{
    TMOD=0x10;
    TH1=0xD8;
    TL1=0xF0;
    ET1=1;
    EA=1;
    TR1=1;
}


void main()
{

         InitTimer1();
         P2=0x00;
while(1)
{
          if(!k1)
                {key1_T1=1;}
                else key1_T1=0;
                if(!k2)
                        {key2_T1=1;}
                else key2_T1=0;       

if(Key1_lock==1)
   {
                   Key1_lock=0;
                    i=i+1;
             if((i>=0)&&(i<=8))
                         {
                                 
                                 P2=tab[i];
                                 
                         }
                         if(i>=8)
                         {i=8;}
                         
                         
    }       
  if(key2_lock)
                {
                   key2_lock=0;
                         i=i-1;
                        if((i<=255)&&(i>=9))
                         {i=0;}
                       
             if((i>=0)&&(i<=8) )
                         {
                                 P2=tab[i];
                                 
                         }
                         
                         
    }         
               

}

}



void Timer1Interrupt(void) interrupt 3
{
    ET1=0;
    TR1=0;
           if(key1_T1==1)
                 {
                          if(key1_num<=255)
                    { key1_num++;}
                                 if(key1_num>=20)
                                 {
                                         Key1_lock=1;
                                   key1_num=0;
                                 }
                                                  
                 }
                 
                 if(key2_T1==1)
                 {
                          if(key2_num<=255)
                    { key2_num++;}
                                 if(key2_num>=20)
                                 {
                                         key2_lock=1;
                                         key2_num=0;
                                 
                                 }
                                                  
                 }
                 
                 
                 
                 
                TH1=0xD8;
    TL1=0xF0;
                ET1=1;
          TR1=1;
       
}

使用特权

评论回复
评论
Adejiang 2023-4-3 11:08 回复TA
带定时的按键判定更合理,更健壮 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

31

帖子

2

粉丝