【微处理器系统原理与应用设计第九讲】GPIO之按键控灯功能——按键控制灯进行亮灭转换的应用设计与程序分析

一、基础知识与明确

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的程序。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值