☰
基于74系列的12键阵列扫描与8×8点阵显示控制电路
2026/10/28 21:49:48 网站建设 项目流程

简介:面向数字电子技术与FPGA课程设计场景的按键阵列扫描及点阵显示器控制电路设计文档,聚焦12键3行4列阵列识别与8行8列LED点阵字符显示的完整实现思路。压缩包共1个doc文件,约253KB,内容从设计指标、LP-2900硬件环境讲到按键消抖、列线扫描、74138译码、动态扫描显示及ROM键符译码,并给出计数器、状态机与单元电路的组织方式。已有551人学习浏览,适合需要完成Quartus II课程设计、实验报告或查漏补缺的中高年级学生与自学者参考。文档将扫描周期、键码保存、显示码存储和行列驱动等关键点串成一条设计链,便于读者理解原理并迁移到类似人机交互电路。

1. 12 个按键只占 7 根引脚:按键阵列扫描与点阵显示控制电路先要回答的三个问题

12 个按键如果各自独占一根 FPGA 引脚、各自配一套消抖电路,付出的是 12 根线和 12 份抖动风险;改成 3 行 4 列的按键阵列扫描,引脚降到 7 根,代价是必须在一个扫描周期内把每个键都过一遍,漏掉一轮就等于漏掉一次按键。点阵显示器控制电路面对的是同一类取舍:64 个发光二极管不可能一人一根线,只能拆成 8 行 8 列做动态扫描,靠刷新率骗过眼睛。这两块凑在一起的数字电子设计,难点从来不在原理图好不好看,而在时序账算没算清——扫描周期比按键闭合时间长就丢键,行刷新率不够就闪,ROM 地址位序接反就整屏乱码。这套方案要交付的,就是把这笔时序账和地址账算到能上板跑通、能拿测试向量验证的程度。

2. 需求拆解与器件选型:12 键阵列、8×8 点阵与 74 系列的门数账

先把题目里的四条指标摊开看:识别 12 个按键、按下后显示对应符号、显示保持到下一次按键、多键同按只响应最先作用的那个。这四条里前两条是功能,后两条是时序约束,而时序约束才是真正决定电路结构的东西。很多方案卡住不是因为译码器接错,而是从一开始就没把"保持"和"最先"翻译成电路语言,结果做出来能显示,但一松手字符就没了,或者两个键一起按就出随机字符。

2.1 把设计指标翻译成可测的电气约束

设计指标这种写法在课设任务书里很常见,但它不能直接画电路,得先转成能测量的量。我的习惯是做一张对照表,左边写任务书原话,中间写它在电路里对应哪个信号、哪个时间参数,右边写验证时用什么手段去测。这张表一旦成型,后面的器件选型和调试顺序基本就定了,不会出现"电路画完了却不知道怎么算合格"的局面。

设计指标电路层面的约束量化取值验证手段
识别 12 个按键3 行 × 4 列阵列,行线上拉,列线分时拉低行线 X0~X2 未按时为高,列线 Y0~Y3 低有效逐键按下,看锁存器输出键码是否唯一
按下显示对应符号键码作为 ROM 高 4 位地址,行号作低 3 位地址12 个符号 × 8 行 = 96 个有效单元逐键比对 8 行点阵图案
保持到下次按键键码必须进锁存器,不能直接驱动 ROM74377 锁存,Y 下降沿触发松手后字符不消失、不跳变
多键同按只认最先命中后立即封锁扫描计数器74153 输出 Y 拉低 → 74161 的 ENP/ENT 失效同时按两键,观察是否停在单一字符
点阵动态扫描8 行轮流点亮,整帧刷新率高于人眼融合频率行扫描 ≥ 1 kHz,整帧 ≥ 125 Hz目视无闪烁,示波器看行信号周期
列驱动能力列信号经反相器驱动,FPGA 侧高电平有效ROWi 与 Cj 同为 1 时该点亮单点测试,确认亮灭极性

