基于Stm32F103C8T6最小系统板的按键输入实验避坑须知(正点原子例程)

最近在准备省电赛,明天就开赛了。模块准备的差不多了,昨天打算写几个按键备用。结果调试折腾了一下午和一晚上,临走前才找到问题。希望对被相同问题困扰的各位有所帮助。

之前测试过按键进中断的方式,后来和队友交流为了防止中断紊乱,选择了原子哥的按键扫描方法,不用while的非阻塞扫描瞬间被圈粉。

材料
C8T6 X 1
面包板 X 1
杜邦线 若干
按键 若干
在这里插入图片描述
按键须知
1.按键可简单分为两种 接GND和接VCC,分别对用上拉输入和下拉输入
即:
上拉输入 默认为H,按键按下拉低 IO+按键+GND 下降沿触发
下拉输入 默认位L,按键按下拉高 IO+按键+VCC 上升沿触发

2.正点原子扫描函数逻辑`

u8 KEY_Scan(u8 mode)
{	 
	static u8 key_up=1;//按键按松开标志
	if(mode)key_up=1;  //支持连按		  
	if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
	{
		delay_ms(10);//去抖动 
		key_up=0;
		if(KEY0==0)return KEY0_PRES;
		else if(KEY1==0)return KEY1_PRES;
		else if(KEY2==0)return KEY2_PRES;
		else if(WK_UP==1)return WKUP_PRES;
	}else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1; 	    
 	return 0;// 无按键按下
y}

> 推荐一篇不错的分析 简单易懂
> https://blog.csdn.net/qq_34447192/article/details/79860924

翻车经历

一方面图省事,一方面之前调车的经历实在让我对杜邦线头疼的很,所以一开始只选了一个下拉按键进行调试(运气差选了最容易走弯的一条路),后来一直出现不了结果加了一个上拉,没逻辑的调了半天。

Tip1
1.IO口基本配置一定要正确,时钟函数别用错、参数要改对(血泪,之前犯过的很低级的错误)
2.IO口上下拉模式要正确
3.最后要加一句IO口电平初始化配置
例如: 配置为 下拉输入 最后要加一句GPIO_ResetBits();
反之需要置1
不然可能调半天灯都不亮不了

Tip2
原子哥写的函数里面if语句有优先级!!!
刚刚说选择了最容易走弯的一条路不是指上拉按键不好使,而是我选择那个按键是优先级最低的一组。
**KEY0>KEY1>KEY2>KEY3
然后就会不停进前三个按键if判断循环,导致失效
解决方法
1.不要图麻烦,把其它三个按键按照配置接上去
2.直接把不用按键读取IO位置0/1
例如我有两个上拉按键没有接
在这里插入图片描述
以上可从根据带入扫描函数的逻辑理解原理

温馨提示

1.确认代码没问题后多找硬件问题
2.不要图麻烦,虽然杜邦线多了确实恶心人(出错时候可以看看手册debug调试一下看看波形的)
3.按键这东西还是用几个参考代码写几个吧

被折腾了接近一天,学到了知识积累到经验的同时,也确实反映了我菜的真实!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值