OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3106|回复: 1

按键输入模块针对延时滤波的软件优化之实际应用

[复制链接]

2

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2019-5-26
在线时间
15 小时
发表于 2019-5-26 11:37:55 | 显示全部楼层 |阅读模式
1金钱
个人认为支不支持连按,应该是使用按键的应用应该关系的问题,而不是按键本身,使用延时滤波不太好,下列程序是软件滤波的程序,可根据不同硬件进行滤波,初学STM32不当之处请修改,望正点原子采纳


u8 KEY_Scan_Opt()
{
    static u8 key0PreState = 0; //保存上一次工作状态,0表示上一次没有按下
    static u8 key1PreState = 0;
    static u8 key2PreState = 0;
    static u8 wkupPreState = 0;

    static u32 key0FilterNum = 0;
    static u32 key1FilterNum = 0;
    static u32 key2FilterNum = 0;
    static u32 wkupFilterNum = 0;
   
    u8 keyStateCom = 0;         //按键状态的组合,BIT0:KEY0  BIT1:KEY1  BIT2:KEY2  BIT3:WK_UP  相应的位为1表示按下,位为0表示没有按下

    if((key0PreState == 0) && (KEY0 == 0))
    {
        key0FilterNum++;
    }
    else
    {
        key0FilterNum = 0;
    }

    if(key0FilterNum > 1000)
    {
        key0PreState = 1;
        keyStateCom |= 0x01;
    }
    else if(key0PreState == 1)
    {
        if(KEY0 == 0)
        {
            key0PreState = 1;
            keyStateCom |= 0x01;
        }
        else
        {
            key0PreState = 0;
            keyStateCom &= ~0x01;
        }
    }

    if((key1PreState == 0) && (KEY1 == 0))
    {
        key1FilterNum++;
    }
    else
    {
        key1FilterNum = 0;
    }
    if(key1FilterNum > 1000)
    {
        key1PreState = 1;
        keyStateCom |= 0x02;
    }
    else if(key1PreState == 1)
    {
        if(KEY1 == 0)
        {
            key1PreState = 1;
            keyStateCom |= 0x02;
        }
        else
        {
            key1PreState = 0;
            keyStateCom &= ~0x02;
        }
    }

    if((key2PreState == 0) && (KEY2 == 0))
    {
        key2FilterNum++;
    }
    else
    {
        key2FilterNum = 0;
    }

    if(key2FilterNum > 1000)
    {
        wkupPreState = 1;
        keyStateCom |= 0x04;
    }
    else if(key2PreState == 1)
    {
        if(KEY2 == 0)
        {
            key2PreState = 1;
            keyStateCom |= 0x04;
        }
        else
        {
            key2PreState = 0;
            keyStateCom &= ~0x04;
        }
    }

    if((wkupPreState == 0) && (WK_UP == 1))
    {
        wkupFilterNum++;
    }
    else
    {
        wkupFilterNum = 0;
    }
    if(wkupFilterNum > 1000)
    {
        wkupPreState = 1;
        keyStateCom |= 0x08;
    }
    else if(wkupPreState == 1)
    {
        if(WK_UP == 1)
        {
            wkupPreState = 1;
            keyStateCom |= 0x08;
        }
        else
        {
            wkupPreState = 0;
            keyStateCom &= ~0x08;
        }
    }
   
    return keyStateCom;
}

void keyProcCtrlLed(u8 key)
{
    static u8 led0sta = 1, led1sta = 1;         //LED0,LED1的当前状态
    static u8 keyPreSta = 0; //上一次按键的状态

        if(((keyPreSta & 0x01) == 0x00) && (key & 0x01))
        {
                led0sta = !led0sta;
        led1sta = !led1sta;
        }

        if(((keyPreSta & 0x02) == 0x00) && (key & 0x02))
        {
                led1sta = !led1sta;
        }

        if(((keyPreSta & 0x04) == 0x00) && (key & 0x04))
        {
                led0sta = !led0sta;
        }

        if(((keyPreSta & 0x08) == 0x00) && (key & 0x08))
        {
                led1sta = !led1sta;
        led0sta = !led1sta;
        }

        keyPreSta = key;

    LED0(led0sta);        //控制LED0状态
    LED1(led1sta);        //控制LED1状态
}

int main(void)
{
    u8 key = 0;
    Cache_Enable();                 //打开L1-Cache
    HAL_Init();                        //初始化HAL库
    Stm32_Clock_Init(432, 25, 2, 9); //设置时钟,216Mhz
    delay_init(216);                //延时初始化
    uart_init(115200);                //串口初始化
    LED_Init();                     //初始化LED
    KEY_Init();                     //按键初始化
    while(1)
    {
                key = KEY_Scan_Opt();
                keyProcCtrlLed(key);
    }
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2019-5-27 02:20:42 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-14 22:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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