表里最容易被忽略的是最后一行。开发装置上的点阵列线经过了一级反相器,这意味着 FPGA 输出的列码是"高电平点亮",而 ROM 里存的数据如果按低有效去写,显示出来就是反的——本来是笔画的亮点全变成背景,整屏看着像噪点。这个坑在后面第 5 章还会专门说。

另一个要提前定死的是扫描时钟。单键扫描时间取 10 ms,4 列走完一轮是 40 ms,而人的按键闭合时间通常在零点几秒到一秒多,余量有十倍以上,不会丢键。但反过来,如果为了"更灵敏"把单键扫描时间压到 1 ms,扫描周期变成 4 ms,虽然更快,可机械抖动的 5~20 ms 就完全落在扫描窗口之外了,反而要额外加消抖。10 ms 这个值是个折中,既有天然消抖窗口,又远快于人的动作。

2.2 单元职责划分与器件清单

这套电路的器件清单看着杂,其实可以按"时钟—扫描—锁存—译码—存储—驱动"六段切开。每一段只负责一件事,段与段之间用明确的电平约定连接,这样调试时可以一段一段单独验,不用整板一起猜。用分离的 74 系列搭而不是全塞进 FPGA,好处也在这里:每一级的输入输出都能拿示波器探到,哪一级不对一目了然。

单元器件数量职责关键引脚
分频器7490 二-五-十进制计数器710 MHz 晶振逐级十分频,输出 8 档时钟CLKB 进、QA 出,级联成 10^7 分频
状态机 A74161 同步 4 位计数器1产生 4 位键码,命中后停止计数ENP/ENT 由 74153 的 Y 控制
状态机 B741611产生 3 位行扫描码只取 QCQBQA 三种状态
数据选择器74153 双 4 选 11(用一半)按键码低两位选通一条行线1C0~1C2 接 X0~X2,1C3 接高
寄存器74377 8 位锁存器1(用 4 位)保存命中的键码CLK 经反相器接 Y
列译码器74138 3-8 译码器1键码高两位译成 4 路列扫描输出低有效,接 Y0~Y3
行译码器741381行扫描码译成 ROW1~ROW8输入接状态机 B
显示码存储器自建 128×8 ROM1键码 + 行号 → 8 位列码7 位地址、8 位数据
反相选择器同或门阵列1 组前景背景互换1 位电平开关 + 8 位数据
颜色选择器741388每位数据选红或绿A 端接颜色开关,使能接数据位

清单里数量最多的是颜色选择器的 8 片 74138,乍看很浪费,其实每一片只做一件事:拿一位 ROM 数据当使能,用 A 端在红、绿两路输出之间二选一。这样做的代价是芯片多,好处是颜色切换完全不碰 ROM 内容,改一个电平开关就能整屏换色,答辩时演示效果很直接。

提示:器件数量确定后,先按信号流向在纸上排一遍位置,把跨段连线最多的那条(通常是 ROM 的 7 位地址)放短,能省掉后期大量飞线返工。

2.3 时钟链:7490 七级级联与占空比的取舍

7490 内部是"二进制 + 五进制"两段结构,所以同一个十分频有两种接法,而两种接法的输出占空比完全不同。外部时钟进 CLKA、QA 接 CLKB,取 QD 作输出,得到的是 20% 占空比;外部时钟进 CLKB、QD 接 CLKA,取 QA 作输出,得到的是 50% 占空比。这个差别在分频器本身看不出问题,但往下游一走就麻烦了:20% 占空比的时钟去做行扫描,每一行的实际点亮时间只有理论值的五分之一,亮度会明显偏暗,而且高电平窄到容易在级联处被判错。

// 单个 10 分频单元:对应 7490 的第二种接法(CLKB 进、QA 出),输出占空比 50% module div10 ( input wire clk_in, // 上一级时钟,最高 10 MHz input wire rst_n, // 低有效复位,对应 7490 的 CLRA/CLRB output wire clk_out // 十分频输出 ); reg [3:0] cnt; always @(posedge clk_in or negedge rst_n) begin if (!rst_n) cnt <= 4'd0; else if (cnt == 4'd9) cnt <= 4'd0; // 计到 9 归零,模 10 else cnt <= cnt + 1'b1; end // QA 是二进制计数的最低位,0~9 一个循环内高低各 5 次,占空比正好 50% assign clk_out = cnt[0]; endmodule

