微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于按键去抖动的问题

关于按键去抖动的问题

时间:10-02 整理:3721RD 点击:


哪位大神帮忙解答一下,我这个程序运行的时候,按键按下去,灯亮一次,再按多少次灯都不变化,但是改成                        #define uchar unsigned char //定义一下方便使用
#define uint unsigned int
#define ulong unsigned long
#include <reg52.h> //包括一个52 标准内核的头文件
sbit P10 = P1^0; //头文件中没有定义的IO 就要自己来定义了
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit K1= P3^2;
bit ldelay=0; //长定时溢出标记,预置是0
uchar speed=10; //设置一个变量保存默认的跑马灯的移动速度
uchar speedlever=0; //保存当前的速度档次
//用外中断方式读按键K1,点亮一个LED
   void delay(void)
           { uint i;
         for (i=3000;i>0;i--);
          }
void main(void) // 主程序
{
IT0=1; //外中断跳变产生中断
EX0=1;
EA=1; //打开总中断
  while(1)
{if (!K1)
{
delay();
           ldelay=~ldelay;
        while(!K1)
delay()  ;
        P10=ldelay;
}

}
}
这个程序后就正常了,为什么呢?急急急急

P10=light;
后面加个延时看看

这回真是对了,那为什么,下面那个程序{if (!K1)
{
delay();
           ldelay=~ldelay;
        while(!K1)
delay()  ;
        P10=ldelay;
}
这地方不加延时为什么可以呢

你的中断函数是怎么定义的?

在上面程序中没有用中断,只是先做了按键去抖的实验

要不你把P10=light;放到if(!K1){}中试验一下。
另外,仿真器有时候不是很好使的。

这次明白了,就是不是之前发现的P10=light,后面需要加延时才行,而是这句话要放到if (!K1){}的大括号里面。我参考的那个第一个程序是错误的。谢谢

我理解的去抖就是读取-延迟-再读取-确认-防松手死循环-松手-输出

那你理解的程序是什么样的?为什么读取,延迟完了,还要再读取,确认,然后再放松手死循环,松手,输出,好像跟我看到的程序不一样

第一次读取,假如是1,延迟以后再读取仍然是1的话,那就说明确定按下了,最后加个简单的while防松手死循环,目的是松手以后再输出,否则一直停留在读取延迟读取中。

你可以试试在if(!k1)前面加个K1=1;

                                               

不错,顶一下小编,值得收藏

谁有按键扫描的代码,或是资料,就是电脑键盘那种,缩小版的键盘,13x5的矩阵,只要能扫描出键值 就行,急急急,马上过年了。要 懂 啊  有的 加我扣扣 897094185 ,贵蟹了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top