FPGA学习心得——矩阵键盘

用FPGA设计矩阵键盘 将P口的高四位(四个行)设置为低电平,将P口的低四位(四个列)设置为高电平。读取P口的低四位,检查哪一位从高电平变为低电平。是给某一行/某一列,高电平,其余七个全部为底电平,这时候读取电平变换,有电平变高表示按键按下,将P口的高四位(代表四个行)设置为高电平,将P口的低四位(代表四个列)设置为输入口;等待按键被按下,读取P1口的低四位,检查哪一位从低电平变为高电平。实验目的:设计一个可以读取按键按下数据的矩阵键盘。(本实验用的是逐行/逐列扫描方式)key4x4模块代码。 阅读详情

1、行列式键盘概述

为了减少键盘与单片机接口时所占用I/O口线的数目,在键数较多时,通常都将键盘排列成行列矩阵式,行列式键盘又叫矩阵式键盘。用带有I/O口的线组成行列结构,按键设置在行列的交点上。例如用2*2的行列结构可以构成4个键的键盘,4*4的行列结构可以构成有16个键的键盘。这样,当按键数量平方增长时,I/O口线只是线性增长,这样就可以节省I/O口线。

2、行列式键盘原理

教研室已有薄膜矩阵键盘,其实物图如图所示。

其电路原理图如下图所示。

按键设置在行列线交叉点,行、列线分别连接到按键开关的两端。列线通过上拉电阻接+5V的电压,即列线的输出被钳位到高电平状态。行线与按键的一个引脚相连,列线与按键的另一个引脚相连。判断键盘中有无按键按下是通过行线送入扫描信号,然后从列线读取状态得到的。其方法是依次给行线送低电平,检查列线的输入。如果列线信号全为高电平,则代表低电平信号所在的行中无按键按下;如果列线有输入为低电平,则低电平信号所在的行和出现低电平的列的交点处有按键按下。

设行扫描信号为keydrv3~keydrv0,列线按键输入信号keyin3~keyin0与按键位置的关系如下表所示。

由行列式键盘的原理可以知道,要正确地完成按键输入工作必须有按键扫描电路产生keydrv3~keydrv0信号。同时还必须有按键译码电路从keydrv3~keydrv0信号和keyin3~keyin0信号中译码出按键的键值。此外,一般还需要一个按键发生标志信号用于和其他模块接口,通知其它模块键盘上有按键动作发生,并可以从键盘模块中读取按键键值。由于各个模块需要的时钟频率是不一样的,因此时钟产生模块就是用于产生各个模块需要的时钟信号。因此得到键盘接口电路的结构如图2所示。

图2 键盘接口电路结构图

行列式键盘电路的FPGA实现主要解决三个问题,一是如何检测是否有按键按下并防止采集到干扰信号;二是在按键闭合时如何防止抖动;三是如何判断为哪一个按键位动作,并对其进行译码。因此,为了解决这些问题,程序中使用不同的进程分别实现键盘扫描信号的产生、键盘去抖以及键盘的译码。

3、源程序

----------------------------------------------------------------------------------
-- Company: 
-- Engineer: 
-- 
-- Create Date:    08:46:57 07/31/2012 
-- Design Name: 
-- Module Name:    MatrixKeyboard - Behavioral 
-- Project Name: 
-- Target Devices: 
-- Tool versions: 
-- Description: 
--
-- Dependencies: 
--
-- Revision: 
-- Revision 0.01 - File Created
-- Additional Comments: 
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity MatrixKeyboard is
    Port ( Clk 		: in  	STD_LOGIC;
			  Reset		: in		STD_LOGIC;
           KeyIn	 	: in  	STD_LOGIC_VECTOR (3 downto 0);
			  KeyScan 	: out	   STD_LOGIC_VECTOR (3 downto 0);
           LED 		: out  	STD_LOGIC_VECTOR (3 downto 0)
			  );
end MatrixKeyboard;

architecture Behavioral of MatrixKeyboard is

Signal Clk_scan	:	STD_LOGIC	:=		'0';
Signal Clk_5ms		:	STD_LOGIC	:=		'0';
Signal Clk_2ms		:	STD_LOGIC	:=		'0';
Signal Key_Scan	:  STD_LOGIC_VECTOR(3 downto 0);
Signal Key_Decode	: 	STD_LOGIC_VECTOR(7 downto 0);

