从物理层抽象出来状态机,以按键消抖为例

按键在未被按下时状态为高电平,按下后为低电平,按下与释放按键都会存在一段时间的抖动期,这个抖动的存在对电路的设计时极其不好的,可能会让电路处于未知状态,所以设计电路中需要用到按键的,一定要设计他的消抖电路,设计的消抖电路要能滤除抖动,并且能输出按键的状态以及按键被按下的时刻,所以设计的模块输入为按键,输出为按键状态以及按键被消除抖动后按键被按下的标志,一般情况下我们认为抖动时间不超过20ms,超过20ms我们即认为按键被按下或被释放

上图是按键在被按下与被释放使电路的状态,根据上图抽象出他的状态转移图

在写一个电路之前,我们不仅要知道他大概的实际电路,也要能够想象出该电路的时序图如下图所示

仿真后实际的波形展示

关于矩阵按键

通过原理图我们可以看出,可以通过八个引脚得到一个4X4的矩阵键盘,将行(row)连接上拉电阻,在列(col)连接到地,这样在没有按键按下时行(row)维持在高电平,有按键按下时,某一行的电平为0

如何实现矩阵电路的检测呢,或者说如何知道按下的是哪一个按键呢,注意是一个键?

这里要引入一个扫描的概念

将行设置为输入,列设置为输出,建立一个状态机

如果行的输入不都为1,那么启动扫描,即将列值输出设置为

col <= 4'b0111; col <= {col[2:0], col[3]}

即将从来循环左移,列值每变化一次,将输入的行值寄存下来

检测行值,记录行值的变化,注意不是此时的行值,是变化

也就是说,要记住被消抖后的行值,此时的行值,此时的列值

行列确定后,就可以确定是哪一个键被按下

对于两个键也是可以被检测出来的,如果检测多个同时被按下,只不过寄存器要多一些

本人不为这句话负责:最多能同时检测多少个按键呢?我感觉是十六个,没有理论验证过,有兴趣的可以验证一下,但是复杂度会上升不少

这里只说只能检测一个按键的状态机,如果检测器发现有两个键被按下,则为检测失败

但也有检测失败的时候,比如恰好在检测第二行时发生抖动,检测失败则状态机进入等待释放状态,检测下一次

下图为矩阵按键的状态跳转图

仿真模型

//file name tb_key_4x4;

`timescale 1ns/1ns

`define clk_period 20

module tb_key_4x4();

reg clk;

reg rst;

wire [3:0]key_row;

wire [3:0]key_col;

wire key_flag;

wire [3:0]key_value;

key_4x4 key_4x4(

.clk(clk),

.rst(rst),

.key_row(key_row),

.key_col(key_col),

.key_flag(key_flag),

.key_value(key_value)

);

key_model key_mode_inst(key_col,key_row);

initial clk = 1'b1;

always#(`clk_period/2) clk = ~clk;

initial begin

rst = 1'b0;

#200

rst = 1'b1;

end

endmodule

//end file

//file name key_model;

module key_model(

key_col,

key_row

);

input [3:0]key_col;

output reg [3:0]key_row;

reg [3:0]key_row_r;

reg key_row_sel;

reg [1:0]now_col, now_row;

initial begin

now_col = 0;

now_row = 0;

key_row_sel = 0;

end

initial begin

key_row = 4'b1111;

#50_000_000;

press_key(0,3);

press_key(1,2);

press_key(2,1);

press_key(3,0);

end

reg [15:0] shake_time = 0;

task press_key;

input [1:0]col,row;//注:不用在任务函数外进行定义

begin

key_row_sel = 0;

key_row_r = 4'b1111;

key_row_r[row] = 0;

now_row = row;

repeat(20)begin

shake_time = {$random}%65536;

#shake_time;

key_row_r[row] = ~key_row_r[row];

end

key_row_sel = 1;

now_col = col;

#50_000_000;

key_row_sel = 0;

key_row_r = 4'b1111;

repeat(20)begin

shake_time = {$random}%65536;

#shake_time;

key_row_r[row] = ~key_row_r[row];

end

key_row_r = 4'b1111;

#50_000_000;

end

endtask

always@(*)

if(key_row_sel)

case(now_row)

2'd0: key_row = {1'b1,1'b1,1'b1,key_col[now_col]};

2'd1: key_row = {1'b1,1'b1,key_col[now_col],1'b1};

2'd2: key_row = {1'b1,key_col[now_col],1'b1,1'b1};

2'd3: key_row = {key_col[now_col],1'b1,1'b1,1'b1};

endcase

else

key_row = key_row_r;

endmodule

//end file

task的写法

reg key_in;

reg [15:0]shake_time;

task key_press;

begin

key_in = 1'b1;

repeat(20)begin

shake_time = {$random}%65536;

#shake_time;

key_in = ~key_in;

end

key_in = 1'b0;

#50_000_000;

end

endtask

task key_release;

begin

key_in = 1'b0;

repeat(20)begin

shake_time = {$random}%65536;

#shake_time;

key_in = ~key_in;

end

key_in = 1'b1;

#50_000_000;

end

endtask

//矩阵按键仿真

//写这个是因为task的有输入的

task press_key

input [1:0]row,col;

begin

key_row_sel

end

endtask

