找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1529|回复: 4
收起左侧

单片机按键计数程序求助

[复制链接]
ID:258743 发表于 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--;
}

回复

使用道具 举报

ID:390416 发表于 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;
                }
        }
}
回复

使用道具 举报

ID:258743 发表于 2021-1-17 12:39 | 显示全部楼层
人人学会单片机 发表于 2021-1-17 11:49
void ROTARY_Key_Scan_Drive()
{
        static bit flag1=0;

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

使用道具 举报

ID:390416 发表于 2021-1-17 13:36 | 显示全部楼层
tlzyytc 发表于 2021-1-17 12:39
我看不懂,不知加到那一块

我发给你的是独立按键的 长短按扫描程序   ROTARY_MUTE是按键IO口 ,Rotary_Read_Data_Key是长短按输出值 ,ROTARY_KEY_L 和S 你自己宏定义就行  
回复

使用道具 举报

ID:332444 发表于 2021-1-17 14:37 | 显示全部楼层
加一句 while(sw3==0);在 return 0;前试看
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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