史上最详细矩阵键盘原理
4X4矩阵按键原理和代码解析(老伙计)

4X4 矩阵按键原理和代码解析目录1 键盘概述 (1)2 矩阵按键工作原理 (2)3、4X4 矩阵按键代码解析 (2)1 键盘概述键盘分编码键盘和非编码键盘。
键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘。
而靠软件编程来识别的称为非编码键盘。
在一般嵌入式应用中,用的最多的是非编码键盘,也有用到编码键盘的。
非编码键盘又分为独立键盘和行列式(又称为矩阵式)键盘。
所谓独立式键盘,即嵌入式CPU (或称MCU)的一个GPIO 口对应一个按键输入,这个输入值的高低状态就是键值。
矩阵键盘用于采集键值的GPIO 是复用的,一般分为行和列采集,例如4*4 矩阵键盘就只需要行列各4 个按键就可以了,矩阵键盘的控制较独立键盘要复杂得多,本实验未涉及,所以对其原理不做详细介绍。
独立按键一般有2 组管脚,虽然市面上我们常常看到有4个管脚的按键,但它们一般是两两导通的,这2 组管脚在按键未被按下时是断开的,在按键被按下时则是导通的。
基于此原理,我们一般会把按键的一个管脚接地,另一个管脚上拉到VCC,并且也连接到GPIO。
这样,在按键未被按下时,GPIO 的连接状态为上拉到VCC,则键值为1;按键被按下时,GPIO虽然还是上拉到VCC,但同时被导通的另一个管脚拉到地了,所以它的键值实际上是0。
我们的开发板上有一组4*4 矩阵键盘。
通过P12 的PIN1-2 短接时,其实S1/S2/S3/S4 可以作为独立按键使用,它的一端接地,另一端在上拉的同时连接到FPGA 的I/O 口。
当I/O 口的电平为高(1)时,说明按键没有被按下,当I/O口的电平为低(0)时,说明按键被按下了。
我们不再只局限于独立按键这么low 的应用了,这里我们将要把所有16 个按键都使用起来,实现我们真正的矩阵按键功能。
要做矩阵按键,那么大家首先要确认把自己的SF-CY4 开发板上插座P12 的PIN2-3用跳线帽短接。
矩阵键盘原理

矩阵键盘原理
矩阵键盘原理是近些年应用较为广泛的一种键盘技术,它具有非常优异的输入
性能,能够极大地提高输入速度,提高用户操作体验。
矩阵键盘原理指的是将若干个键位连接成一个矩形键盘,每个矩形键盘由水平行和垂直列构成。
水平行是由电路连接的水平键,而垂直列是按键的竖立部分,其中每行都连有一个独立的电阻,在按下键位时,电路会改变阻值,并通过调制解调器发出固定的频率,以此方式模拟电子设备所必须的唯一代码/电子信号。
矩阵键盘原理的优点在于它所采用的封装方式,这样可以大大减少键盘的体积,同时不需要再次拨动线缆,也可以指定键盘的安装位置,使用成本相对较低,完全可以满足用户的要求。
同时,它的可靠性也比传统的按键键盘原理更加高效,由于它可以快速响应,可以为用户提供更加及时的用户体验。
矩阵键盘原理在现在的键盘系统中得到了广泛的应用,可以用于构建多功能的
软件应用,提供快速、舒适的输入体验,这种技术在日常生活中也有多种应用,比如智能手机、家用电脑、娱乐设备等,都是利用本技术搭建起来的。
总的来说,矩阵键盘原理可以精细化地减少键盘上键位数,节约拆装空间,可
靠性更高,而且可以提供舒适的输入体验,同时可以在家用电脑、智能手机、娱乐设备等广泛应用。
第十七讲、矩阵式键盘

