☰
计数器驱动12键阵列扫描与点阵显示硬件设计
2026/10/28 14:24:20 网站建设 项目流程

简介:这份文档面向数字电子技术与FPGA课程设计的学习者,围绕“按键阵列扫描及点阵显示器控制电路设计”展开,重点解决12键阵列识别、按键消抖、键码保持与8×8点阵字符显示等问题,也可用于Quartus II环境下的实验复现与方案参考。压缩包内仅含1个doc文件,约253KB,正文以设计说明文档形式组织,便于按章节查阅设计指标、系统概述、单元电路与实现思路。文档结合LP-2900开发装置,讲解RK1~RK3行线读取、74138列线扫描、RS触发器消抖,以及计数器、状态机、ROM译码和点阵动态扫描的配合方式。目前已有551人学习,适合需要理解按键扫描与点阵显示控制逻辑、完成课程设计或实验报告撰写的读者参考。

1. 多按一个键为什么不算数:12 键阵列的“先到先得”不是软件判的

按键阵列扫描和点阵显示放在同一块数字电路里做,最反直觉的地方是多键竞争的处理。12 个按键同时闭合,电路只认最先被扫描到的那个,后按的键干脆不认。这个行为不是靠优先级编码器算出来的,也不是软件轮询判断的——它来自一个更朴素的副作用:计数器被掐停了。整个设计用一颗 4 位二进制计数器同时当“扫描指针”和“显示地址发生器”,按键命中时让计数器停住,指针不动,自然不会再去看别的键。这套思路是数字电子里用计数器加查找表替代控制逻辑的经典套路,搞懂这个“一停全停”的耦合,后面所有接线细节就都有了归属。

2. 按键扫描:12 个键怎么压进 7 根线,又怎么被 4 位计数器逐个点名

2.1 行列矩阵:上拉电阻把“没人按”编码成高电平

按键是机械开关,闭合导通、断开悬空。悬空的线电平不确定,所以每条行线都通过一个电阻上拉到 +5V。当某行上的所有按键都断开时,行线一定是高电平;当某条列线被拉低、且该列某行的键闭合时,那条行线被拉到低电平。行线电平因此变成一个可靠的二值信号:高代表这一行没有键闭合,低代表有。

3 行 4 列共 12 个键,如果每个键独立引出,需要 12 根信号线加公共地;做成矩阵后只需要 3 根行线加 4 根列线,7 根线搞定。省下来的端口在 FPGA 上就是实打实的引脚预算。读行用三个输入端口(X0~X2),扫列用 3-8 线译码器 74138 的输出 Y0~Y3,译码输入由三位控制信号给出。74138 是低电平有效输出,同一时刻只有一条列线为低。

这里有个器件复用的细节:4 条列线其实用 2-4 译码器就够,用 74138 是因为手头只有这一种译码器,多出来的 Y4~Y7 悬空不用。老设计的很多“奇怪”之处都来自库存约束,而不是理论最优。

注意:行线上拉电阻的阻值和列线驱动能力要匹配。上拉太弱,行线被列线拉低时下降沿变慢;上拉太强,按键闭合时的灌电流会超过译码器输出能力。常见取值在 4.7kΩ~10kΩ 之间。

2.2 消抖:RS 触发器为什么能吃掉触点弹跳

机械触点在闭合瞬间会弹跳几毫秒,产生一串高低脉冲。如果不处理,扫描指针可能被第一个毛刺骗停,锁存到一个错误的键码,显示出来的字符跟实际按键对不上。这是按键电路最典型的翻车点。

基本 RS 触发器由两个交叉耦合的与非门构成,只有一个稳定输出的双稳态。触点第一次接触就把状态翻过去,后续弹跳因为反馈回路已经锁定,不再改变输出。这是器件级的硬消抖,响应快、不占时钟、不需要软件参与。另一种思路是时间滤波:连续 N 次扫描都读到同一个键才认,代价是响应变慢。两种可以叠加——RS 触发器管触点毛刺,扫描周期管传输干扰。

2.3 扫描周期的账:为什么每键 10ms、整阵列 120ms

逐列拉低,同时读三行,就能定位唯一的闭合键。计数器每跳一步,换一列。所以单个按键的“被看见”时间等于计数器时钟周期,也就是列低电平持续时间;整个阵列扫一遍的时间等于单键时间乘以键数。