这段描述的只是单级行为,实际电路是 7 片级联,10 MHz 逐级除 10,从 10 MHz 一路分到 1 Hz,中间抽出 8 个档位:10 MHz、1 MHz、100 kHz、10 kHz、1 kHz、100 Hz、10 Hz、1 Hz。档位抽头不是为了炫技,是因为两个状态机要的时钟频率差着数量级——状态机 A 的扫描时钟取 100 Hz 左右(单键 10 ms),状态机 B 的行扫描时钟要取 1 kHz 以上,两者必须从不同抽头取,否则要么扫描太慢丢键,要么刷新太快闪屏。

参数上要盯住两点:一是复位端 CLRA、CLRB 全部拉低无效,SET9A、SET9B 也拉低,别让异步置 9 意外生效;二是级联时上一级的输出必须接到下一级的 CLKB 而不是 CLKA,接错端口占空比就退回 20%,症状是点阵整体发暗但还能显示,很容易被误判成驱动能力不足。

3. 按键扫描通路设计:状态机 A、74153 与 74377 怎么锁住第一个键

按键扫描这条通路的任务可以一句话概括:用一个 4 位计数器不停地走 16 个状态,每个状态对应阵列里的一个交点,走到哪个交点发现行线被拉低,就把这个状态号存下来并停住。听起来简单,但"停住"这个动作牵扯到三个器件的协同:74161 要停计数,74377 要锁存,74138 要同步给出对应的列扫描信号。三者只要有一个时序对不上,表现就是字符闪一下就没,或者锁存到的键码比实际按的键偏移一位。

3.1 键码编码:4 位计数器把 12 个键映射成 12 个码

4 位计数器有 16 个状态,12 个键只用掉 12 个,剩下 4 个是无效码。哪些状态无效,取决于高两位和低两位分别送去控制什么。常规教科书接法是高两位 Q3Q2 送数据选择器的 B1B0 去选行,低两位 Q1Q0 送列译码器的 A1A0 去选列,这样键码就是"行在前、列在后",有效码落在 0000~1011 这连续 12 个,ROM 只需 96 个单元。

但实际布线时很多人会反过来接:高两位去选列,低两位去选行。这一反,键码的含义就变成"列在前、行在后",有效码变成 0000、0001、0010、0100、0101、0110、1000、1001、1010、1100、1101、1110,无效码 0011、0111、1011、1111 散落在中间,ROM 就不能只做 96 个单元了,必须扩到 128 个,并且把无效码对应的 4 个 8 单元块空出来。

// 按键扫描通路:状态机 A + 74153 + 74377 的等效描述 module key_scan ( input wire clk_scan, // 分频器抽头,周期 = 单键扫描时间(约 10 ms) input wire rst_n, input wire [2:0] x, // RK1~RK3,行线状态,无键闭合时为高 output reg [3:0] key_code, // 锁存后的键码,直接作 ROM 高 4 位地址 output wire [3:0] col // 列扫描信号,低有效,接 74138 输出 ); reg [3:0] cnt; // 74161 状态机 A wire hit; // 74153 输出 Y,低电平表示当前交点闭合 // 列译码:cnt[3:2] 送 74138 的 A1A0,四位输出只有一位为低 assign col = ~(4'b0001 << cnt[3:2]); // 行选择:cnt[1:0] 送 74153 的 B1B0;第 4 路无行线,恒接高电平 assign hit = (cnt[1:0] == 2'd3) ? 1'b1 : ~x[cnt[1:0]]; // 命中则停止计数,等效于把 ENP/ENT 拉低 always @(posedge clk_scan or negedge rst_n) begin if (!rst_n) cnt <= 4'd0; else if (hit) cnt <= cnt + 1'b1; end // 74377 锁存:Y 由高变低时经反相器产生上升沿,锁存当前键码 always @(negedge hit or negedge rst_n) begin if (!rst_n) key_code <= 4'd0; else key_code <= cnt; end endmodule