第十七讲、矩阵式键盘
1.键盘的分类: 独立式键盘;占用单片机资源多。 电阻式键盘(需AD转换配合); 矩阵式键盘;占用单片机资源少。 2.矩阵式键盘的工作原理:
• 1.判断有无键按下: 列线
• 1)当某键按下时,对应的 行线和列线就连通;同一时 p20 间只能按一个键。
• 2)键盘扫描:
• P24-P27在没有任何键按 下时均保持1;P20-P23依 次出现0循环扫描。
p27
• 3)判断有无键按下:
• 当P24-P27任何一个为0是 说明有键被按下。
• 2.识别是哪一个简短延时)。
• 判断按键号:
读取P2口的值,不同按键按下时P2口会有不同的 二进制值。
小结: 矩阵式键盘的3个关键点:
1.键盘扫描;
2.看P2口的高4位是否是全1,从而得知是否有键 按下;
3.如果有键按下,就读P2口的值,不同键按下P2 口有不同的二进制代码。
二、矩阵式键盘的程序设计:
例 :1.分别按键盘上的16个键,按不同键时数码管 上显示对应的键号(1-16)。
• 2.用1602液晶作为显示,利用矩阵式键盘 编写一个电话机拨号程序。键盘上的前10 个键作为0-9数字键,最后一个键最为撤销 前一位键,倒数第二个键作为全部重新拨 号键(即按此键后所有拨号清空。)
矩阵键盘

