只要我跑的速度够快,寂寞就追不上我
只要Key和Led切换速度够快,人眼就看不出来————小白
如果你存在按键Key和显示Led共用同一个IO时,需要分时复用的需求,则可以移植代码进行使用:
- 代码所占code少于0.5K
- 线程安全,中断安全
- 可移植性高,配置容易
注意:系统需要存在一个至少为1ms的时钟中断
01 - PCB原理图例程
举2个Key和Led共用IO口的例子,当MCU的IO口资源不足时,通常会让一些可以用速度欺骗人眼的做法进行资源的节省,比如Key扫描、Led扫描等,例如Led的扫描只要高于25Hz的速度,人眼就基本看不出闪烁,例如Key扫描只要大于100Hz,人的触感就难以察觉。
02 - 分时复用的注意项和设计
2.1 - 注意项
Led和Key的分时复用需要考虑几个情况:
1、Led扫描的频率,必须高于肉眼能看见闪烁的频率25HZ。一般为了效果较好,都会大于50HZ,也就是Led扫描时间<=20ms
2、保证分时复用,扫描一定要有先后顺序。要确保Led扫描期间不能进行Key扫描,同时确保Key扫描期间不能进行Led扫描
3、Led需要备份当前状态。因为扫描Key时Led是不起作用的,Key扫描完成后需要恢复Led的状态
4、注意Led切换为Key时的准备动作。Led切换为Key时根据原理图要做哪些准备工作以防止切换后Key误触发,而Key切换为Led时按照电路决定是否需要做准备动作
5、Led扫描时间比Key扫描时间长。考虑到肉眼的观察是最容易受影响的,时刻都能看见,而按键的使用次数则较低
2.2 - 设计
根据注意项,总体设计如下:
1、系统需要有一个至少为1ms的时钟中断,里面调用扫描ISR函数LedKeyStatusSwitchService_1ms,用于保证高频扫描
2、理清状态机,存在2种状态的切换,分别为KeyState和LedState,值得注意的是,Led和Key的数量暂时未知,如果数量较多则实际的扫描动作不宜在中断内进行,此时中断则只做状态切换,所以2个状态分别需要一个记录器
3、决定取舍,Led为人眼可见,最为敏感,Led的扫描动作直接放在中断进行,舍弃Key的中断扫描,让Key在前台进行扫描
03 - 代码实现
以例程1的PCB为例,整个分时复用时间为6ms(167Hz),其中Led扫描占据4ms,Key扫描占据2ms,下面为参考代码:
#define LED_SACND_TIME_MS 4
#