标题: STM32按键输入程序优化设计 [打印本页]

作者: csy-2015-06    时间: 2018-9-20 10:32
标题: STM32按键输入程序优化设计
按键输入函数步骤(PA0)
1.初始化
根据电路设计决定浮空,上拉,下拉
输出
//PA0--浮空输入
GPIOA->MODER &=~(0x03<<0);
GPIOA->PUPDR &=~(0x03<<0);

2.读取IO口电平值
GPIOA->IDR&(0x01<<0)

3.去抖
3.1延时去抖(效果不好)
3.2优化:多次操作:
   读取函数内部设定条件,当设定条件满足多次才确定按下
        //第一次进来  key_c!=key_b  key_b==key_a==0xaa     times==1   
        //第二次进来  key_c!=key_b  key_b==key_a==KEY2_OK times==2
        //第三次进来  key_c== key_b==key_a==KEY2_OK       times==3
        key_c=key_b;
        key_b=key_a;
    按键按下就给key_a赋值。
        if(KEY1)//KEY1
        {
                key_a=KEY1_OK;
        }

        if(key_a==key_b&&key_b==key_c)//三次检测到高电平说明按键真的被按下了
        {
        key_sta=0;
        key_ret=key_a;

4.按键松开
4.1用while(1)等待松开(效果不好)
4.2优化:设立状态机
   1)读按键函数设定状态为 static u8 key_sta=1;
     当满足(key_sta=1&&按键电平符合按下)
     进入判断函数内部,返回值,置状态机key_sta=0;
   2)当结束一次按键按下判断后,第一层判断函数设状态机key_sta=1;

u8 Key_Scanf(void)
{
        static u8 key_sta=1; //当key_sta为1时允许做按键识别 ,为0不许做按键识别
        
        if( (!(GPIOE->IDR&(0x01<<2))) && (key_sta==1))//允许做按键识别并且有按键被按下
        {
                Key_delay( );//        延时消抖(3~5ms)        ---死等
                if( !(GPIOE->IDR&(0x01<<2)) )//重新再读取IDR寄存器,如果仍然读到高电平,
                {
                        //说明按键是真的被按下去
                        key_sta=0;                        
                        return 2;//按键被按下
                }
        }
        else if( (GPIOE->IDR&(0x01<<2)) )//没有按键被按下
        {

                key_sta=1;

        }
        
        return 0;//没有按键被按下

}
优化设计解放CPU,不会卡死在某一个点上。
晚点上传完整代码


作者: csy-2015-06    时间: 2018-9-21 13:33
正在系统学习STM32F407,自己整理资料,有不足之处欢迎指正。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1