FPGA学习心得——矩阵键盘1、行列式键盘概述为了减少键盘与单片机接口时所占用I/O口线的数目,在键数较多时,通常都将键盘排列成行列矩阵式,行列式键盘又叫矩阵式键盘。
用带有I/O口的线组成行列结构,按键设置在行列的交点上。
例如用2*2的行列结构可以构成4个键的键盘,4*4的行列结构可以构成有16个键的键盘。
这样,当按键数量平方增长时,I/O口线只是线性增长,这样就可以节省I/O口线。
2、行列式键盘原理教研室已有薄膜矩阵键盘,其实物图如图所示。
其电路原理图如下图所示。
由行列式键盘的原理可以知道,要正确地完成按键输入工作必须有按键扫描电路产生keydrv3~keydrv0信号。
同时还必须有按键译码电路从keydrv3~keydrv0信号和keyin3~keyin0信号中译码出按键的键值。
此外,一般还需要一个按键发生标志信号用于和其他模块接口,通知其它模块键盘上有按键动作发生,并可以从键盘模块中读取按键键值。
由于各个模块需要的时钟频率是不一样的,因此时钟产生模块就是用于产生各个模块需要的时钟信号。
因此得到键盘接口电路的结构如图2所示。
图2 键盘接口电路结构图行列式键盘电路的FPGA实现主要解决三个问题,一是如何检测是否有按键按下并防止采集到干扰信号;二是在按键闭合时如何防止抖动;三是如何判断为哪一个按键位动作,并对其进行译码。
因此,为了解决这些问题,程序中使用不同的进程分别实现键盘扫描信号的产生、键盘去抖以及键盘的译码。
3、源程序[plain]view plaincopy1.----------------------------------------------------------------------------------2.-- Company:3.-- Engineer:4.--5.-- Create Date: 08:46:57 07/31/20126.-- Design Name:7.-- Module Name: MatrixKeyboard - Behavioral8.-- Project Name:9.-- Target Devices:10.-- Tool versions:11.-- Description:12.--13.-- Dependencies:14.--15.-- Revision:16.-- Revision 0.01 - File Created17.-- Additional Comments:18.--19.----------------------------------------------------------------------------------20.library IEEE;e IEEE.STD_LOGIC_1164.ALL;e IEEE.STD_LOGIC_ARITH.ALL;e IEEE.STD_LOGIC_UNSIGNED.ALL;24.25.---- Uncomment the following library declaration if instantiating26.---- any Xilinx primitives in this code.27.--library UNISIM;28.--use UNISIM.VComponents.all;29.30.entity MatrixKeyboard is31. Port ( Clk : in STD_LOGIC;32. Reset : in STD_LOGIC;33. KeyIn : in STD_LOGIC_VECTOR (3 downto 0);34. KeyScan : out STD_LOGIC_VECTOR (3 downto 0);35. LED : out STD_LOGIC_VECTOR (3 downto 0)36. );37.end MatrixKeyboard;38.39.architecture Behavioral of MatrixKeyboard is40.41.Signal Clk_scan : STD_LOGIC := '0';42.Signal Clk_5ms : STD_LOGIC := '0';43.Signal Clk_2ms : STD_LOGIC := '0';44.Signal Key_Scan : STD_LOGIC_VECTOR(3 downto 0);45.Signal Key_Decode : STD_LOGIC_VECTOR(7 downto 0);46.47.Type State_Key is(st_key1,st_key2,st_key3,st_key4);48.Signal Current_Key : State_Key := st_key1;49.50.Type State_Scan is(st_scan1,st_scan2,st_scan3,st_scan4);51.Signal Current_Scan : State_Scan := st_scan1;52.53.begin54.55. Proc_Clk_5ms : process(Clk)56. variable cnt_clk : integer range 0 to 250000 := 0;57. begin58. if(rising_edge(Clk)) then59. if(cnt_clk < 125000) then60. cnt_clk := cnt_clk + 1;61. Clk_scan <= '0';62. elsif(cnt_clk < 249999) then63. cnt_clk := cnt_clk + 1;64. Clk_scan <= '1';65. else66. cnt_clk := 0;67. end if;68. Clk_5ms <= Clk_scan;69. end if;70. end process Proc_Clk_5ms;71.72. Proc_Clk_2ms : process(Clk)73. variable cnt_clk : integer range 0 to 100000 := 0;74. begin75. if(rising_edge(Clk)) then76. if(cnt_clk < 50000) then77. cnt_clk := cnt_clk + 1;78. Clk_2ms <= '0';79. elsif(cnt_clk < 99999) then80. cnt_clk := cnt_clk + 1;81. Clk_2ms <= '1';82. else83. cnt_clk := 0;84. end if;85. end if;86. end process Proc_Clk_2ms;87.88.89. Proc_Scan:process(Clk_5ms)90. begin91. if(rising_edge(Clk_5ms)) then92. case Current_Scan is93. when st_scan1 =>94. Key_Scan <= "1110";95. Current_Scan <= st_scan2;96. when st_scan2 =>97. Key_Scan <= "1101";98. Current_Scan <= st_scan3;99. when st_scan3 =>100. Key_Scan <= "1011";101. Current_Scan <= st_scan4;102. when st_scan4 =>103. Key_Scan <= "0111";104. Current_Scan <= st_scan1;105. end case;106. end if;107.108. end process Proc_Scan;109.110. KeyScan <= Key_Scan;111. Key_Decode <= Key_Scan & Keyin;112.113. Proc_Keyboard:process(Clk_2ms,Reset)114. variable cnt_btn : integer range 0 to 50000 := 0;115. begin116. if(Reset = '1') then117. LED <= x"1";118. Current_Key <= st_key1;119. elsif(falling_edge(Clk_2ms)) then120. case Current_Key is121. when st_key1 => --Check whether any keys are p ressed122. if((Keyin and "1111") = "1111") then123. Current_Key <= st_key1;124. else125. Current_Key <= st_key2;126. end if;127. when st_key2 => --keys debouncing128. if((Keyin and "1111") = "1111") then129. Current_Key <= st_key1;130. else131. case Key_Decode is132. when "11101110" => LED <= "0001";133. when "11101101" => LED <= "0010";134. when "11101011" => LED <= "0011";135. when "11100111" => LED <= "1010";136. when "11011110" => LED <= "0100";137. when "11011101" => LED <= "0101";138. when "11011011" => LED <= "0110";139. when "11010111" => LED <= "1011";140. when "10111110" => LED <= "0111";141. when "10111101" => LED <= "1000";142. when "10111011" => LED <= "1001";143. when "10110111" => LED <= "1100";144. when "01111110" => LED <= "1110";145. when "01111101" => LED <= "0000";146. when "01111011" => LED <= "1111";147. when "01110111" => LED <= "1101";when others => null;148. end case;149. end if;150. Current_Key <= st_key3;151. when st_key3 => --Check whether the pressed keys a re released152. if((Keyin and "1111") /= "1111") then153. Current_Key <= st_key3;154. else155. Current_Key <= st_key4;156. end if;157. when st_key4 => --keys debouncing158. if((Keyin and "1111") /= "1111") then159. Current_Key <= st_key3;160. else161. LED <= x"0";162. Current_Key <= st_key1;163. end if;164. end case;165. end if;166. end process Proc_Keyboard;167.168.end Behavioral;169.薄膜键盘矩阵键盘4x4 ,单片机开发配件,机械手按键。
单片机矩阵键盘