Type State_Key is(st_key1,st_key2,st_key3,st_key4);
Signal Current_Key : State_Key := st_key1;

Type State_Scan is(st_scan1,st_scan2,st_scan3,st_scan4);
Signal Current_Scan : State_Scan := st_scan1;

begin

	Proc_Clk_5ms : process(Clk)
	variable cnt_clk : integer range 0 to 250000 := 0;
	begin
		if(rising_edge(Clk)) then
			if(cnt_clk < 125000) then	
				cnt_clk 	:= cnt_clk + 1;
				Clk_scan	<= '0';
			elsif(cnt_clk < 249999) then
				cnt_clk 	:= cnt_clk + 1;
				Clk_scan	<= '1';
			else
				cnt_clk 	:= 0;
			end if;
			Clk_5ms	<= Clk_scan;
		end if;
	end process Proc_Clk_5ms;
	
	Proc_Clk_2ms : process(Clk)
	variable cnt_clk : integer range 0 to 100000 := 0;
	begin
		if(rising_edge(Clk)) then
			if(cnt_clk < 50000) then	
				cnt_clk 	:= cnt_clk + 1;
				Clk_2ms	<= '0';
			elsif(cnt_clk < 99999) then
				cnt_clk 	:= cnt_clk + 1;
				Clk_2ms	<= '1';
			else
				cnt_clk 	:= 0;
			end if;
		end if;
	end process Proc_Clk_2ms;
	
	
	Proc_Scan:process(Clk_5ms)
	begin
		if(rising_edge(Clk_5ms)) then
			case Current_Scan is
				when st_scan1 =>
					Key_Scan <= "1110";
					Current_Scan <= st_scan2;
				when st_scan2 =>
					Key_Scan <= "1101";
					Current_Scan <= st_scan3;
				when st_scan3 =>
					Key_Scan <= "1011";
					Current_Scan <= st_scan4;
				when st_scan4 =>
					Key_Scan <= "0111";
					Current_Scan <= st_scan1;
			end case;
		end if;
		
	end process Proc_Scan;
	
	KeyScan <= Key_Scan;
	Key_Decode <= Key_Scan & Keyin;
	
	Proc_Keyboard:process(Clk_2ms,Reset)
	variable cnt_btn : integer range 0 to 50000 := 0;
	begin
		if(Reset = '1') then
			LED	<=	x"1";
			Current_Key	<= st_key1;
		elsif(falling_edge(Clk_2ms)) then
			case Current_Key is
				when st_key1 =>				--Check whether any keys are pressed
					if((Keyin and "1111") = "1111") then 
						Current_Key <= st_key1;
					else
						Current_Key <= st_key2;
					end if;
				when st_key2 =>				--keys debouncing
					if((Keyin and "1111") = "1111") then 
						Current_Key <= st_key1;
					else
						case Key_Decode is
							when "11101110" => LED <= "0001";
							when "11101101" => LED <= "0010";
							when "11101011" => LED <= "0011";
							when "11100111" => LED <= "1010";
							when "11011110" => LED <= "0100";
							when "11011101" => LED <= "0101";
							when "11011011" => LED <= "0110";
							when "11010111" => LED <= "1011";
							when "10111110" => LED <= "0111";
							when "10111101" => LED <= "1000";
							when "10111011" => LED <= "1001";
							when "10110111" => LED <= "1100";
							when "01111110" => LED <= "1110";
							when "01111101" => LED <= "0000";
							when "01111011" => LED <= "1111";
							when "01110111" => LED <= "1101";							                                     when others     => null;     
						end case;
					end if;
						Current_Key <= st_key3;
				when st_key3 =>			--Check whether the pressed keys are released
					if((Keyin and "1111") /= "1111") then 
						Current_Key <= st_key3;
					else
						Current_Key <= st_key4;
					end if;
				when st_key4 =>				--keys debouncing
					if((Keyin and "1111") /= "1111") then 
						Current_Key <= st_key3;
					else
						LED	<=	x"0";
						Current_Key <= st_key1;
					end if;
			end case;
		end if;
	end process Proc_Keyboard;

end Behavioral;

FPGA之矩阵键盘 一 、矩阵键盘原理 如何将自己理解的东西教给别人,这是一门学问,我很不擅长,所以希望通过写点博客,来锻炼自个的表达能力,如有错误之处,敬请谅解。 我们要写的是矩阵键盘的驱动,因此必须先了解键盘的工作原理,只有知道键盘需要什么样的信号、有哪些输入输出,你才好确定驱动该怎么写。 ... 阅读详情

