最近在准备省电赛,明天就开赛了。模块准备的差不多了,昨天打算写几个按键备用。结果调试折腾了一下午和一晚上,临走前才找到问题。希望对被相同问题困扰的各位有所帮助。
之前测试过按键进中断的方式,后来和队友交流为了防止中断紊乱,选择了原子哥的按键扫描方法,不用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.按键这东西还是用几个参考代码写几个吧
被折腾了接近一天,学到了知识积累到经验的同时,也确实反映了我菜的真实!