登錄|立即注冊|使用QQ帳號登錄
論壇 > 24小時必答區(qū)
發(fā)帖|
看6017|回18|收藏
樓主 ID:225054 只看他
2018-8-10 15:37
請定時器消抖大神進(jìn)來看看看
大家是怎么用一個定時器掃描消抖三個獨(dú)立按鍵的?能不能給個例程呢?
沙發(fā) ID:209315 只看他
2018-8-10 16:21
加延時
板凳 ID:81834 只看他
2018-8-10 16:21
定時器掃描周期可以設(shè)置100ms,分別讀取三個按鍵對應(yīng)引腳電平
地板 ID:385030 只看他
2018-8-10 16:23
加個電容就 消抖了 為什么要用軟件 消抖呢?
5# ID:308437 只看他
2018-8-10 16:42

引用:

nydns 發(fā)表于 2018-8-10 16:23
加個電容就 消抖了 為什么要用軟件 消抖呢?

軟件省錢~~
6# ID:225054 只看他
2018-8-10 18:05

引用:

trickbb 發(fā)表于 2018-8-10 16:21
定時器掃描周期可以設(shè)置100ms,分別讀取三個按鍵對應(yīng)引腳電平

大神能給個例程嗎?框架也可以
7# ID:225054 只看他
2018-8-15 20:16
有大神嗎
8# ID:213173 只看他
2018-8-16 13:12
給你一個例程參考
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P2^0;
sbit key2=P2^1;
sbit key3=P2^2;
sbit LED1=P1^0;
sbit LED2=P1^1;
sbit LED3=P1^2;

void Timer0Init()        //10毫秒@12.000MHz
{
        TMOD= 0x01;                //設(shè)置定時器模式
        TL0 = 0xF0;                //設(shè)置定時初值
        TH0 = 0xD8;                //設(shè)置定時初值
        TR0 = 1;                //定時器0開始計(jì)時
        EA=1;                        //開總中斷
        ET0=1;                        //開定時器0中斷
}
void keyscan()                                        //按鍵掃描程序
{
        static bit key1_lock=0,key2_lock=0,key3_lock=0;//按鍵自鎖標(biāo)志
        static uchar count1=0,count2=0,count3=0;//計(jì)數(shù)變量                       
        if(!key1)                                        //檢測按鍵如果為0
        {
                if((count1++>=2)&&(key1_lock==0))//延時20ms
                {                       
                        key1_lock=1;                        //按鍵自鎖標(biāo)志置1
                        LED1=~LED1;
                }
        }
        else                                                        //按鍵抬起
        {
                key1_lock=0;                                //按鍵自鎖標(biāo)志清0
                count1=0;                                        //消抖計(jì)數(shù)清0
        }
        if(!key2)                                        //檢測按鍵如果為0
        {
                if((count2++>=2)&&(key2_lock==0))//延時20ms
                {                       
                        key2_lock=1;                        //按鍵自鎖標(biāo)志置1
                        LED2=~LED2;
                }
        }
        else                                                        //按鍵抬起
        {
                key2_lock=0;                                //按鍵自鎖標(biāo)志清0
                count2=0;                                        //消抖計(jì)數(shù)清0
        }
        if(!key3)                                        //檢測按鍵如果為0
        {
                if((count3++>=2)&&(key3_lock==0))//延時20ms
                {                       
                        key3_lock=1;                        //按鍵自鎖標(biāo)志置1
                        LED3=~LED3;
                }
        }
        else                                                        //按鍵抬起
        {
                key3_lock=0;                                //按鍵自鎖標(biāo)志清0
                count3=0;                                        //消抖計(jì)數(shù)清0
        }
}
void main()
{
        Timer0Init();
    while(1);
}
void timer0() interrupt 1
{
        TL0 = 0xF0;                //設(shè)置定時重裝值
        TH0 = 0xD8;                //設(shè)置定時重裝值
        keyscan();                //按鍵掃描
}
9# ID:386866 只看他
2018-8-16 13:24
sbit input1 = P0^0;
sbit input2 = P0^1;
sbit input3 = P0^2;

bit Key1()
{
    if(input1)
    {
        Delay(100);
        if (input1) return 1;
    }
    return 0;
}
10# ID:386867 只看他
2018-8-16 13:24

引用:

wulin 發(fā)表于 2018-8-16 13:12
給你一個例程參考
#include
#define uchar unsigned char

可以哦
11# ID:386630 只看他
2018-8-16 13:39
延時軟件消抖
12# ID:383873 只看他
2018-8-16 13:50
只加軟件消抖不太靠譜,必須要加電容才行,而且按鍵要選質(zhì)量好的
13# ID:98526 只看他
2018-8-17 10:36
u8 ReadKey(void)
{
        u8 KeyTemp = 0;
        if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_7)  == Bit_RESET) { KeyTemp = SW_SET; }
        if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_6)  == Bit_RESET) { KeyTemp = SW_UP;  }
        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14) == Bit_RESET) { KeyTemp = SW_OK;  }
        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15) == Bit_RESET) { KeyTemp = SW_DOWN;}
        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == Bit_RESET) { KeyTemp = SW_SW;}
        return KeyTemp;
}



void KeyPrcoess(void)
{
        static u8 KeyValueTemp    = 0;
        static u8 KeyLastTemp     = 0;
        static u8 KeyFiliterCnt   = 0;
       
        if(KeyScanCnt1ms > 10)
        {
       
            KeyScanCnt1ms = 0;
            KeyLastTemp  = KeyValueTemp;
            KeyValueTemp = ReadKey();
            if(KeyValueTemp != 0)
                {
                       
                        if(KeyFiliterCnt < 200)KeyFiliterCnt++;
            else
            {
                KeyValue = KeyLastTemp;
            }
                }
                else
                {
                       
                        if(KeyFiliterCnt > 1 && KeyFiliterCnt != 200)
                        {
                                KeyValue = KeyLastTemp;
                        }
                        KeyFiliterCnt = 0;
                }
        }
}
14# ID:225054 只看他
2018-8-18 11:24

引用:

wulin 發(fā)表于 2018-8-16 13:12
給你一個例程參考
#include
#define uchar unsigned char

謝謝大神
15# ID:225054 只看他
2018-8-18 11:25

引用:

726434632 發(fā)表于 2018-8-17 10:36
u8 ReadKey(void)
{
        u8 KeyTemp = 0;

謝謝大神
16# ID:208849 只看他
2018-8-20 11:06
這幾天在學(xué)按鍵,看了馬潮老師的按鍵,自己再弄弄,還是很不理想,苦惱啊
17# ID:208849 只看他
2018-8-20 11:17
為什么的回復(fù)貼都不了審核嗎,為什么都看不到,新人怎么學(xué)習(xí)呢?
18# ID:225054 只看他
2018-8-21 12:23

引用:

tonggin 發(fā)表于 2018-8-20 11:06
這幾天在學(xué)按鍵,看了馬潮老師的按鍵,自己再弄弄,還是很不理想,苦惱啊

一起加油
19# ID:137736 只看他
2018-8-21 18:27
在定時器中斷中讀端口值,寫入標(biāo)志變位,然后判斷傳遞參數(shù)到主程序。定時器要重裝入一直運(yùn)行。這個方法主程序不用等待。

51黑電子論壇

Powered by Discuz! X3.1

首頁|標(biāo)準(zhǔn)版|觸屏版|電腦版