这段代码里col的移位写法对应 74138 的低有效输出,hit的三目判断对应 74153 第 4 路输入接高电平的处理——如果忘记把 1C3 接高,计数器走到cnt[1:0] == 2'd3时输出会悬空,表现为每扫完三行就随机跳一次键码,症状很像接触不良,实际是输入没定死。key_code用negedge hit触发是为了对齐 74377 的锁存时机,真实电路里这一级前面还有一个反相器,代码里合进了敏感沿。

3.2 行线选择与锁存:Y 变低那一刻发生了什么

把时序摊开看会更清楚。假设当前扫描到第 2 列、第 1 行,此时col的第 2 位为低,行线 X0 通过上拉电阻保持高电平。如果 S2 键没按,X0 依然是高,74153 输出 Y 为高,计数器继续走;如果 S2 被按下,列线的低电平通过按键传到行线,X0 被拉低,Y 跟着变低。这一低带来两个后果:74161 的 ENP/ENT 失效,计数器停在当前状态;同时 Y 经反相器送到 74377 的 CLK,产生一个上升沿,把这个状态号写进锁存器。

这里有个容易翻车的细节:74377 的锁存是在 Y 变低的瞬间完成的,而此刻计数器其实还没完全停稳。如果分频器送来的时钟恰好在这一刻到达上升沿,74161 可能先加一,锁存器抓到的就是下一个键码,表现为"按 S2 显示 S3"。避免的办法是让锁存沿走在计数沿之前,或者干脆用同一个时钟的相反相去驱动锁存器,让建立时间有保障。我一般会在仿真里专门盯这个竞争窗口,把扫描时钟周期留出至少 20% 的余量。

还有一点常被忽略:锁存之后 Y 会一直保持低电平,因为键还按着。这时候 74377 的 CLK 一直停在高电平,不会再产生沿,键码稳定不变,这正是"保持到下次按键"的实现方式。等新键按下,扫描重新启动,走到新交点时再产生一次下降沿,锁存器更新。整个过程没有用到任何软件干预,纯硬件时序。

3.3 消抖:RS 触发器与扫描时间窗的双保险

机械按键的触点在闭合瞬间会产生 5~20 ms 的抖动,如果电路对这个抖动敏感,一次按下会被识别成好几次。题目里提到的做法是用基本 RS 触发器对行线信号整形,这在分离器件方案里是标准操作:两个交叉耦合的与非门把抖动的边沿整成一次干净的电平跳变,输出送给 74153。

不过在这套扫描结构里,RS 触发器其实是第二道保险,第一道是扫描时间窗本身。单键扫描时间 10 ms,意味着同一个交点每 10 ms 才被采样一次,中间 5~20 ms 的抖动大部分会落在两次采样之间,根本采不到。两者叠加的结果是:即使某个 RS 触发器接得不太理想,整机也不会出现连击。反过来说,如果为了"更灵敏"把扫描时间压到 1 ms,这层天然滤波就没了,抖动会实打实地被采进来,那时候就必须把 RS 触发器调到非常干净才行。

注意:RS 触发器用的是与非门交叉耦合,两个输入端都必须有上拉,悬空会导致输出锁死在某一个状态,现象是整列按键全部失灵,很容易被误判成译码器坏。

4. 点阵显示通路设计:128×8 ROM 的地址分配与 8 行动态扫描

显示这条通路的思路和扫描正好相反:扫描是"逐个问、问到一个就停",显示是"不停地轮、一轮一轮刷"。8×8 点阵有 64 个发光二极管,同一时刻只点亮一行,靠 8 行快速轮换让人眼看到完整字符。要显示的内容存在 ROM 里,ROM 的地址由两部分拼成——高 4 位是当前锁存的键码,低 3 位是当前扫描到第几行。地址一变,输出的 8 位列码就变,配合行译码器选中的那一行,屏幕上就出现对应的那一条横线。

4.1 7 位地址怎么切:高 4 位键码、低 3 位行号