矩阵键盘消抖 c语言,按键消抖,矩阵键盘原理和矩阵键盘的仿真模型相关推荐

  1. stm32硬件消抖_STM32单片机按键消抖和FPGA按键消抖大全

    原标题:STM32单片机按键消抖和FPGA按键消抖大全 写在前面: 按键去抖:由上图可以看出理想波形与实际波形之间是有区别的,实际波形在按下和释放的瞬间都有抖动的现象,抖动时间的长短和按键的机械特性有 ...

  2. stm32 工业按键检测_STM32单片机按键消抖和FPGA按键消抖大全

    写在前面: 物联网STM32入门 - 直播课程 - 创客学院​www.makeru.com.cn 按键去抖:由上图可以看出理想波形与实际波形之间是有区别的,实际波形在按下和释放的瞬间都有抖动的现象,抖 ...

  3. c语言 字母消消乐,C语言版消消乐.doc

    #include #include #include void put1(char a[3][3]) //出现游戏初始界面 { int i,j; for(i=1;i<=2;i++) { prin ...

  4. 矩阵的归一化函数C语言,分别使用C语言和Python实现矩阵归一化

    直接上代码: C语言: #include #include void mean(float *data,int len,float &mean,float &max,float &am ...

  5. 树莓派c语言按键开关,树莓派 GPIO按钮开关 原理与实现

    本以为GPIO接一个开关是很简单的事情,但实际上需要学会很多前置的知识才能搞得下去,所以我把整个事情的原理和实现流程全部记录下来,希望帮助到像我一样的电路小白. 硬件 树莓派 * 1(我的是1B型号) ...

  6. 你真的完全掌握了 Input 组件的键盘控制么? ——百度智能小程序 Input 组件原理剖析与键盘行为说明

    在百度智能小程序的很多开发场景中,我们都会使用到 Input 输入框组件.而在操作输入框的过程中,正确处理键盘的弹出和收起行为也是十分重要的一环.键盘行为不仅需要完美符合业务场景,同时也和用户体验息息 ...

  7. 按键消抖+点亮led灯

    文章目录 前言 一.按键消抖 二.任务描述 三.系统框图 四.模块描述 五.模块代码 六.项目仿真 七.管脚信息 八.运行效果 总结 前言   本课程是按键消抖的一个扩展内容,主要是通过实验观察按键消 ...

  8. I.MX6U-ALPHA开发板(定时器按键消抖)

    文章目录 定时器按键消抖简介 定时器按键消抖简介 当按键按下以后,进入到中断服务函数中,开始一个定时器,定时周期位10ms,只有最后一个抖动信号开启的定时器才能完成的执行完一个周期.当定时器产生周期中 ...

  9. FPGA编程按键消抖

    FPGA按键消抖 编写思路 1.按键消抖的基本原理 2.代码原理 3.代码部分 4.仿真代码编写 5.仿真 6.总结 一.按键消抖的基本原理 按键消抖,按下,松开存在毛刺,主要为了消除毛刺.通过稳定后 ...

  10. F28335矩阵键盘的3种工作方式代码及按键消抖讨论(包括利用GPIO输入量化实现按键消抖)

    文章目录 前言 1. 延时消抖 1.1 硬件电路 1.2 3种工作方式的代码 2. 利用GPIO输入量化实现按键消抖 2.1 理论分析 2.1 代码分析 前言 本文是在学习普中TMS320F28335 ...

最新文章

  1. python encoder_python JSONencoder
  2. 使用 trait 时报PHP Parse error: syntax error, unexpected 'use' (T_USE) 这个错误
  3. 记录webscraper的使用过程
  4. mysql 常用优化方案_项目中常用的 19 条 MySQL 优化方案
  5. codeforces1457 C. Bouncing Ball
  6. spring mvc学习(23):eclipse创建Maven项目没有src/main/java并不能新建的问题
  7. C#如何Json转字符串;字符串转Json;Newtonsoft.Json(Json.Net)
  8. clover 在win10下工作不正常
  9. JUNIPER SRX Ipsec ××× 点对点Policy base ×××连接测试
  10. 解决:jsp 页面不全,response 内容不完整
  11. 中国数字墨水行业市场供需与战略研究报告
  12. 完美解决doc、docx格式word转换为Html
  13. 使用pycharm编写python爬虫时出现乱码的解决方案UnicodeEncodeError: ‘gbk‘ codec can‘t encode character ‘\U0001f601‘ in
  14. lms自适应算法c语言,LMS算法(LMS自适应算法)
  15. 淘宝店铺的装修是店铺的门面,如何进行淘宝店铺装修?需要注意的点有哪些?
  16. asp.net发邮件
  17. 网易2019:矩形重叠
  18. [转]小总结一下矩阵的对角化
  19. 什么是执行计划? 怎么用?
  20. EurekaCAP原理

热门文章

  1. java中抽象类继承抽象类_邮政编码作为Java中抽象类的示例
  2. matplotlib 水平堆积图
  3. Windows路由表详解与双网卡访问慢问题解决
  4. 【学习笔记】《网络安全态势感知》第三章:网络安全数据采集与融合
  5. 浅析Java设计模式——观察者模式
  6. rtl8211 smi读取_RTL8211E应用(二)之信号输入、输出接口
  7. Unity WebGL 修改鼠标指针
  8. apache 支持apk下载安装
  9. 某度起诉“文库下载神器”,索赔300万
  10. AH8063,输入6.6V-30V,4A大电流,三节锂电池充电管理芯片iC