初级会员

- 积分
- 130
- 金钱
- 130
- 注册时间
- 2017-11-14
- 在线时间
- 34 小时
|
发表于 2021-3-8 15:37:16
|
显示全部楼层
本帖最后由 cjsyrzy 于 2021-3-9 10:52 编辑
看你对外部信号实时性的要求了,要求特别高就用中断,16路都用中断我觉得挺麻烦的,如果输入信号不稳定会频繁进出中断。
如果需要按键防抖我觉得不适合用中断。
我写了一个扫描的例子,先初始化然后定时执行一次 KEY_Scan(),5ms 10ms 看防抖及实时性需求,可以对多路开关执行防抖并给出上升沿下降沿,做过含有几百个开关的项目,挺好用的。每一个 bit 都是一个按键,下面的例子可以检测32个开关,更多的开关稍微改动一下就行了- #include "key.h"
- void KEY_ScanInit(KEY_TypeDef *p, uint32_t keystate, uint32_t keydefault)
- {
- p->normal = keydefault;
- p->state = keystate ^ keydefault;
- p->rising = 0;
- p->falling = 0;
- p->trigrising = 0,
- p->trigfalling = 0,
- p->prevkeystate = p->state;
- }
- void KEY_Scan(KEY_TypeDef *p, uint32_t keystate)
- {
- keystate ^= p->normal; //触发电平
- p->rising = keystate & p->trigrising; //上升沿
- p->falling = ~keystate & p->trigfalling; //下降沿
-
- p->state |= p->rising; //记录按键状态
- p->state &= ~p->falling;
-
- p->trigrising = keystate & (keystate ^ p->prevkeystate);//检测触发信号
- p->trigfalling = ~keystate & (keystate ^ p->prevkeystate);
-
- p->prevkeystate = keystate; //记录按键信息
- }
复制代码
- #ifndef __KEY_H
- #define __KEY_H
- #include "bsp.h"
- typedef struct
- {
- volatile uint32_t state; //状态
- volatile uint32_t rising; //上升沿
- volatile uint32_t falling;//下降沿
-
- volatile uint32_t trigrising; //内部计算用
- volatile uint32_t trigfalling; //内部计算用
- volatile uint32_t prevkeystate; //内部计算用
- volatile uint32_t normal; //默认输入电平
- }KEY_TypeDef;
- void KEY_ScanInit(KEY_TypeDef *p, uint32_t keystate, uint32_t keydefault);
- void KEY_Scan(KEY_TypeDef *p, uint32_t keystate);
- #endif /* __KEY_H */
复制代码
|
|