ROM 容量定成 128×8,不是拍脑袋。12 个符号,每个符号 8 行,每行 8 位,需要 96 个单元;如果键码是连续的有效值,96 个单元刚好够,地址取 7 位中的低 7 位即可。但前面说过,键码位序一反,有效码就散在 16 个状态里,只有 12 个有效,剩下 4 个必须占位,于是 16 × 8 = 128,正好是 7 位地址能覆盖的全空间。

地址拼接的方式直接决定字模表怎么填:

// 128×8 ROM 寻址:{键码[3:0], 行号[2:0]} // 每个符号固定占连续 8 个单元,低地址 → 高地址 对应 点阵 上 → 下 wire [6:0] rom_addr = {key_code, row_cnt}; rom128 u_rom ( .address (rom_addr), .clock (clk_pix), // 像素时钟,与行扫描同源 .q (rom_data) // 8 位列码,高电平点亮 );

key_code来自 74377 的输出,row_cnt来自状态机 B 的 QCQBQA。这个拼法要求字模表按"块"组织:地址 0x00~0x07 是键码 0000 的 8 行,0x08~0x0F 是键码 0001 的 8 行,依此类推。如果键码 0011、0111、1011、1111 是无效码,对应的 0x18~0x1F、0x38~0x3F、0x58~0x5F、0x78~0x7F 四块就空着不填,或者填全 0 让它显示空白。

字模数据以数字"0"和"1"为例,1表示该列点亮:

DEPTH = 128; WIDTH = 8; ADDRESS_RADIX = HEX; DATA_RADIX = BIN; CONTENT BEGIN 00 : 00111100; -- "0" 第 1 行 01 : 01000010; 02 : 01000010; 03 : 01000010; 04 : 01000010; 05 : 01000010; 06 : 00111100; 07 : 00000000; -- 第 8 行留空,行间距 08 : 00011000; -- "1" 第 1 行 09 : 00111000; 0A : 00011000; 0B : 00011000; 0C : 00011000; 0D : 00011000; 0E : 01111110; 0F : 00000000; END

填表时有两件事必须对齐,错一件就整屏错位。第一件是数据位序与列的对应:D7 对应 C1(最左列)还是 C8(最右列),取决于硬件连线的顺序,如果是 D7→C1,那么00111100就是中间 6 列亮、两端灭;如果反了,图案会左右镜像。第二件是低 3 位地址与行序的对应:地址递增是自上而下还是自下而上,取决于状态机 B 的输出与 74138 输入的位序是否一致。这两件事在纸面上都对,上板才见分晓,所以字模表最好先只填一个符号,确认方向对了再批量填。

4.2 8 行动态扫描的时序账

动态扫描的核心参数是刷新率。整帧 8 行,如果每行点亮 1 ms,整帧 8 ms,刷新率 125 Hz,远高于人眼融合阈值,看起来是一条连续的横线而不是闪烁的扫描线。行扫描时钟取 1 kHz 正好对应每行 1 ms,这个频率从分频器抽头直接拿得到,不用额外做。

扫描过程由状态机 B 驱动:3 位计数器循环 0~7,输出送 74138 的 S2S1S0,译码后 ROW1~ROW8 依次为低(或高,取决于点阵共阳共阴接法)。与此同时,这 3 位也作为 ROM 地址的低 3 位,所以行选到第几行,ROM 就输出第几行的列码,两者天然同步,不需要额外的锁存或延时。

亮度上要留意一点:每行只亮 1/8 的时间,峰值电流必须按 8 倍设计,否则整屏看着偏暗。开发装置上的列信号已经过了反相器驱动,电流能力是按动态扫描算的,自己搭电路时如果省掉这一级缓冲,FPGA 端口的驱动能力不够,表现是点亮的点数越多整屏越暗,这是典型的负载效应,不是逻辑错。

4.3 反相与颜色:一个同或门阵列加 8 片 74138

反相选择器的需求很朴素:按一下开关,让前景色和背景色互换。列出真值表会发现,原信号与电平控制信号之间是同或关系——控制位为 0 时输出等于原信号,为 1 时输出取反。所以整组 8 位数据可以用同或门一次处理完,不用逐位判断。

