矩阵键盘消抖 c语言,按键消抖,矩阵键盘原理和矩阵键盘的仿真模型
从物理层抽象出来状态机,以按键消抖为例
按键在未被按下时状态为高电平,按下后为低电平,按下与释放按键都会存在一段时间的抖动期,这个抖动的存在对电路的设计时极其不好的,可能会让电路处于未知状态,所以设计电路中需要用到按键的,一定要设计他的消抖电路,设计的消抖电路要能滤除抖动,并且能输出按键的状态以及按键被按下的时刻,所以设计的模块输入为按键,输出为按键状态以及按键被消除抖动后按键被按下的标志,一般情况下我们认为抖动时间不超过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语言,按键消抖,矩阵键盘原理和矩阵键盘的仿真模型相关推荐
- stm32硬件消抖_STM32单片机按键消抖和FPGA按键消抖大全
原标题:STM32单片机按键消抖和FPGA按键消抖大全 写在前面: 按键去抖:由上图可以看出理想波形与实际波形之间是有区别的,实际波形在按下和释放的瞬间都有抖动的现象,抖动时间的长短和按键的机械特性有 ...
- stm32 工业按键检测_STM32单片机按键消抖和FPGA按键消抖大全
写在前面: 物联网STM32入门 - 直播课程 - 创客学院www.makeru.com.cn 按键去抖:由上图可以看出理想波形与实际波形之间是有区别的,实际波形在按下和释放的瞬间都有抖动的现象,抖 ...
- c语言 字母消消乐,C语言版消消乐.doc
#include #include #include void put1(char a[3][3]) //出现游戏初始界面 { int i,j; for(i=1;i<=2;i++) { prin ...
- 矩阵的归一化函数C语言,分别使用C语言和Python实现矩阵归一化
直接上代码: C语言: #include #include void mean(float *data,int len,float &mean,float &max,float &am ...
- 树莓派c语言按键开关,树莓派 GPIO按钮开关 原理与实现
本以为GPIO接一个开关是很简单的事情,但实际上需要学会很多前置的知识才能搞得下去,所以我把整个事情的原理和实现流程全部记录下来,希望帮助到像我一样的电路小白. 硬件 树莓派 * 1(我的是1B型号) ...
- 你真的完全掌握了 Input 组件的键盘控制么? ——百度智能小程序 Input 组件原理剖析与键盘行为说明
在百度智能小程序的很多开发场景中,我们都会使用到 Input 输入框组件.而在操作输入框的过程中,正确处理键盘的弹出和收起行为也是十分重要的一环.键盘行为不仅需要完美符合业务场景,同时也和用户体验息息 ...
- 按键消抖+点亮led灯
文章目录 前言 一.按键消抖 二.任务描述 三.系统框图 四.模块描述 五.模块代码 六.项目仿真 七.管脚信息 八.运行效果 总结 前言 本课程是按键消抖的一个扩展内容,主要是通过实验观察按键消 ...
- I.MX6U-ALPHA开发板(定时器按键消抖)
文章目录 定时器按键消抖简介 定时器按键消抖简介 当按键按下以后,进入到中断服务函数中,开始一个定时器,定时周期位10ms,只有最后一个抖动信号开启的定时器才能完成的执行完一个周期.当定时器产生周期中 ...
- FPGA编程按键消抖
FPGA按键消抖 编写思路 1.按键消抖的基本原理 2.代码原理 3.代码部分 4.仿真代码编写 5.仿真 6.总结 一.按键消抖的基本原理 按键消抖,按下,松开存在毛刺,主要为了消除毛刺.通过稳定后 ...
- F28335矩阵键盘的3种工作方式代码及按键消抖讨论(包括利用GPIO输入量化实现按键消抖)
文章目录 前言 1. 延时消抖 1.1 硬件电路 1.2 3种工作方式的代码 2. 利用GPIO输入量化实现按键消抖 2.1 理论分析 2.1 代码分析 前言 本文是在学习普中TMS320F28335 ...
最新文章
- python encoder_python JSONencoder
- 使用 trait 时报PHP Parse error: syntax error, unexpected 'use' (T_USE) 这个错误
- 记录webscraper的使用过程
- mysql 常用优化方案_项目中常用的 19 条 MySQL 优化方案
- codeforces1457 C. Bouncing Ball
- spring mvc学习(23):eclipse创建Maven项目没有src/main/java并不能新建的问题
- C#如何Json转字符串;字符串转Json;Newtonsoft.Json(Json.Net)
- clover 在win10下工作不正常
- JUNIPER SRX Ipsec ××× 点对点Policy base ×××连接测试
- 解决:jsp 页面不全,response 内容不完整
- 中国数字墨水行业市场供需与战略研究报告
- 完美解决doc、docx格式word转换为Html
- 使用pycharm编写python爬虫时出现乱码的解决方案UnicodeEncodeError: ‘gbk‘ codec can‘t encode character ‘\U0001f601‘ in
- lms自适应算法c语言,LMS算法(LMS自适应算法)
- 淘宝店铺的装修是店铺的门面,如何进行淘宝店铺装修?需要注意的点有哪些?
- asp.net发邮件
- 网易2019:矩形重叠
- [转]小总结一下矩阵的对角化
- 什么是执行计划? 怎么用?
- EurekaCAP原理
热门文章
- java中抽象类继承抽象类_邮政编码作为Java中抽象类的示例
- matplotlib 水平堆积图
- Windows路由表详解与双网卡访问慢问题解决
- 【学习笔记】《网络安全态势感知》第三章:网络安全数据采集与融合
- 浅析Java设计模式——观察者模式
- rtl8211 smi读取_RTL8211E应用(二)之信号输入、输出接口
- Unity WebGL 修改鼠标指针
- apache 支持apk下载安装
- 某度起诉“文库下载神器”,索赔300万
- AH8063,输入6.6V-30V,4A大电流,三节锂电池充电管理芯片iC