
A17基于51单片机汇编语言矩阵按键控制数码管显示Proteus设计
用51单片机汇编语言做第二个矩阵按键方案:4×4矩阵按键接P1口,用逐行扫描法识别按键,段码经P2口直接驱动数码管,按下哪个键就显示对应的键值0到F。和A16的键码比对法思路不同,这篇用的是行号列号算法,代码更直观。资料包含Proteus仿真文件和完整汇编源码。
一、设计实现功能
本设计功能简介:使用51单片机和汇编语言设计一个4X4矩阵按键数码管显示器的proteus仿真,要求以下功能:
1、使用汇编语言编写程序。
2、要求可以检测4X4矩阵按键的数值,并通过数码管显示按键数值。
二、资源汇总
1、仿真文件:Proteus工程,7.8和8.6两个版本都能直接打开。
2、程序文件:main.asm汇编源码,以及编译好的cx.hex。
3、修改日期小工具:购买资料后赠送,用于修改文件创建日期,下载地址在文章最后。
三、设计介绍
拿到压缩包之后先解压,没有解压软件的直接搜"压缩",下载解压软件后先解压文件,再运行仿真和程序。
同样是4×4矩阵,A16用键码比对,这篇用逐行扫描+行号列号计算,是矩阵键盘的另一种经典写法。P1.0~P1.3接4根行线,P1.4~P1.7接4根列线,段码由P2口直接送数码管,不用串转并芯片,硬件更简单。
图1 Proteus仿真总览

扫描分两轮,思路是把行和列分开确认:
第一轮逐行扫描——P1写0F0H(列线全置高、行线全置低),然后从P1.0开始逐位判断哪一行被拉低:
`asm
LSCAN: MOV P1,#0F0H
L1: JNB P1.0,L2 ;P1.0不是低电平,试下一行
LCALL DELAY ;消抖
JNB P1.0,L2
MOV LINE,#00H ;记下第0行
LJMP RSCAN
L2: JNB P1.1,L3
LCALL DELAY
JNB P1.1,L3
MOV LINE,#01H ;第1行
LJMP RSCAN
…(L3、L4同理,直到第3行)`
第二轮逐列扫描——P1写0FH(行线全置高、列线全置低,电平互换),从P1.4开始判断哪一列被拉低,记下列号ROW。
图2 汇编程序源码

拿到行号和列号,一句乘法加一句加法算出键值:
`asm
CALCU: MOV A,LINE ;行号
MOV B,#04H
MUL AB ;行号×4
ADD A,ROW ;加列号=键值
MOV VAL,A`
键值=行号×4+列号,分布非常规整:
| 键值 | 第0列 | 第1列 | 第2列 | 第3列 |
| 第0行 | 0 | 1 | 2 | 3 |
| 第1行 | 4 | 5 | 6 | 7 |
| 第2行 | 8 | 9 | 10 | 11 |
| 第3行 | 12 | 13 | 14 | 15 |
再用MOVC A,@A+DPTR拿键值查TABLE段码表,直接MOV P2,A输出,数码管亮出对应数字。表里16个段码依次是0~9、A~F的共阳段码,和A16的表内容一致。
特别注意: 仿真跑起来行扫描卡住不动,检查行线是否漏接上拉;两次扫描之间一定要重新写P1口切换电平方向,否则读不准;消抖延时约10毫秒;改了源码要重新编译生成hex再跑仿真;Proteus用7.8或8.6版本。
四、日期修改
资料中提供修改日期的小工具,购买资料赠送修改文件创建日期的小工具,三个下载地址都在文章最后。
五、资料下载
付费后获取下载链接,直接下载到电脑上,然后解压即可!每个链接前面都配了二维码,手机扫码可以直接跳转。
/

