实验三:按键消抖
首先将按键消抖功能分成了两个模块,电平检查模块和10ms延迟模块。电平检测模块用来检测按键信号的变化(是否被按下),10ms延迟模块用来稳定电平检查模块的输入,进而稳定按键信号,防止其抖动而产生的信号跳变而影响输出。
设计思路:
1.当电平检测模块检查到按键被按下(输入由高电平变为低电平),则拉高H2L_Sig电平,然后拉低。
2.10ms延迟模块,检测到H2L_Sig高电平,则对其进行10ms过滤,拉高输出。
3.当按键被释放,电平检测模块会拉高L2H_Sig电平,然后拉低。
4.10ms延迟模块,检测到L2H_Sig高电平,则对其进行10ms过滤,拉低输出。
电平检测模块:
1.需要一个100us的计数器,用来检测电平的输入,当输入电平信号持续时间等于100us,则电平检测模块接收这个信号的输入,然后给出相应的输出信号,这其中需要定义一个使能信号isEn,控制整个电平检测模块的输出,当输入电平信号持续时间满足要求时,isEn信号被置位,电平检测模块输出被使能,由于计数器模块不是用来产生一个固定的时间,在电平检测模块输出被使能的同时,计数器的数值可以不用复位。
2.对电平检测模块进行初始化,由于电平检测模块的功能是监测电平信号的跳变,因此,对于电平的变化需要两个信号来判断。
高电平到低电平:
H2L_F1存储当前输入引脚的电平信号Pin_In;
H2L_F2存储H2L_F1引脚的电平信号,即上一个时间段Pin_In的电平信号。
通过这两个信号(H2L_F1,H2L_F2)的运算,我们得到输入信号由高电平到低电平的跳变情况的计算式,然后直接反应到电平检测模块的输出上。
time |
H2L_F1 |
H2L_F2 |
H2L_Sig |
initial |
1 |
1 |
0(初始化,输入引脚没有电平变化,则此信号结果为0) |
T1 |
0 |
1 |
1(电平从高电平变为低电平,则此信号的结果为1) |
T2 |
0 |
0 |
0(输入引脚的电平持续为低电平,输入信号没有从高到低的跳变,则此信号结果为0) |
推导得出:H2L_Sig=(!H2L_F1)&H2L_F2;
低电平到高电平:
L2H_F1存储当前输入引脚的电平信号Pin_In;
L2H_F2存储L2H_F1引脚的电平信号,即上一个时间段Pin_In的电平信号。
通过这两个信号(L2H_F1,L2H_F2)的运算,我们得到输入信号由低电平到高电平的跳变情况的计算式,然后直接反应到电平检测模块的输出上。
time |
L2H_F1 |
L2H_F2 |
L2H_Sig |
initial |
0 |
0 |
0(初始化,输入引脚没有电平变化,则此信号结果为0) |
T1 |
1 |
0 |
1(电平从低电平变为高电平,则此信号的结果为1) |
T2 |
1 |
1 |
0(输入引脚的电平持续为高电平,输入信号没有从低到高的跳变,则此信号结果为0) |
推导得出:L2H_Sig=L2H_F1&(!L2H_F2);
10ms延时模块:
1.10ms顾名思义需要有10ms的计数模块,计数器模块采用1ms+10ms架构,即先用计数器产生标准的1ms,然后当1ms计数完成后,10ms计数器加1,相当于一个进位。与先前控制LED灯不同的是,此计数模块引入了一个isCount量,用来控制整个计数器的计数。
2.case结构,本人对于case模块的理解:通常用于多输入模块,需要处理的情况较多,但每种情况的处理方法清晰,固定。在使用case结构的过程中,通常(case0:)作为一个选择项,与菜单类似,它是通往其它case(case1:,case2:,casen:)的入口,同时本人也体会到使用此种结构的好处在于每当执行完其它case(case1:,case2:,casen:),都可以设定case(i),i=0来使其复位,回到最初的选择模式中。