求设计一个C语言的流水灯只流一次后全部常亮的代码

一、逻辑编写思路梳理(长短按以1s做举例)

a、对于一个按键的长按和短按,都有一个按下(上升沿)的过程;

b、当按键在规定的时间内松开(下降沿),就短按;

c、按下的时长大于规定的时间就是长按。

d、那么要实现该功能,就需要在按键按下时,开始计时。在时间范围内出现下降沿就是短按,否则就是长按。

e、对于现有的逻辑块中具有计时功能个采集下降沿功能的只有“one shot”和“retrig one shot”;其中“retrig one shot”是重复计时,不符合我们的需求。

f、同样的连续计时的还有“debounce”。

2、逻辑编写(写法一)a、用两个“one shot”分别采集按键的上升沿和下降沿。

这里上升沿计时为0.8s,即按键按下去,输出0.8s的高电平;短按计时0.3s,即按键送开时,输出0.3s的高电平。

这样如果在0.8s内,按键松开,可以直接认为是短按。

?为什么不将0.8直接填写成1s,是因为下面采用“debounce”计时1s;防止按键恰好在1s左右时松开,短按和长按同时被触发的情况发生。建议时间写成0.5和0.2

b、将两个信号经过“and”,如果“and”输出为1,则表示当前为短按输出。

c、用“debounce”计时1s,作为连续长按计时;输出结果为长按。

以上,我们已经拿到短按的输出“key_up_down”和长按输出“key_debounce”;

我们可以直接用这两个变量分别进行触发短按需要的场景功能和长按要触发的“stepper”场景功能。

在按键恰好在0.8s-1s之间松开时,无法执行任何动作。

由于上升沿计时输出0.8s高电平,所以不支持连续快速短按。

3、逻辑编写(写法二:解决写法一的缺点1)

a、将写法一的上升沿计时修改为1s;

b、上面我们已经拿到了1s内的短按输出“key_up_down”和“key_debounce”;那么我们使用“Binary Decoder ”进行情况过滤输出过滤后的长按和短按。

否则不会触发长按或短按输出。

4、逻辑编写(写法三:在写法二的基础上解决写法一的缺点2)

a、将上升沿和下降沿的“one shot”增加复位变量

在这里,当“key_reset”触发时,会对“one shot”进行复位,以便于重新开始计时。

b、每当短按或长按生效时,都对“one shot”进行复位。

为什么加上“de_o4”是防止在短按和长按同时生效的情况发生也能复位重新来过;

为什么不加“de_o1”,是因为正常情况下这个变量的输出状态值就为1;

为什么要加个“stepper”延时0.2s,是给输出的长短按信号个脉冲宽度,以防宽度太窄无法生效

备注:由于“debounce”特性,以上写法中存在:“长按和长按,短按和长按的间隔要大于1s,否则不执行下次的长按”问题。

我要回帖

更多关于 流水灯程序c语言 的文章

 

随机推荐