一、基础知识与明确
1、GPIO的有效电平
由按键结构决定,按键按下时输入为低电平,按键悬空时为输入为高电平,按键的输入给到GPIO的引脚(例如PC13)
2、条件控制语句
if(a):如果a为非0数字或字符那么就为真,if条件成立,反之不成立。
if(!a):如果!a为真,也就是a为0时,if条件成立,反之不成立。
if(a!=0):如果a不等于0,则使得if条件成立,反之不成立。等价于if(a)。
if(a==0): 如果a等于0,则使得if条件成立,反之不成立。等价于if(!a)。
3、单片机的执行速率一般为1s几十万次,按下按键的时长够走while循环很多次。
二、应用设计
1、功能需求
开发键控灯功能,即灯灭时,按一下按钮灯亮,灯亮时,按一下按钮灯灭。
2、设计思路
将PA5配置为数字推挽输出,PC13配置为数字输入。检测到PC13的输入从高电平变成低电平,PA5的值翻转。PA5初始输出为高电平。
3、软件流程图
4、主函数分析
int main()
{
int btn_previous,btn_current; //定义变量
LedInit(); //Led灯的初始化
BtnInit(); //按钮的初始化
btn_previous = 1; //初始化变量
while(1){
btn_current = BtnGet(); //获取当前按键的输入值
if(!btn_current) //如果按键的输入为0,则进入第一层if语句
{
if(btn_previous) //如果之前的按键输入为1,则进入第二层if语句
LedSw(); //Led灯进行翻转
}
btn_previous = btn_current; //更新按键的输入值
}
return 0;
}
(1) 初始化情况:没有按下按键的情况
(2)按下按键的瞬间
(3)继续按着按键的时候
(因为从按下到松开够while跑好多次,所以这种情况也要分析)
三、总结
1、本程序巧妙运用了btn_previous = btn_current指令来改变每次翻转后的按钮值来实现每按一次就运行一次LedSw,避免了在按的过程中程序一直跑while,而出现的亮灭快速交替的情况发生。
2、在程序内部没有由亮到灭和由灭到亮的操作之分,这是人为想要实现的目的,而在程序内部执行的只有LedSw的程序。
标签:亮灭,键控,current,while,按键,GPIO,btn,输入,previous From: https://blog.csdn.net/daviddou2022/article/details/142021454