搜索
bottom↓
回复: 7

mega16按键去抖

[复制链接]

出0入0汤圆

发表于 2013-3-28 23:43:45 | 显示全部楼层 |阅读模式
为什么进入去抖检测的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[10]={
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--);
}

void  display(uint temp)
{          
          qian=temp/1000;
         bai=temp/100%10;
         shi=temp/10%10;
         ge=temp%10;
         PORTD=0x10;
         PORTB=table[qian];
         delay(1);
         
         PORTD=0x20;
         PORTB=table[bai];
         delay(1);
         
         PORTD=0x40;
         PORTB=table[shi];
         delay(1);
         
         PORTD=0x80;
         PORTB=table[ge];
         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);
                }                                           
         }          
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入76汤圆

发表于 2013-3-29 08:28:28 | 显示全部楼层
去看看马老师,状态机按键的帖子吧...

出0入4汤圆

发表于 2013-3-29 08:31:10 | 显示全部楼层
key_press是变量还是函数?

出0入0汤圆

发表于 2013-3-29 14:09:26 | 显示全部楼层
ztrx 发表于 2013-3-29 08:31
key_press是变量还是函数?

好像是函数

出0入0汤圆

 楼主| 发表于 2013-3-29 18:11:50 | 显示全部楼层
ztrx 发表于 2013-3-29 08:31
key_press是变量还是函数?

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

出0入0汤圆

 楼主| 发表于 2013-3-29 18:14:11 | 显示全部楼层
ztrx 发表于 2013-3-29 08:31
key_press是变量还是函数?

在哪里啊

出0入4汤圆

发表于 2013-3-29 19:26:28 | 显示全部楼层
你怎么当变量用

出0入0汤圆

发表于 2013-3-29 20:14:50 | 显示全部楼层
本帖最后由 lovepig200 于 2013-3-29 20:19 编辑

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

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

这样就可以直接读D6脚了,不知道你用的哪个脚。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 03:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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