dela2000 发表于 2014-4-9 11:21:26

按键去抖动程序放在定时器中断就有问题?

这个按键程序来源于:《AVR单片机原理及测控工程应用》,因为我只用到5个独立式按键,所以简单改写如下:


这个放在主循环中是可以使用的,但是存在一个问题,因为主程序量是变化的(根据分支不同),只有一个分支启动,延时去抖动时间( c_wobble_time设定为120)响应很快,但如果所有分支都启动,时间就不合适。


书上有提到可以利用系统的定时中断读取,于是我将其放在1ms定时中断读取,但是无法响应,修改如下
1.主函数中key_val为全局变量,通过下面定时中断得到键值

2.下图为1ms定时器中断读取键值,黄色为读取键值



请大家帮忙看看问题出在哪里?谢谢!

sf49ers 发表于 2014-4-9 12:59:54

read_key()里的return作的不对,仅在key_count==c_wobble_time时能返回key_value,其他都会返回0x1f。
放在主循环里这个问题不明显,因为顺序执行,每次reak_key()后必会跟着switch。
但放在定时中断,两者没有相关性了,switch时基本不可能是key_value。
简单的可以这么改

reak_key()
{
   ...
   if(++key_count == c_wobble_time)
{
    key_valid = 1;
    key_code = key_value;
}
...
}

while(1)
{
if(key_valid == 1)
{
    key_valid = 0;
    switch(key_code)
    {
   ...
    }
}
}

dela2000 发表于 2014-4-9 14:05:15

sf49ers 发表于 2014-4-9 12:59
read_key()里的return作的不对,仅在key_count==c_wobble_time时能返回key_value,其他都会返回0x1f。
放在 ...

好好的理解您讲的思路,确实说到了本质,switch的值基本都是0x1f,根据sf49ers提供的方法,修改后程序如下,经实际运行后ok:
修改后各程序如下:其中key_code,key_valid为全局变量
1.按键程序:

2.中断程序:

3.主循环:



目前手头这个板子程序基本调试完毕,功能基本实现,非常感谢sf49ers,在关键几个点上给出了非常到位的建议~

shjw 发表于 2014-4-9 14:49:03

2楼看的很仔细佩服
其实我一般处理程序都不放在中断里,中断就是给个标志位

jz701209李 发表于 2014-4-10 15:17:59

学习了                     
页: [1]
查看完整版本: 按键去抖动程序放在定时器中断就有问题?