vhdl消抖程序意思

vhdl消抖程序意思,第1张

这其实是用一个计数器来判断输入的脉冲的宽度,如果宽度大于3个脉冲,则认为这次输入有效,输出一个脉冲宽度的脉冲来替代输入信号,否则认为该次输入无效!

library ieee

use ieee.std_logic_1164.all

entity xiaodou is

port(clk,input: in std_logic

output: out std_logic)

end xiaodou

architecture xiaodou_arc of xiaodou is

signal cp:std_logic

signal count:integer range 0 to 3

begin

process(clk)

begin

if(clk'event and clk='1') then 检测上升沿

if(input='1')then 如果有输入信号

if(count=3)then count<=count当计数达到3时,保持计数值不变

else count<=count+1 当其小于3时,进行加1处理

end if

if(count=2)then cp<='1' 如果计数达到2,cp置1

else cp<='0'其余情况全部为0

end if

else count<=0 如果计数出现非法状况,进行清零复位

end if

end if

output<=cp 信号输出

end process

end xiaodou_arc

使用这个到板子里面:

#include <reg52.h>

sbit ADDR0 = P1^0

sbit ADDR1 = P1^1

sbit ADDR2 = P1^2

sbit ADDR3 = P1^3

sbit ENLED = P1^4

sbit KEY1 = P2^4

sbit KEY2 = P2^5

sbit KEY3 = P2^6

sbit KEY4 = P2^7

unsigned char code LedChar[] = { //数码管显示字符转换表0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E}

void delay()

void main(){

bit keybuf = 1//按键值暂存,临时保存按键的扫描值

bit backup = 1//按键值备份,保存前一次的扫描值

unsigned char cnt = 0//按键计数,记录按键按下的次数

ENLED = 0 //选择数码管 DS1 进行显示

ADDR3 = 1

ADDR2 = 0

ADDR1 = 0

ADDR0 = 0

P2 = 0xF7 //P2.3 置 0,即 KeyOut1 输出低电平

P0 = LedChar[cnt] //显示按键次数初值

while (1){

keybuf = KEY4 //把当前扫描值暂存

if (keybuf != backup){  //当前值与前次值不相等说明此时按键有动作

delay() //延时大约 10ms

if (keybuf == KEY4){  //判断扫描值有没有发生改变,即按键抖动

if (backup == 0){  //如果前次值为 0,则说明当前是d起动作

cnt++ //按键次数+1

//只用 1 个数码管显示,所以加到 10 就清零重新开始

if (cnt >= 10){

cnt = 0

}

P0 = LedChar[cnt]//计数值显示到数码管上

}

backup = keybuf//更新备份为当前值,以备进行下次比较

}

}

}

}

/* 软件延时函数,延时约 10ms */

void delay(){

unsigned int i = 1000

while (i--)

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12040967.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-20
下一篇2023-05-20

发表评论

登录后才能评论

评论列表(0条)

    保存