按键触发51外部中断去抖动处理问题?

2020-02-02 09:30发布

我一般很少用按键来触发中断实现功能,只是今天用外部中断做试验的时候突然发现了这么个问题。就搭建了一个小系统,用外部按键中断控制一个LED灯的亮暗,下降引有效,进行实验结果发现用按键触发中断功能的话应该存在抖动。自己编写了个去抖动小程序用定时器中断实现(不过存在点小问题)。存在的问题是,第一次按下按键后,程序没反应没有实现相应功能,但第一次之后却又都正常实现控制LED灯亮灭的功能。下面是我写的程序,求指点。
#include<reg52.h>
#define uchar unsigned char
#define uchar unsigned char
uchar key_num;
bit key_statue;        //按键标识
uchar ms;
sbit key=P3^2;
sbit led=P1^0;
void main(void)
{
        TMOD=0x01;
        TH0=(65536-1000)/256;
        TL0=(65536-1000)%256;
        ET0=1;
        EX0=1;   
    TR0=1;
    IT0=1;
        PT0=1;
        EA=1;
        key_statue=key_num=0;
    led=1;
    while(1);       
}

void t0() interrupt 1                //1ms  用于按键去抖动。
{
        TH0=(65536-1000)/256;
        TL0=(65536-1000)%256;
        ms++;       
        if(key==0)key_num++;
        if(ms==15)           //15秒刷新一次
        {
                if(key_num>10)                //15秒钟里如果低电平持续时间大于10秒就认为按键按下,而不是抖动
                key_statue=1;                //按键标识位置1
                ms=0;
                key_num=0;
        }
}

void int0() interrupt 0      //外中断0,设定工作模式
{
        if(key_statue==1)
        {
                key_statue=0;
                led=~led;
        }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
xlnaan
1楼-- · 2020-02-02 14:27
顶一个,我是新手,也遇到这个问题,你的代码给了我启发,嘿嘿。
sf49ers
2楼-- · 2020-02-02 15:09
ms不用赋初值吗

一周热门 更多>