找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1796|回复: 1
打印 上一主题 下一主题
收起左侧

STM32按键输入程序优化设计

[复制链接]
跳转到指定楼层
楼主
ID:237239 发表于 2018-9-20 10:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
按键输入函数步骤(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,不会卡死在某一个点上。
晚点上传完整代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:237239 发表于 2018-9-21 13:33 | 只看该作者
正在系统学习STM32F407,自己整理资料,有不足之处欢迎指正。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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