
A38基于51单片机汇编语言矩阵按键输入显示Proteus设计
用51单片机汇编语言做一个矩阵按键输入显示:4×4键盘按下哪个键,8位数码管就把对应的数字显示出来,最多记8位,按满第9下蜂鸣器提示一声、屏幕清零重新来。练的是矩阵键盘扫描加动态显示这两件事怎么在同一个主循环里不打架。
一、设计实现功能
本设计功能简介:使用51单片机和汇编语言设计一个矩阵按键输入显示的proteus仿真,要求以下功能:
1、使用汇编语言编写程序。
2、4×4矩阵键盘,16个键对应数字0~9和A~F。
3、8位数码管动态扫描显示,第1次按键清掉初始的0,之后每按一次数字左移一位。
4、按满9次蜂鸣器响一声,显示全部清零并重新开始。
二、资源汇总
1、仿真文件:Proteus工程,7.8和8.6两个版本都能直接打开。
2、程序文件:main.asm汇编源码,以及编译好的cx.hex。
3、修改日期小工具:购买资料后赠送,用于修改文件创建日期,下载地址在文章最后。
三、设计介绍
拿到压缩包之后先解压,没有解压软件的直接搜"压缩",下载解压软件后先解压文件,再运行仿真和程序。
图1 Proteus仿真总览

接线两张表就够:
| 功能 | 引脚 | 说明 |
| 段码 | P0.0~P0.7 | 8段全部使用,P0需上拉 |
| 位选 | P2.0~P2.7 | 低电平选中对应数码管 |
| 键盘行 | P3.0~P3.3 | 先写0F0H输出行码 |
| 键盘列 | P3.4~P3.7 | 再写0FH读列 |
| 蜂鸣器 | P1.0 | T0中断翻转 |
键盘扫描是4×4,所以键值算法比A35的4×3多乘一位:
`asm
K2: MOV A,LINE
MOV B,#04H
MUL AB ;行号×4
ADD A,ROW ;加列号
MOV VAL,A ;键值0~15
MOVC A,@A+DPTR ;查段码表`
段码表正好16个字节,0~15对应0~9、A~F,键值和表下标一一对应,中间不需要任何映射。
显示缓冲是30H~37H八个字节,第一个键特殊处理:直接覆盖最右边的LED_BIT_8,把初始化时那个"0"顶掉;从第二个键开始调用移位子程序,整体往左推一格,新数字进最右边:
`asm
SHIFT: MOV LED_BIT_1,LED_BIT_2
MOV LED_BIT_2,LED_BIT_3
...
MOV LED_BIT_7,LED_BIT_8
MOV LED_BIT_8,A ;新数字进最右`
所以连续按1到8,屏幕从左到右显示的就是12345678,和输入顺序一致。
第9次按键走的是另一条路——在CALCU里先INC KEY_CNT,等于9就启动T0(700微秒中断翻转P1.0),然后一直按住就一直响,松手后清显示、关定时器、跳回START重来。这个设计把"响"和"按住"绑在一起,是很直观的提示方式。
动态扫描每位数码管点亮一次DELAY约5毫秒,8位一轮40毫秒,刷新率25Hz。扫描期间键盘不响应,所以按键要按够时间才能被读到——这是"动态扫描+键盘"共用CPU的必然结果,实际项目里通常把扫描放进定时中断,主循环专心处理按键。
特别注意: 数码管有暗影或者重影,是段码没消隐,切换下一位之前要先MOV P0,#00H把前一位关掉;按键按一下出好几个数字,是没做"等待按键抬起",程序里W20、W30那几段循环就是干这个的;按到第8个键之后不显示,检查KEY_CNT有没有被清零,只有第9次才清;蜂鸣器一直响,是松手检测没通过,P3写0F0H之后要读到全1才算真正松开;P0一定要接上拉排阻,否则显示发暗。
四、日期修改
资料中提供修改日期的小工具,购买资料赠送修改文件创建日期的小工具,三个下载地址都在文章最后。
五、资料下载
付费后获取下载链接,直接下载到电脑上,然后解压即可!每个链接前面都配了二维码,手机扫码可以直接跳转。
/