相关推荐

基于FPGA的矩阵键盘检测

基于FPGA的矩阵键盘检测项目简述求解过程FPGA代码测试模块代码仿真结果总结 项目简述 这是乐鑫提前批的一道笔试题,其实不算难,但是想在半小时内完成可能性非常小,所以乐鑫的笔试还是挺难的。 题目:请实现对4x4矩阵式键盘的按键识别,假设每次都是单按键输入,需要有去抖功能(持续20ms以上被认为是有效键值),模块时钟频率为1kHz,要求用状态机实现,定义状态,画出状态转移图,并用verilog完整描述该识别模块。矩阵式键盘电路结构参见下图,其中列线1-4由识别模块控制输出,行线5-8为识别模块的输入。 本

zhangningning1996的博客 6327

C51单片机实验——矩阵按键

按键控制实验 实验名称:按键控制实验 实验环境:普中实验系统;Keil μVision 4软件; 实验目的: (1)掌握矩阵键盘和单片机的接口方法以及键值获取的原理。 (2)制作自己的按键实验方案,并通过程序设计控制实验箱上对应按键,在7段数码管上显示出设计方案的按键值。 硬件连线: 数码管连接P0口 按键连接P1口 P2口的2,3,4引脚连接位选线 实验主要代码: #include “reg52.h” //此文件中定义了单片机的一些特殊功能寄存器 typedef unsigned int u16;

Answer_G的博客 8276

FPGA学习——矩阵键盘驱动及数码管显示键值

矩阵键盘原理 在做矩阵键盘的驱动时,写了好多次都没有成功,出现了各种奇奇怪怪的错误。最后在网上看了无数篇的博客和讲解,终于搞懂了原理。 矩阵键盘的电路原理图如图所示(在网上看到别人的就随手down了下来): 矩阵键盘一共十六个按键,共接出八个引脚(四个行四个列),其中四个输入,四个输出。一般都把四个行作为输入的四条线,把四个列作为输出。 先将四条列线全部拉低,若有按键被按下,电路接通,则对应的行线也被拉低,输出低电平,其余行线为高电平。然后在依次拉低每一条列线,其余列线置高电平,来判断是哪一根列线使输出行

zsisinterested的博客 8427

基于FPGA的4x4矩阵键盘控制器verilog开发实现

这里第一部分的主要目标是设计一个键盘扫描程序,并读取4*4键盘上的键盘,并以0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F在7段数码管上显示出来。这里我们将用到开发板的键盘和数码管。本模块分为键盘扫描和数码管显示两个部分。这两个部分非常的简单,这里我们合在一起设计。

FPGA/MATLAB学习教程/源码/项目合作开发 1万+

矩阵键盘FPGA实现(含消抖)

在文章之前还是推一下公众号(FPGA之旅 ),回复“矩阵键盘”,即可获得完整代码

weixin_44678052的博客 4667

基于FPGA的 矩阵键盘按键识别 【原理+源码】

最近了解了矩阵键盘扫描的原理,动手实现了一下,在这里做一个简单的总结。

记录所学,分享知识,结识挚友 4827

基于FPGA的矩阵键盘驱动

通过FPGA驱动矩阵键盘,提供源代码及TestBench文件,比较常见的模块,便于后续使用。

详解FPGA及硬件电路开发 4185

基于FPGA与VHDL的4x4矩阵键盘设计与实现

现场可编程门阵列(FPGA)作为现代嵌入式系统设计的核心组件,因其高度的灵活性和并行处理能力,广泛应用于通信、工业控制、图像处理等领域。FPGA通过可配置的逻辑单元和互连资源,实现定制化的硬件功能,弥补了通用处理器在实时性和性能上的不足。本章将从FPGA的基本架构入手,介绍其可编程逻辑块(CLB)、输入/输出模块(IOB)和可编程互连资源(PI)的工作原理,并探讨FPGA在嵌入式系统中所扮演的角色,特别是在硬件加速、逻辑控制和接口扩展方面的优势。

weixin_42527665的博客 1186

FPGA 34 矩阵键盘 模块设计