汇报人: 202X-01-04
contents
目录
• 单片机矩阵键盘概述 • 单片机矩阵键盘硬件设计 • 单片机矩阵键盘软件编程 • 单片机矩阵键盘调试与测试 • 单片机矩阵键盘优化与扩展
01 单片机矩阵键盘 概述
定义与特点
定义
单片机矩阵键盘是一种由行线和 列线组成的键盘,通过按键的行 和列交叉点来识别按键。
用于显示输入的信息或状态, 如数码管、液晶显示屏等。
电源模块
为整个系统提供稳定的电源, 保证系统的正常工作。
电路连接
01
矩阵键盘的行线和列线分别连接到单片机的输入/输出端口,通 过软件扫描方式检测按键状态。
02
单片机控制模块与显示模块连接,将需要显示的信息传输给显
示模块。
电源模块为整个系统提供稳定的电源,保证系统的正常工作。
在通讯设备领域,单片机矩阵键盘可以用 于手机、电话等设备的操作面板,实现拨 号、挂断等功能。
பைடு நூலகம்
02 单片机矩阵键盘 硬件设计
硬件组成
01
02
03
04
矩阵键盘模块
由行线和列线组成的键盘矩阵 ,按键被安排在行线和列线的
交叉点上。
单片机控制模块
用于接收和处理来自矩阵键盘 的信号,控制整个系统的运行
。
显示模块
软件编程
编写单片机程序,用于扫描矩阵键盘并识 别按键按下事件。
测试方法
按键响应时间测试
测试从按键按下到单片机响应 的时间,确保在合理范围内。
按键防抖测试
测试按键防抖功能是否正常, 即在按键按下和释放时是否能 够正确识别。
多键同时按下测试
测试在多个按键同时按下时, 单片机是否能够正确识别并处 理。
矩阵式键盘工作原理

