标题:
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