標(biāo)題: 如何用一個單片機定時器掃描消抖三個獨立按鍵的?能不能給個例程呢? [打印本頁]

作者: w322405    時間: 2018-8-10 15:37
標(biāo)題: 如何用一個單片機定時器掃描消抖三個獨立按鍵的?能不能給個例程呢?
請定時器消抖大神進來看看看
大家是怎么用一個定時器掃描消抖三個獨立按鍵的?能不能給個例程呢?
作者: 陳某    時間: 2018-8-10 16:21
加延時
作者: trickbb    時間: 2018-8-10 16:21
定時器掃描周期可以設(shè)置100ms,分別讀取三個按鍵對應(yīng)引腳電平
作者: nydns    時間: 2018-8-10 16:23
加個電容就 消抖了 為什么要用軟件 消抖呢?
作者: yousunny    時間: 2018-8-10 16:42
nydns 發(fā)表于 2018-8-10 16:23
加個電容就 消抖了 為什么要用軟件 消抖呢?

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

大神能給個例程嗎?框架也可以
作者: w322405    時間: 2018-8-15 20:16
有大神嗎
作者: wulin    時間: 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開始計時
        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;//計數(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;                                        //消抖計數(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;                                        //消抖計數(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;                                        //消抖計數(shù)清0
        }
}
void main()
{
        Timer0Init();
    while(1);
}
void timer0() interrupt 1
{
        TL0 = 0xF0;                //設(shè)置定時重裝值
        TH0 = 0xD8;                //設(shè)置定時重裝值
        keyscan();                //按鍵掃描
}
作者: nsf2309    時間: 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;
}
作者: 724033315    時間: 2018-8-16 13:24
wulin 發(fā)表于 2018-8-16 13:12
給你一個例程參考
#include
#define uchar unsigned char

可以哦
作者: zly13    時間: 2018-8-16 13:39
延時軟件消抖
作者: jipinxlm    時間: 2018-8-16 13:50
只加軟件消抖不太靠譜,必須要加電容才行,而且按鍵要選質(zhì)量好的
作者: 726434632    時間: 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;
                }
        }
}
作者: w322405    時間: 2018-8-18 11:24
wulin 發(fā)表于 2018-8-16 13:12
給你一個例程參考
#include
#define uchar unsigned char

謝謝大神
作者: w322405    時間: 2018-8-18 11:25
726434632 發(fā)表于 2018-8-17 10:36
u8 ReadKey(void)
{
        u8 KeyTemp = 0;

謝謝大神
作者: tonggin    時間: 2018-8-20 11:06
這幾天在學(xué)按鍵,看了馬潮老師的按鍵,自己再弄弄,還是很不理想,苦惱啊
作者: tonggin    時間: 2018-8-20 11:17
為什么的回復(fù)貼都不了審核嗎,為什么都看不到,新人怎么學(xué)習(xí)呢?
作者: w322405    時間: 2018-8-21 12:23
tonggin 發(fā)表于 2018-8-20 11:06
這幾天在學(xué)按鍵,看了馬潮老師的按鍵,自己再弄弄,還是很不理想,苦惱啊

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




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1