Hitler1992 发表于 2013-3-28 23:43:45

mega16按键去抖

为什么进入去抖检测的while时会死循环在里面,去掉那个去抖while就没事了,求大神指导
#include<iom16v.h>
#include<macros.h>
#define uint unsigned int
#define uchar unsigned char
uint qian,bai,shi,ge;
uchar temp;
#pragma data:code
const uchar table={
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};

void delay(uint z)
{
       uint x,y;
       for(x=z;x>0;x--)
               for(y=1141;y>0;y--);
}

voiddisplay(uint temp)
{          
          qian=temp/1000;
       bai=temp/100%10;
       shi=temp/10%10;
       ge=temp%10;
       PORTD=0x10;
       PORTB=table;
       delay(1);
       
       PORTD=0x20;
       PORTB=table;
       delay(1);
       
       PORTD=0x40;
       PORTB=table;
       delay(1);
       
       PORTD=0x80;
       PORTB=table;
       delay(1);
}
uchar key_press()
{
          uchar j;
          DDRD=0X0F;
          PORTD=0X0F;
          
          DDRD=0XF0;
          
          j=PIND;
          j=j&0x0f;
          if(j==0x0f)
          {
                      return 0;
          }
          else
          {
                     return 1;
          }
}
uchar key_scan()
{
          uchar key;
          delay(10);
          if(key_press())
          {
                     key=PIND;
                  key&=0x0f;
                  switch(key)
                  {
                              case 0x0e:key=1;
                                break;
                           case 0x0d:key=2;
                                break;
                           case 0x0b:key=3;
                                break;
                           case 0x07:key=4;
                                break;
                           default:
                           key=0;
                  }
                while(key_press); //去抖
          }
          else
          {
                     key=0;
          }
          return key;
}
void main()
{
       uchar i,l;
       DDRD=0X0F;
       DDRB=0XFF;
       while(1)
       {       
               i=key_press();
                  if(i)
                {
                       temp= key_scan();
                        display(temp);
                }                                     
       }        
}

foxpro2005 发表于 2013-3-29 08:28:28

去看看马老师,状态机按键的帖子吧...

ztrx 发表于 2013-3-29 08:31:10

key_press是变量还是函数?

huaming 发表于 2013-3-29 14:09:26

ztrx 发表于 2013-3-29 08:31 static/image/common/back.gif
key_press是变量还是函数?

好像是函数

Hitler1992 发表于 2013-3-29 18:11:50

ztrx 发表于 2013-3-29 08:31 static/image/common/back.gif
key_press是变量还是函数?

带返回值的函数,返回的是0或者1,之前用跟51一样的去抖方式也是死循环

Hitler1992 发表于 2013-3-29 18:14:11

ztrx 发表于 2013-3-29 08:31 static/image/common/back.gif
key_press是变量还是函数?

在哪里啊

ztrx 发表于 2013-3-29 19:26:28

你怎么当变量用

lovepig200 发表于 2013-3-29 20:14:50

本帖最后由 lovepig200 于 2013-3-29 20:19 编辑

while(key_press); //去抖key_press()括弧丢了。

也不用这么麻烦 先把引脚设置为输入模式,类似这样定义一下#define key                PIND & (1 << PD6)                //读电平      

这样就可以直接读D6脚了,不知道你用的哪个脚。
页: [1]
查看完整版本: mega16按键去抖