资讯详情

资讯详情

汇编语言实现矩阵键盘扫描与数码管显示入门指南

简介这份资源面向单片机初学者与电子爱好者聚焦51单片机汇编语言实现矩阵键盘扫描这一基础项目帮助读者理解行线列线交叉检测按键的硬件原理与汇编编程方法。压缩包共1个doc文件约283KB内含完整程序源代码与代码块说明涵盖变量定义、主函数初始化、按键判断与键值计算、数码管显示与移位、清零及延时子程序、共阴极段码表等模块代码注释清晰便于对照学习。已有569人学习下载适合作为汇编入门与硬件I/O操作的实践参考读者可从中掌握扫描去抖、键值计算、数码管动态显示与移位控制等关键思路并理解循环与条件判断在嵌入式程序中的组织方式。1. 从一块“按了没反应”的键盘说起矩阵键盘扫描到底是什么你手里如果有一块单片机开发板上面通常会有几个独立按键按一下亮一个灯很直观。可一旦按键数量变成 16 个你还想一个按键占一个引脚吗引脚根本不够用。这时候就要请出矩阵键盘扫描了——它把 16 个按键排成 4 行 4 列只用 8 根线就能全部管起来靠“扫描”的方式一个个问过去是你被按下了吗说白了矩阵键盘扫描就是单片机用行线和列线交叉成网格轮流给每一列送低电平再读每一行的高低状态从而判断哪个交叉点被按下。它解决的是“按键多、引脚少”的矛盾适合刚接触单片机、想搞懂输入输出配合的新手。汇编语言写起来确实比 C 语言啰嗦但正因为啰嗦你能亲眼看到每一个电平是怎么翻转的这份资源就是带你从零把这件事跑通。2. 为什么新手值得从汇编啃一遍看懂电平翻转的底层逻辑2.1 汇编不是故意为难你它把硬件摊开给你看很多新手第一次听说“用汇编写矩阵键盘”第一反应是发怵一堆 MOV、JB、LJMP看着像天书。我第一次学的时候也这样盯着MOV P1, #0F0H看了半天不知道它到底在干嘛。后来想明白一件事汇编的每一行几乎都对应硬件上的一次动作MOV P1, #0F0H就是把 P1 口的高 4 位写成 1、低 4 位写成 0等于告诉列线“我准备从低电平这边开始扫”。用 C 语言写你可能写一句P1 0xF0;就过去了编译器帮你做了很多事。汇编没有这层遮挡你得自己安排哪个寄存器存键值、哪个变量存段码、延时循环几层。这种“什么都要自己管”的体验恰恰是理解单片机输入输出最直接的方式。入门阶段啃一遍后面再看任何按键扫描代码你都能一眼看出它在扫行还是扫列。2.2 矩阵键盘扫描在真实设备里到处都是别以为这只是课堂作业。电子秤上的数字键、老式电话的拨号盘、工业控制面板上的参数设置键很多都是矩阵结构。原因很朴素按键一多独立按键的引脚开销就受不了而矩阵键盘用行线加列线的交叉点来复用引脚4 根行线加 4 根列线就能覆盖 16 个键。你把这套扫描逻辑吃透以后遇到 3×4 的小键盘或者 4×4 的扩展键盘改一下行列数就能迁移。这份资源里的代码还顺带把数码管显示串了进来按下键键值存进变量再通过段码表送到数码管上显示。也就是说你练的不只是“读按键”而是“读进来—算键值—显示出去”这一整条链路。对零基础的人来说这条链路跑通一次比看十篇原理文章都管用。2.3 先建立一张“程序地图”别一上来就逐行读新手最容易翻车的地方是打开源代码就从第一行往下读读到LJMP MAIN就迷路了。我的建议是先画一张粗地图知道程序分几块程序块作用新手关注点变量定义区S1S9 存数码管段码每个变量对应一位数码管主函数 MAIN循环调用显示和扫描程序永远在这两个子程序间转键盘扫描 KEY_INT判断有无按键、算键值去抖和行列判断是重点显示 DISPLAY1把段码送到数码管注意 P2 口选位、P0 口送段码清零 ZERO清空显示对应“清零”功能键移位 SWAP_SHU1/2数字左移右移对应“退格”类功能键延时 DELAY1/2去抖和显示停留循环次数决定延时长短有了这张表你再去看代码就不会被SETB 7AH这种标志位吓到——它只是告诉显示程序“这次要移位了”。入门阶段不需要背指令先知道每一块负责什么读代码就有方向。3. 动手前的准备硬件连线与第一个可运行框架3.1 硬件怎么接先对着口线认一遍这份代码默认的接法是矩阵键盘接在 P1 口高 4 位 P1.4P1.7 是行线低 4 位 P1.0P1.3 是列线数码管段码送 P0 口位选送 P2 口。你拿到开发板后先别急着烧程序拿万用表或者看原理图确认两件事按键的行列是不是真的落在 P1 上数码管是共阴还是共阳。代码里的段码表是按共阴极写的80H对应数字 006H对应数字 1一路到6FH对应数字 9。如果你板子上的数码管是共阳极显示会全乱这时候要么换共阴数码管要么把段码表整体取反。这个坑我见过太多人踩现象就是“程序烧进去了数码管亮得莫名其妙”原因往往就是共阴共阳没对上。提示接线前先断电确认开发板供电电压和单片机型号匹配别热插拔排线。3.2 第一个能跑的最小框架先让数码管亮起来不要一上来就把整份代码烧进去。入门最稳的做法是先跑一个最小框架只做初始化然后循环调用显示子程序让数码管稳定显示一个 0。下面这段是从资源里抽出来的骨架你可以先照着敲ORG 0000H LJMP START ORG 0030H START: MOV R1, #00H ; 键值初值设为 0对应段码表第一个数字 MOV DPTR, #TABLE ; 数据指针指向共阴段码表 MAIN: LCALL DISPLAY1 ; 只调用显示先不扫描键盘 LJMP MAIN DISPLAY1: MOV A, R1 MOVC A, ADPTR ; 用 R1 做偏移从表里取段码 MOV P0, A ; 段码送 P0 口 MOV P2, #00H ; 选中第一位数码管 RET TABLE: DB 80H, 06H, 5BH, 4FH, 66H DB 6DH, 7DH, 07H, 7FH, 6FH, 3FH END这段代码只做一件事把R1当索引从TABLE里取出段码送到 P0再让 P2 选中第一位。MOVC A, ADPTR是查表指令A里放偏移量DPTR放表首地址取出来的字节就是数码管该亮的段。跑通它的标志是数码管第一位稳定显示 0不闪不乱。如果显示的是乱码先查共阴共阳再查 P0 和 P2 有没有接反。这一步看着简单但它把“变量—查表—输出”这条线走通了。后面加键盘扫描只是在这条线上多一个“读按键、改 R1”的动作。3.3 把扫描子程序接进来先只判断“有没有键按下”显示稳了之后再把键盘扫描的最小判断加进来。资源里的KS子程序就是干这个的KS: MOV P1, #0F0H ; 高 4 位行线置 1低 4 位列线置 0 MOV A, P1 ; 读 P1 口实际电平 XRL A, #0F0H ; 和 0F0H 异或有键按下时结果非零 RETMOV P1, #0F0H先把列线拉低、行线拉高如果没有任何键按下行线读回来还是高电平异或之后A就是 0一旦某个键按下对应的行线被列线拉低异或结果就非零。主程序里用JNZ判断这个结果非零才继续往下走去抖和算键值。先跑到这里你可以用调试器单步看A的值不按键时是 0按住任意一个键时变成非零。这个现象确认了说明你的硬件连线和口线方向都没问题再往下写行列判断就有底了。4. 把第一个例子跑通从按键到数码管显示的完整链路4.1 去抖这一步不能省两次检测加一段延时机械按键按下去的瞬间触点会弹跳几下单片机读到的电平可能在 0 和 1 之间抖。资源里的做法很经典先调KS检测到可能有键延时一段再调一次KS确认。对应代码是KEY_INT开头那几行KEY_INT: LCALL KS JNZ K1 ; 第一次检测非零跳到 K1 LCALL DELAY1 ; 没键也延时一下避免空转太快 AJMP KEY_INT K1: LCALL DELAY1 ; 确认前先延时去抖 LCALL KS JNZ K2 ; 第二次仍非零才认为真的按下 AJMP KEY_INTDELAY1里是MOV R3, #10加一个DJNZ循环循环里还调了显示子程序所以它既是延时也在维持数码管刷新。新手常问“延时多久合适”入门阶段不用精确算按资源里的循环次数先跑现象稳定就行如果发现按一下出好几个数就把R3调大一点再试。4.2 行列扫描怎么算出键值列号加行首键号确认有键之后K2到K4这一段开始逐列扫描。思路是先把第一列拉低MOV R2, #11110111B读四根行线哪一行为低就说明按键在这一行这一列没读到就把扫描值右移一位换下一列同时列号R0加一。行首键号是 01H、05H、09H、13加上列号就得到最终键值。K2: MOV R2, #11110111B ; 第一列拉低其余列保持高 MOV R0, #00H ; 列号从 0 开始 K3: MOV P1, R2 JB P1.7, L1 ; P1.7 为 1 说明第 0 行没按下 MOV A, #01H ; 第 0 行首键号 AJMP LK L1: JB P1.6, L2 MOV A, #05H ; 第 1 行首键号 AJMP LK LK: ADD A, R0 ; 行首键号加列号得到键值 MOV R1, A ; 键值存进 R1供显示使用 SETB 7AH ; 置移位标志显示程序据此左移 AJMP K4JB P1.7, L1的意思是“如果 P1.7 是 1 就跳走”也就是这一行没被按下四行都没跳走才落到MOV A, #01H记下这一行的首键号。ADD A, R0把行首键号和当前列号相加得到的数就是 1 到 16 之间的键值。这里R0从 0 开始所以第一列第一行是 1第一列第二行是 5依此类推。4.3 键值怎么变成数码管上的数字查表和移位键值存进R1后DISPLAY1会先判断它是不是功能键0BH走退格0CH走清零其余当数字处理。数字处理的核心还是查表DISPLAY1: MOV A, R1 XRL A, #0BH JZ DEL1 ; 键值 0BH走退格 MOV A, R1 XRL A, #0CH JZ ZERO ; 键值 0CH走清零 JB 7AH, SWAP_SHU1 ; 移位标志置位先左移再显示 MOV A, R1 MOVC A, ADPTR ; 查段码表 MOV S1, A ; 存进第一位数码管变量 MOV P2, #00H MOV P0, S1 LCALL DELAY2 ; 后面依次显示 S2 到 S8位选每次加 04HXRL加JZ是汇编里常见的比较写法把R1和功能键值异或结果为 0 就说明相等。JB 7AH, SWAP_SHU1检查移位标志如果上一次按键要求左移就先执行SWAP_SHU1把 S8 到 S1 依次往高位挪再回来显示。这样你连续按数字键数码管上的数字会一位位往左推像计算器输入一样。MOV P2, #00H到MOV P2, #1CH是位选每次加04H对应 8 个数码管的位选地址。MOV P0, S1把段码送到段码口。两个口配合一个选“哪一位”一个送“显示什么”这是动态扫描显示的基本套路。4.4 清零和退格两个功能键背后的子程序ZERO子程序把 S2 到 S9 全部写 0同时清掉移位标志7AH然后跳回显示。DEL1和SWAP_SHU2负责退格把 S2 到 S8 依次往低位挪最后一位补 0。资源里这段代码有注释掉的旧版本新手读的时候容易看花你只要抓住“左移是 S8 往 S9 挪、右移是 S2 往 S1 挪”这个方向就行。跑通完整链路的验收标准是按数字键数码管对应位显示数字并逐位左移按清零键显示全灭按退格键最后一位被抹掉。三个现象都对说明扫描、键值计算、显示、移位这几块已经串起来了。5. 新手最容易踩的坑排查清单与常见问题5.1 现象数码管全亮或显示乱码原因多半是共阴共阳没对上或者段码表索引错位。资源里的表是按共阴写的80H是 0如果你板子是共阳0 会变成全亮。解决方法是先确认数码管类型共阳就把表里每个字节取反或者换一块共阴数码管再试。另一个可能是R1初值不是 0查表偏移错了检查START里MOV R1, #00H有没有被后面的代码覆盖。5.2 现象按键没反应或者按一下出好几个数没反应先查 P1 口接线和KS的返回值单步看A是否非零如果一直为零说明行线列线接反或者按键没接通。按一下出多个数基本是去抖不够把DELAY1里的R3从 10 调大或者确认两次KS之间确实走了延时。还有一种情况是扫描循环DJNZ R7的初值太小8 次没扫完就退出检查MOV R7, #08H有没有被改动。5.3 现象显示闪烁严重或者只有一位亮闪烁通常是DELAY2太短或太长动态扫描每位停留时间不合适先把R4、R5的循环次数按资源原值跑别自己乱改。只有一位亮查位选P2的递增值是不是04H以及MOV P2, #00H到#1CH这八条有没有漏写。还有可能是S2到S8变量地址被别的数据覆盖确认EQU定义的 30H 到 38H 没和堆栈冲突。5.4 现象功能键不生效退格和清零没区别先看DISPLAY1里对0BH和0CH的判断顺序XRL之后必须紧跟JZ中间插了别的指令就会跳错。再确认键值计算出来的功能键到底是不是0BH、0CH可以在调试器里看R1的实际值。如果键值对不上回头检查行首键号和列号的加法功能键通常排在数字键之后行列位置变了键值也会变。5.5 现象程序跑飞数码管突然全灭汇编里最常见的是跳转目标写错或者子程序没有RET。检查每个LCALL对应的子程序末尾有没有RETLJMP的目标标号是否存在。资源里DEL1那段有注释掉的代码如果你手动删注释时漏了标号汇编器可能不报错但运行会乱跳。养成习惯改完代码先看汇编器有没有警告再单步跑一遍主循环。6. 下一步学什么从这份代码走向自己的小项目跑通这份矩阵键盘扫描之后你手里其实已经有了一套可复用的骨架初始化、扫描、去抖、查表、动态显示。接下来别急着换更复杂的芯片先把这套骨架改出几个变体每个变体只动一小块这样学得最扎实。第一个变体是改行列数。把 4×4 改成 3×4行线少一根行首键号和扫描值跟着改键值范围从 1 到 12。改完你会发现矩阵键盘扫描的核心不是固定代码而是“列扫描值 行首键号 列号”这个计算套路。第二个变体是换显示内容把段码表扩成带字母的按键值显示 A 到 F练查表和边界判断。第三个变体是加一个长按判断在去抖确认之后计时超过一定时间算长按这会让你的延时子程序从“死等”变成“可计数”。学汇编容易陷入一个误区想把每条指令都背下来。我自己的血泪经验是指令不用背用多了自然记住常用的十几条剩下的查手册就行。真正要练的是“看到现象能定位到哪一段代码”的能力。从那以后我每次改按键程序都强制先单步跑一遍KS确认A的返回值符合预期再往下看行列扫描这个习惯帮我省了很多后悔药。如果你想把这份资源用透建议按这个顺序走先只跑显示再只跑“有无按键”然后跑完整键值最后试功能键。每一步都用一个明确现象验收不对就停在那一步查别一口气全烧进去然后对着乱码发呆。等这套流程走顺了你再去看独立按键、编码器或者更复杂的输入设备会发现底层逻辑是相通的。希望这份入门指南能帮你把第一块矩阵键盘真正按响后面的路就从你亲手改出来的第一个变体开始。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →