找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2406|回復(fù): 4
收起左側(cè)

單片機(jī)按鍵計(jì)數(shù)程序求助

[復(fù)制鏈接]
ID:258743 發(fā)表于 2021-1-16 23:29 | 顯示全部樓層 |閱讀模式
在網(wǎng)上找了一個(gè)按鍵計(jì)數(shù)程序,顯示操作都正常,只是有時(shí)會(huì)按一次加2次,請(qǐng)高手幫忙加上按爭(zhēng)鍵防抖。
#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--;
}

回復(fù)

使用道具 舉報(bào)

ID:390416 發(fā)表于 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;
                }
        }
}
回復(fù)

使用道具 舉報(bào)

ID:258743 發(fā)表于 2021-1-17 12:39 | 顯示全部樓層
人人學(xué)會(huì)單片機(jī) 發(fā)表于 2021-1-17 11:49
void ROTARY_Key_Scan_Drive()
{
        static bit flag1=0;

我看不懂,不知加到那一塊
回復(fù)

使用道具 舉報(bào)

ID:390416 發(fā)表于 2021-1-17 13:36 | 顯示全部樓層
tlzyytc 發(fā)表于 2021-1-17 12:39
我看不懂,不知加到那一塊

我發(fā)給你的是獨(dú)立按鍵的 長(zhǎng)短按掃描程序   ROTARY_MUTE是按鍵IO口 ,Rotary_Read_Data_Key是長(zhǎng)短按輸出值 ,ROTARY_KEY_L 和S 你自己宏定義就行  
回復(fù)

使用道具 舉報(bào)

ID:332444 發(fā)表于 2021-1-17 14:37 | 顯示全部樓層
加一句 while(sw3==0);在 return 0;前試看
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表