// 反相选择器:inv_sel=0 正相输出,inv_sel=1 反相输出 // 8 位并行,等价于 9 进 8 出的同或门阵列 assign dout = ~(din ^ {8{inv_sel}}); // 颜色选择器:每位 ROM 数据控制一片 74138 的使能,A 端接颜色开关 // color_sel=0 走红灯支路,color_sel=1 走绿灯支路 assign red = rom_data & ~{8{color_sel}}; assign green = rom_data & {8{color_sel}};

同或那行的写法要解释一下:din ^ {8{inv_sel}}是逐位异或,inv_sel为 0 时结果等于din,为 1 时结果等于~din,外面再取一次反,正好得到同或。颜色部分用 8 片 74138 看着夸张,等效逻辑其实就是两条与门支路:数据位为 1 时才允许对应的颜色输出,颜色开关决定这个 1 送到红灯还是绿灯。用 74138 而不是直接用与门,是因为它的使能端有多个,可以把数据位和总使能分开控制,调试时可以单独关掉某一位看效果。

这两个模块都挂在 ROM 输出和点阵之间,顺序不能颠倒。反相在前、颜色在后,意味着颜色切换不影响图案形状;如果反过来,反相会把红绿两路一起翻掉,按一下开关整屏变黑。实际接线时按"ROM → 反相 → 颜色 → 点阵"的顺序走,中间不要交叉。

5. 联调避坑:显示码错乱、极性反接与丢键的排查顺序

电路连完、程序烧进去,第一次上电大概率不是完美的。这套设计里最常见的问题集中在四类:显示内容和设计不符、亮灭极性反了、快速点按没反应、上电就乱码。这四类的现象很像,但根因完全不同,排查顺序错了会白白拆掉一堆线。我的习惯是从"最不可能返工的地方"开始查——先看 ROM 内容和地址,再看极性,最后才动接线。

5.1 显示字符和设计对不上,图案整体错位

现象:按下某个键,屏幕上确实出现了笔画,但图案明显偏移,或者显示的是另一个键的符号,而且换几个键按,错的位置还不固定。

原因:多半是键码位序和 ROM 地址拼法不匹配。如果按教科书画的图,高两位送数据选择器选行、低两位送译码器选列,键码是连续的有效值,ROM 做 96 个单元就够;但实际接线反过来了,高两位去选列、低两位去选行,有效键码就散成了 0、1、2、4、5、6、8、9、10、12、13、14,无效码 3、7、11、15 夹在中间。这时候 ROM 若仍按 96 单元填,地址 0x18 以后的内容全部错位,图案自然乱。

解决:把 ROM 扩到 128 个单元,按"键码 × 8 + 行号"重新排表,无效键码对应的 4 个块(0x18~0x1F、0x38~0x3F、0x58~0x5F、0x78~0x7F)空着不填。验证办法很简单:按住一个键不动,看 8 行图案是不是连续且方向正确,如果只有前 3 行对、后 5 行乱,基本可以确定是地址拼法问题。

5.2 该亮的地方黑,该黑的地方亮

现象:图案形状是对的,但整体反了——笔画变成背景,背景变成笔画,看起来像一块噪点屏。

原因:列信号的极性判断错了。开发装置上的点阵列线经过一级反相器,FPGA 侧输出高电平才点亮,而 ROM 里如果按"低电平有效"填数据,输出就整体取反。另一种可能是反相选择器的控制开关默认状态就是取反,上电即反。

解决:先确认反相开关的位置,把它拨到正相再观察;如果仍然反,就是字模数据填反了,把每个字节按位取反重填。判断依据是点阵的行信号:行选中的那一行如果整行全亮或全灭,说明列码极性反了,而不是行译码错。

5.3 快速点按没反应,慢按才灵

现象:慢慢按下能正常显示,快速点一下就过,屏幕不更新,或者要按两三次才响应一次。

原因:按键闭合时间短于阵列扫描周期。单键扫描 10 ms、4 列一轮 40 ms,如果按键只闭合 20 ms,很可能整个闭合窗口都落在两次采样之间,状态机根本没走到那个交点。另一种可能是消抖电路的 RS 触发器把短脉冲直接滤掉了。