一个具体的账:16 键阵列,每键 10ms,扫完一轮 160ms;人的按键闭合时间通常 0.1s 到 1s 出头,所以闭合时间必须大于扫描周期,否则可能刚好错过。12 键阵列同理,每键 10ms 时一轮 120ms。这个数字要和人的动作时间对齐——按得太快(短于 120ms)的键有概率漏掉。

实际设计里通常把单键扫描时间压到 1ms 量级,一轮十几毫秒,远小于人的最短按键动作,漏键概率趋近于零。这里就出现了第一个设计约束:扫描时钟不能随便选,它同时被“人的动作速度”和“显示刷新率”两头夹着。

2.4 扫描链:74161 出码,74138 选列,74153 选行

扫描的核心是一颗 4 位二进制计数器 74161,输出 Q3~Q0。这 16 个状态里实际用到 12 个。分工是这样的:低两位 Q1、Q0 进 74138 的译码输入,译出四条列线 Y0~Y3,决定当前扫哪一列;高两位 Q3、Q2 进 74153 的选择端,从 X0~X2 里选一条行线读回。

74153 是双 4 选 1 数据选择器,这里只用一片的一半。D0~D2 接 X0~X2,第四路输入必须接高电平——因为只有三行,第四路没有物理按键,如果悬空,选到这一路时输出随机,可能被误判成有键按下。这个细节在原理图上极不起眼,却能让系统在没人操作时自动跳字符。

计数器每跳一步,列和行同时换:Q3Q2Q1Q0 为 0000 时扫第 0 列第 0 行,0001 时扫第 0 列第 1 行。位序怎么分配,直接决定键码到物理按键的映射关系,还决定了后面 ROM 的寻址方案和容量,第 4 章会看到这个耦合有多深。

当 74153 选中的那条行线为低,说明“当前列加当前行”交叉点上的键闭合了。这个低电平就是命中信号,也是整个交互逻辑的触发源。

2.5 冻结:ENP 和 ENT 同时拉低,74161 为什么就停住了

命中信号接到 74161 的 ENP 和 ENT 两个使能端。74161 的计数条件是 ENP=ENT=1,任意一个为 0 就保持当前值。所以命中瞬间,计数器原地冻结,Q3~Q0 不再变化。

同时,这个键码要存下来给显示用。74377 八位锁存器的锁存端是下降沿有效,而命中信号是低电平有效,中间要加一个反相器:命中时反相器输出由高变低,产生下降沿,锁存器把当时的 Q3~Q0 吃进去。极性接反的话,锁存的是释放瞬间的键码,显示会滞后一个键。

冻结之后会发生什么?只要手指还按着,行线一直是低,计数器一直停,显示一直读这个键码。手指松开,行线回高,ENP/ENT 恢复,计数器继续往下扫。所以“保持显示直到新按键作用”这句话的物理实现是:旧键松开之前,新键根本没机会被扫到。这就是“只响应最先作用的按键”的全部机制——没有优先级判断,没有排队,谁先被扫描指针撞上谁赢,后面的键连参赛资格都没有。

// 与原理图等价的扫描/锁定描述 // clk_scan: 分频后的扫描时钟,周期 = 单键扫描时间 reg [3:0] key_cnt; wire [1:0] col_sel = key_cnt[1:0]; // 低两位 -> 74138 列译码 wire [1:0] row_sel = key_cnt[3:2]; // 高两位 -> 74153 行选择 wire key_hit = ~row_line[row_sel]; // 选中行被拉低 = 该键闭合 always @(posedge clk_scan or negedge rst_n) begin if (!rst_n) key_cnt <= 4'd0; else if (!key_hit) key_cnt <= key_cnt + 4'd1; // 命中则保持 end // 74377 锁存:命中信号的下降沿锁存键码 always @(negedge key_hit or negedge rst_n) begin if (!rst_n) key_code <= 4'd0; else key_code <= key_cnt; end

这段描述里,key_hit是组合信号,直接当异步使能用,依赖 74161 使能端的建立时间。如果扫描时钟频率高、行线分布电容大,key_hit可能在时钟沿附近抖动,导致多计一拍。稳妥做法是把它打一拍再当同步使能。参数上,clk_scan的周期就是单键扫描时间,改动它等于同时改动漏键概率和后面显示扫描的基准,牵一发动全身。

3. 点阵显示:64 个 LED 怎么被 3 位计数器“同时”点亮

3.1 一行就是一个 8 段共阳数码管

8×8 点阵共 64 个 LED。行线 ROW1~ROW8 接每行 LED 的阳极,

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询