FPGA 34 矩阵键盘 模块设计 ​ 最早的 MCU(即单片机)其 IO 口相对较少,而且用到按键过多的话, 就会占用过多的 IO。 人们为了解决这个问题就引入了“矩阵键盘”。 在矩阵键盘中,每条行线和列线在交叉处都不是直接连同, 而是通过一个按键直接相连,这样以来一个 4*4 的矩阵键盘只需要 8 根控制线就可以完成16 个按键的控制。 矩阵键盘工作原理 : ​ 检测矩阵键盘中某一按键是否被按下, 采用的方法是列扫描法。 图中一共有 8条控制线, 4 条行控制线(ROW.

lj1986817902的博客 2498

用FPGA实现16位矩阵键盘键值在数码管的显示

用FPGA实现16位矩阵键盘键值在数码管的显示,按下按键时对应的键值会显示在数码管上。包含了所需要的所有源代码。

携程景点评论数据爬取实战:破解AJAX动态加载与分页参数逆向分析

本文详细介绍了携程景点评论数据爬取的实战经验,重点破解了AJAX动态加载与分页参数逆向分析的技术难题。通过分析`getCommentCollapseList`接口,解析动态参数如`poiId`和`pageIndex`,并实现分页逻辑,帮助开发者高效获取评论数据。文章还提供了完整的Python爬虫代码和反爬策略,适用于数据分析与内容挖掘。

weixin_29098367的博客 669

FPGA矩阵键盘的驱动设计与验证

请关注微信公众号“FPGA科技室“ 本文讲解利用***verilog实现矩阵键盘的驱动设计*** ,在此之前,想必学过单片机的小伙伴应该很熟悉矩阵键盘,单片机用c语言实现了矩阵键盘驱动的设计(行扫描)…本文是基于FPGA来设计矩阵键盘驱动(4 * 4),且使用LED灯状态来表示所按下的键值。 由于最早的MCU的IO口相对很少,且如果在比较大的系统中,需要扩大人机交互,就要很多的按键,结果就是系统...

weixin_42747385的博客 2208

from pointnet2_ops import pointnet2_utils 安装过程

pointnet2_ops

goodgoodstudy___的博客 8355

4*4矩阵键盘的FPGA驱动

4*4矩阵键盘的FPGA驱动 一、硬件原理 4*4矩阵键盘有4行与4列,在按键按下时一行与一列即导通。其驱动方法非常简单。本设计中以一定的时间频率分别将每一行的引脚电平拉高,并在拉高某个引脚的同时检测每一列的电平变化,当检测到某列引脚有上升沿跳变时,即为该行与该列导通对应的那个按键被按下。 例如上图中,拉高PD4,此时检测到PD2引脚有上升沿电平跳变,则按键S5被按下。其余同理。 二、Veril...

qq_43650722的博客 4627

在Cursor IDE中集成Datadog监控:自然语言查询实战指南

在云原生和微服务架构中,可观测性(Observability)已成为保障系统稳定性的核心技术支柱。其核心原理是通过日志(Logs)、指标(Metrics)和追踪(Traces)三大支柱,实时采集并呈现系统的运行状态。这项技术的价值在于,它让开发者能够透视复杂的分布式系统,快速定位性能瓶颈与故障根因。在实际的工程实践中,开发人员常常需要在编码环境与监控平台之间频繁切换,这种上下文切换严重影响了排障效率。本文聚焦于如何利用Model Context Protocol(MCP),将强大的Datadog可观测性平台

weixin_42519772的博客 344

矩阵键盘与六位数码管_[走近FPGA]之矩阵键盘

注:由于新学期较为繁忙,本文由不愿透露姓名的 @Cardia 撰写。以下为正文。在上一篇文章中,介绍了二进制转十进制电路的实现,其文章链接如下:人生状态机:[走近FPGA]之二进制转BCD码​zhuanlan.zhihu.com本文的所有实例都使用硬木课堂Xilinx Artix 7 FPGA板进行上实现,且附有上板演示视频,该开发板的链接如下:硬木课堂 Xilinx Aritx 7 FPGA板 ...

weixin_39974557的博客 1276

《python算法与数据结构2000讲》算法与数据结构总结

《python算法与数据结构2000讲》算法与数据结构总结

IT 甄选推荐 1097

FPGA矩阵键盘驱动设计

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

qq_43534451的博客 930

【QT开发教程】Qt中的跨平台文件系统操作

文件系统操作是应用程序开发中经常需要处理的任务。Qt提供了一套跨平台的文件系统操作API,使开发者能够在不同操作系统上无缝地进行文件和目录操作。本文将介绍Qt中的跨平台文件系统操作,包括基本概念、常用类和方法以及实际示例。

科技改变人类,技术成就未来 974

2025_NIPS_Better Tokens for Better 3D: Advancing Vision-Language Modeling in 3D Medical Imaging

近年来,3D医学成像领域的视觉语言建模取得了显著进展,这得益于大规模带配对自由文本报告的计算机断层扫描(CT)语料库、更强大的架构以及高性能预训练模型。这些进展推动了自动报告生成和文本条件3D图像合成等应用的发展。然而,现有方法在处理高分辨率、长序列体积数据时仍面临挑战:对比预训练往往导致视觉编码器与临床语言错位,而基于切片的令牌化会模糊精细解剖结构,降低下游任务的诊断性能。

c_cpp_csharp的专栏 86

FPGA Verilog 矩阵键盘按下和释放时向串口发送键值

目标 按下(keydown)和抬起(keyup)矩阵键盘按键的时候,各发送一次按键的键值 硬件和原理 1. 矩阵键盘: 网上随便找的,只是键值不一样而已。 将ROW[3:0]设为输入,COL[3:0]设为输出。如果没有任何键被按下,则ROW[3:0]一直被上拉为高电平。只有当有键被按下,且COL[3:0]中有低电平输出,ROW[3:0]中才有可能有低电平输入,也可说是被动地输入。

这是一个博客 4147

FLACS-CFD 气云爆炸模拟全流程工况构建指南:从泄漏到爆炸

摘要: 本文详细介绍了使用FLACS-CFD模拟气云爆炸的全流程构建方法,重点解决泄漏模拟到爆炸模拟的气云文件传递问题。核心步骤包括: 项目规划:明确泄漏源(甲烷管道腐蚀泄漏)和爆炸场景,建立标准目录结构; 网格设计:泄漏与爆炸模拟需采用兼容的网格,爆炸域应为泄漏域的子区域且网格划分一致; 泄漏模拟配置:通过.inp文件定义几何、网格、风场、燃料及泄漏源参数,确保输出爆炸所需的气云文件(*.uni/*.fla); 关键设置:统一燃料名称、时间点匹配、路径正确性,避免版本兼容性问题。

huanghm88的专栏 747

基于FPGA的4x4矩阵键盘驱动调试

好久不见,因为博主最近两个月有点事情,加上接着考试,考完试也有点事情要处理,最近才稍微闲了一些,这才赶紧记录分享一篇博文。FPGA驱动4x4矩阵键盘。这个其实原理是十分简单,但是由于博主做的时候遇到了一些有意思的情况,所以我个人觉得值得记录分享一下。 首先找了本书看了下矩阵键盘的驱动原理,一般来说4x4矩阵键盘的原理图如下,有四根行线和四根列线,行选通和列选通可以确定...

weixin_30952103的博客 1333

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

FPGA 4X4矩阵键盘VHDL程序:FPGA开发者的利器

FPGA 4X4矩阵键盘VHDL程序:FPGA开发者的利器 【下载地址】FPGA4X4矩阵键盘VHDL程序 这是一个专为FPGA开发者设计的4X4矩阵键盘VHDL程序,基于Cyclone开发,已通过q2综合验证,可直接应用于相关硬件项目。该程序能够高效扫描并识别矩阵键盘的按键输入,确保准确响应每一个按键动作。开发者只需将...

gitblog_06797的博客 1179

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

fpga学习第二课(状态机,矩阵键盘)

在矩阵键盘中,使用的引脚既需要作为输出,又需要作为输入,所以,在之前的学习中, 我们使用过 input 和 output 接口,我们此时要新学一个 inout 接口,此接口可以同时作为输入 和输出使用,但是为了避免驱动冲突,也就是 inout 两端都在输出,所以需要将此端口编写 成三态们的接口,在不需要驱动时将其断开给外部驱动,写法如代码 2.1。尽量的去使用参数化的定义,常数不会占用资源,可以尽量的去写的完善一点,更方便在后续的一个代码调试的过程中更加的简单,然后出错的概率更加的少。

JNTeresa的博客 1521

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: FPGA学习心得——LCD1602文字滚动显示(4位传输模式、ST7066U控制芯片)
下一篇: 华为boss力荐公司高层看的一篇文章,真的很经典!!![转载]
SixthSence
博客等级 码龄14年 27粉丝 6原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值