解决:先量扫描时钟的实际周期,确认是不是被分频器抽头选错(比如取到了 100 Hz 档,单键变成 100 ms,一轮 400 ms,那几乎必然丢键)。确认时钟无误后,再检查 RS 触发器的两个输入端是否有上拉,悬空会让它锁死。正常情况下,人的按键动作在 0.1 s 以上,40 ms 的扫描周期有足够余量,不需要为了灵敏再压低扫描时间。

5.4 上电就乱码,或者松手后字符跳变

现象:一上电屏幕就是一堆杂乱亮点,按一下键才恢复正常;或者按住键显示正常,一松手字符就变了。

原因:前者是锁存器 74377 上电初值不确定,键码输出是随机的,ROM 读到的地址也是随机的;后者是锁存器的锁存沿有问题,Y 回高时又触发了一次锁存,把计数器的新状态写了进去。

解决:给 74377 加一个上电复位,把输出强制清 0,让初始状态显示一个固定符号(比如全灭)。锁存沿的问题要回到第 3 章那个竞争窗口,确认反相器接在 Y 和 CLK 之间,并且锁存发生在 Y 由高变低的那一刻,而不是回高的那一刻。如果反相器接反,症状就是松手跳变,很容易被误认为"保持功能没做"。

6. 验收与答辩:用一组测试向量把功能说清楚

功能做出来和能证明功能做出来是两件事。答辩现场最尴尬的场面是:板子明明能跑,但被问"你怎么证明多键同按只响应最先"时答不上来,只能当场乱按。我的做法是提前准备一张测试向量表,每一行对应一条设计指标,写清楚操作、预期现象、实际现象,验收时照着表一条条过,答不上来的概率会低很多。

编号操作预期现象判定依据
T1依次按下 12 个键每次显示对应符号,不串码12 个符号与字模表逐一比对
T2按住某键 5 s 后松开符号保持不变,不闪不跳松手瞬间观察点阵无变化
T3按住 S2 不放,再按 S5仍显示 S2 的符号第二个键不改变显示内容
T4同时按下 S2 和 S5只显示其中一个,且稳定不变重复 10 次,结果一致即合格
T5拨动反相开关前景背景互换,图案形状不变对比切换前后点阵照片
T6拨动颜色开关红绿互换,图案形状不变观察颜色变化,笔画位置不动
T7上电不按键显示固定初始状态,无杂乱亮点反复上电 5 次,结果一致

验收时按 T1 到 T7 的顺序走,因为前面的项是后面的基础:T1 不过,T2 之后都没有意义。T3 和 T4 是最容易翻车的两条,T3 考的是计数器封锁是否彻底,T4 考的是扫描顺序的确定性——严格来说,同时按下时电路响应的是"扫描顺序上更靠前的那个",而不是"物理上更早的那个",这一点在答辩时要主动说清楚,不然容易被追问到卡壳。

答辩讲解建议按"指标 → 结构 → 时序 → 证据"四段走,每段两分钟以内。指标段只说四条约束,不展开原理;结构段拿总图讲六个单元的信号流向,重点说清键码怎么从 74161 走到 ROM 地址;时序段挑扫描周期和刷新率两个数字,说明为什么取 10 ms 和 1 kHz;证据段直接放测试向量表和几张点阵照片,比讲十分钟原理管用。

提示:示波器截图比口头描述有说服力,提前把行扫描信号和列码的波形存成图片,答辩时直接贴,能省掉大量解释。

这套电路我第一次做的时候,T4 连挂了三次,前两次都以为是扫描顺序的玄学,第三次才拿示波器去看 ENP 的波形,发现命中后计数器还在抖一下才停,根因是锁存沿和计数沿挨得太近。从那以后我每次做完这类扫描电路,都强制先跑一遍"同时按两键"的测试,再看别的功能——顺序反了,后面全是白忙。希望这套结构和这张验收表,能帮你少走一遍我踩过的路。

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

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

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

立即咨询