博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

实验三:按键消抖

    首先将按键消抖功能分成了两个模块,电平检查模块和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_F1H2L_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_F1L2H_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来使其复位,回到最初的选择模式中。