矩阵式键盘工作原理1.按键的分类按键按照构造原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。
前者造价低,后者寿命长。
目前,微机系统中最常见的是触点式开关按键。
按键按照接口原理可分为编码键盘与非编码键盘两类,这两类键盘的主要区别是识别键符及给出相应键码的方法。
编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现键盘的定义与识别。
全编码键盘能够由硬件逻辑自动提供与键对应的编码,此外,一般还具有去抖动和多键、窜键保护电路。
这种键盘使用方便,但需要较多的硬件,价格较贵,一般的单片机应用系统较少采用。
非编码键盘只简单地提供行和列的矩阵,其它工作均由软件完成。
由于其经济实用,较多地应用于单片机系统中。
下面将重点介绍非编码键盘接口。
2.键输入原理在单片机应用系统中,除了复位按键有专门的复位电路及专一的复位功能外,其它按键都是以开关状态来设置控制功能或输入数据的。
当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能,键信息输入是与软件构造密切相关的过程。
对于一组键或一个键盘,总有一个接口电路与CPU 相连。
CPU 可以采用查询或中断方式了解有无将键输入,并检查是哪一个键按下,将该键号送入累加器ACC ,然后通过跳转指令转入执行该键的功能程序,执行完后再返回主程序。
3.按键构造与特点微机键盘通常使用机械触点式按键开关,其主要功能是把机械上的通断转换成为电气上的逻辑关系。
也就是说,它能提供标准的TTL 逻辑电平,以便与通用数字系统的逻辑电平相容。
机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。
其抖动过程如图7.2 所示,抖动时间的长短与开关的机械特性有关,一般为5 ~ 10 ms 。
按键触点的机械抖动在触点抖动期间检测按键的通与断状态,可能导致判断出错,即按键一次按下或释放被错误地认为是多次操作,这种情况是不允许出现的。
矩阵键盘学习资料(重新整理)
矩阵键盘嵌入式移动设备的应用越来越广,以其体积小、重量轻、便于携带等特点而备受青睐。
键盘是一种最为普遍使用的输入工具,但嵌入式移动设备因其体积小的特点决定了它的键盘不大可能采用普通PC机上的标准键盘,因而大多数采用键数相对较少的矩阵键盘。
利用矩阵键盘用户可以很方便的实现对嵌入式移动设备进行相应的操作,是极方便的人机交互设备。
随着微软的嵌入式操作系统Windows CE的普及,Windows CE的矩阵键盘开发得到了越来越多开发者的重视,本文与大家分享我在开发矩阵键盘的一些总结。
1.Windows CE驱动分类Windows CE提供了许多用于开发设备驱动的模型,这些驱动程序模型使得Windows CE 能适应大部分的内部和外围设备。
因此,在深入探讨Windows CE矩阵键盘驱动程序之前,先了解在WinCE平台上使用的两种设备:内建设备和可安装设备。
因此,从驱动加载方式来看WinCE可分为本机设备驱动(Built-In Driver)、可加载驱动(Loadable Driver)。
本机设备驱动即Native Device Drivers,WinCE设计成可直接使用内建设备,这些设备由本机驱动过程控制。
本机驱动程序是与WinCE的核心组件紧密相连,这些驱动对应的设备通常在系统启动时,在GWES的进程空间内被加载,因此它们不是以独立的DLL形式存在。
可加载设备是指可与平台连接和分离的第三方接口设备,可由用户随时安装和卸载这些驱动,可以在系统启动时或者和启动后的任何时候由设备管理器动态加载。
通常这类驱动是以DLL动态链接库的形式存在,系统加载后这些驱动程序是以用户态的角色运行,这种外围设备的驱动也被称为流驱动。
两者的差别在于它们提供的编程接口不同:本地设备驱动可以根据具体设备的需求提供本机的相应接口;而流接口驱动则是提供一组通用接口即流接口函数,应用程序可以通过流接口提供的接口函数来访问外围设备。
2.嵌入式矩阵键盘驱动原理嵌入式设备上的键盘受设备本身体积影响,键盘设计大多数采用矩阵形式。
矩阵键盘程序设计
矩阵键盘程序设计1.引言矩阵键盘是一种常见的输入设备,常用于电子设备、计算机和通信设备等系统中。
它具有结构简单、体积小、成本低廉等特点,因此在各种嵌入式系统中被广泛应用。
本文将介绍矩阵键盘的程序设计方法,包括按键扫描、数据解析以及与其他模块的交互等内容。
2.基本原理矩阵键盘由若干行和列的按键组成,每个按键连接到一个特定的电路。
当按键被按下时,会导通相应的行和列,形成一个矩阵。
通过逐次扫描每一行和列,可以检测到按键的按下情况。
矩阵键盘的基本原理是利用行列扫描来判断按键的输入状态。
3.按键扫描3.1 行扫描行扫描是矩阵键盘程序设计的重要步骤之一。
首先,将行的控制线置为高电平,并将列的控制线置为输入状态。
然后,逐个扫描每一行,检测列的输入状态。
如果某个列的输入状态发生变化,说明对应的按键被按下或释放。
3.2 列扫描列扫描是行扫描的补充,用来检测行的输入状态。
首先,将列的控制线置为高电平,并将行的控制线置为输入状态。
然后,逐个扫描每一列,检测行的输入状态。
如果某个行的输入状态发生变化,说明对应的按键被按下或释放。
4.数据解析在按键扫描的基础上,还需要进行数据解析以获取具体的按键值。
具体的解析方法可以根据矩阵键盘的布局和按键的位置进行设计。
一般来说,可以借助查找表或者简单的算法来实现。
5.与其他模块的交互矩阵键盘通常需要与其他模块进行交互,以实现特定的功能。
例如,可以通过串口与MCU或者计算机进行数据交互,实现键盘输入的数据传输。
同时,还可以通过中断或者定时器来实现按键的实时响应。
6.附件本文档涉及的附件包括示例代码、电路图、原理图等。
详细的附件内容请参考附件部分。
附件1: 示例代码附件2: 电路图附件3: 原理图7.法律名词及注释7.1 版权:指作品的作者或合法权利人对其创作的作品享有的专有权利,包括复制、发行、表演、展示等权利。
7.2 专利:指对于新的技术、新的产品或者新的设计提出的独占权,目的是保护创新者的权益。
矩阵键盘程序设计
矩阵键盘程序设计矩阵键盘程序设计引言矩阵键盘的工作原理矩阵键盘由多行和多列组成,每个按键位于特定的行和列交叉点上。
在未按下任何按键时,所有的行和列都处于高电平状态。
当按下某个按键时,该按键所在的行和列会产生短接,从而导致相应的行和列变为低电平。
为了检测按键的输入,矩阵键盘通常采用矩阵扫描的方式。
具体来说,它通过依次将一行置为低电平,然后读取相应的列的状态来判断是否有按键按下。
为了提高检测的精度,还可以采用定时器中断的方式来不断扫描键盘状态。
矩阵键盘程序设计示例下面是一个简单的矩阵键盘程序设计示例,使用Arduino开发板和Keypad库来实现。
在该示例中,我们假设矩阵键盘由3行4列组成,使用数字1-9和星号()作为按键。
cppinclude <Keypad.h>const byte ROWS = 3; // 定义行数const byte COLS = 4; // 定义列数char keys[ROWS][COLS] = {{'1','2','3','A'},{'4','5','6','B'},{'7','8','9','C'}};byte rowPins[ROWS] = {9, 8, 7}; // 设置行引脚byte colPins[COLS] = {6, 5, 4, 3}; // 设置列引脚Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);void setup() {Serial.begin(9600); // 初始化串口通信}void loop() {char key = keypad.getKey(); // 读取按键if (key != NO_KEY) { // 判断是否有按键按下Serial.println(key); // 打印按下的按键到串口}delay(100); // 延时等待}在上述示例中,我们定义了矩阵键盘的行数和列数,并指定了每个按键的字符表示。
4x4矩阵键盘扫描原理
4x4矩阵键盘扫描原理
4x4矩阵键盘扫描原理是一种常用的键盘扫描方法,也称为矩阵键盘扫描。
它可以将多个按键连接在一起并使用较少的引脚来检测按键的状态。
4x4矩阵键盘由4行和4列组成,共有16个按键。
通常使用单片机或电路来进行扫描,以下是简要的原理:
1. 行扫描:首先,将行引脚设置为输出,同时将列引脚设置为输入,并将其上拉或下拉。
所有行引脚中只有一个为低电平,其余为高电平。
然后逐行检测按键状态。
2. 列检测:对于每一行,将对应的行引脚置为低电平后,检测列引脚的电平状态。
如果有按键按下,则相应的列引脚会变为低电平。
通过读取列引脚的状态,可以确定按键的位置。
3. 组合键:由于只能一次检测一行,因此当同时按下多个按键时,可能会导致误检。
为了解决这个问题,可以在检测到按键按下时,延迟一段时间,并再次检测按键的状态。
如果在第二次检测时仍然检测到按键按下,则确认按键有效。
4. 反向扫描:为了检测按键的释放状态,可以将行引脚设置为输入,列引脚设置为输出,并将其置为低电平。
然后逐列检测行引脚的电平状态,如果有按键释放,则相应的行引脚会变为高电平。
通过不断地循环扫描所有的行和列,可以实时检测按键的状态,并根据需要进行相应的处理。