标题: 单片机按键计数程序求助 [打印本页]

作者: tlzyytc    时间: 2021-1-16 23:29
标题: 单片机按键计数程序求助
在网上找了一个按键计数程序,显示操作都正常,只是有时会按一次加2次,请高手帮忙加上按争键防抖。
#include<reg52.h>
#define u8 unsigned char
#define u16 unsigned int

sbit sw1=P3^4;
sbit sw2=P3^5;
sbit sw3=P3^6;

sbit e0=P2^0;
sbit e1=P2^1;
sbit e2=P2^2;
sbit e3=P2^3;
u8 ds[4]={0,0,0,0};
u16 num=0;
u8 code table[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X00};
u8 ajsm()
{
        static u16 ms;
        if(sw3==0)
        {
                if(++ms==1)
                {
                        return 1;
                }
        }
        else
        {
                ms=0;
        }
        return 0;
}

void xs()
{
        static u8 a;
        a++;
        if(a>3)a=0;
        e0=1;
        e1=1;
        e2=1;
        e3=1;
        P0=table[ds[a]];
        switch(a)
        {
                case 0:
                {
                        e0=0;
                        e1=1;
                        e2=1;
                        e3=1;
                }
                break;
                case 1:
                {
                        e0=1;
                        e1=0;
                        e2=1;
                        e3=1;        
                }
                break;
                case 2:
                {
                        e0=1;
                        e1=1;
                        e2=0;
                        e3=1;        
                }
                break;
                case 3:
                {
                        e0=1;
                        e1=1;
                        e2=1;
                        e3=0;        
                }
                break;
        }
}

void main()
{
        TMOD=0x66;
        TH0=0xff;
        TL0=0xff;
        TH1=0xff;
        TL1=0xff;
        TR1=1;
        TR0=1;
        ET0=1;
        ET1=1;
        EA=1;
        while(1)
        {
                ds[0]=num/1000%10;
                ds[1]=num/100%10;
                ds[2]=num/10%10;
                ds[3]=num%10;
                xs();
                if(ajsm())
                {
                        num=0;
                }
        }
}

void time0()interrupt 1
{

        if(num<9999)num++;


}

void time1()interrupt 3
{
        if(num>0)num--;
}


作者: 人人学会单片机    时间: 2021-1-17 11:49
void ROTARY_Key_Scan_Drive()
{
        static bit flag1=0;
        static bit flag2=1;
        static bit key_down=0;
        static u8 count1=0;
        static u16 count2=0;
        if(key_down==1)
        {
                count2++;
                if(count2>10000)
                {
                        count2=0;
                        flag1=1;
                        if(flag2)
                        {
                                flag2=0;
                                Rotary_Read_Data_Key=ROTARY_KEY_L;
                        }
                }
                if(ROTARY_MUTE==1)
                {
                        key_down=0;
                        flag2=1;
                        count2=0;
                        if(flag1)
                        {
                                flag1=0;
                        }
                        else
                        {
                                Rotary_Read_Data_Key=ROTARY_KEY_S;       
                        }
                }
        }
        else
        {
                if(ROTARY_MUTE==0)
                {
                        count1++;
                        if(count1>100)
                        {
                                count1=0;
                                if(ROTARY_MUTE==0)
                                {
                                        key_down=1;
                                }
                        }
                }
                else
                {
                        count1=0;
                }
        }
}
作者: tlzyytc    时间: 2021-1-17 12:39
人人学会单片机 发表于 2021-1-17 11:49
void ROTARY_Key_Scan_Drive()
{
        static bit flag1=0;

我看不懂,不知加到那一块

作者: 人人学会单片机    时间: 2021-1-17 13:36
tlzyytc 发表于 2021-1-17 12:39
我看不懂,不知加到那一块

我发给你的是独立按键的 长短按扫描程序   ROTARY_MUTE是按键IO口 ,Rotary_Read_Data_Key是长短按输出值 ,ROTARY_KEY_L 和S 你自己宏定义就行  
作者: xianfajushi    时间: 2021-1-17 14:37
加一句 while(sw3==0);在 return 0;前试看




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1