
A10基于51单片机汇编四按键控制LED的Proteus设计
一、设计任务
使用51单片机设计一个四按键控制LED。
1、使用汇编语言设计。
2、使用4个按键控制4个LED。
3、每个按键对应一个LED,当按键按下的时候对应的LED点亮,按键断开的时候LED熄灭。
四条指令搞定四路独立开关,这个设计是理解51单片机口线复用和位运算的经典案例。
二、仿真演示

仿真里四个按键分别对应四个LED,按哪个亮哪个,松手就灭,互不干扰。
程序在Keil里用汇编编写,编译生成hex后加载到Proteus的51芯片里运行。工程截图如下:

实物效果:

三、关于程序
全部程序只有四条指令:
`
START: MOV A,P1 ;读取P1口数据
SWAP A ;交换A中高四位与低四位的位置
ORL A,#0F0H ;与0F0H相或
MOV P1,A ;将开关状态送LED显示
SJMP START`
1、硬件接法:一个口两用
P1口的8条线被分成两半使用:
| 口线 | 接什么 | 方向 |
| P1.0~P1.3 | 4个按键(另一端接地) | 输入 |
| P1.4~P1.7 | 4个LED | 输出 |
按键和LED一一对应:P1.0对P1.4,P1.1对P1.5,P1.2对P1.6,P1.3对P1.7。
2、四条指令各自做了什么
第一步 MOV A,P1:把P1口8条线的状态整体读进来,低4位是按键、高4位是上一次输出的LED状态。
第二步 SWAP A:高低4位原地交换。交换后按键状态搬到了高4位,正好落在LED该在的位置上——这就是"按哪个亮哪个"的位置对应,不用查表也不用判断。
第三步 ORL A,#0F0H:高4位保持按键状态不动,低4位全部置1。这步有两个作用:把原来的LED状态清掉避免干扰;给按键脚一个高电平当上拉源,下一步读回来时没按的键是1、按下的键是0。
第四步 MOV P1,A:高4位(按键状态)送到LED,低4位(全1)送到按键脚。
然后SJMP START无限循环,每圈几微秒,四路开关实时响应。
3、一步一态对照表
以"按下接P1.0的第一个按键"为例:
| 步骤 | 高4位 | 低4位 | 说明 |
| 读入P1 | 原LED态 | 1110 | P1.0被接地,读回0 |
| SWAP后 | 1110 | 原LED态 | 按键态搬到高位 |
| ORL后 | 1110 | 1111 | 低位全置1 |
| 输出到P1 | P1.4=0→亮 | 全1 | 第一个LED亮 |
4、为什么不用消抖
和A07的台灯一样,这里没有软件消抖。但对这个设计影响很小:按键抖动只有几毫秒,期间对应LED也只是微闪,肉眼看不出来。如果哪天要做"按一次加一分"的计数器,就必须加消抖。
特别注意: 如果按某个键亮的是另一个LED,检查按键和LED的口线对应关系;如果亮灭相反,把LED改成共阴极接法,或输出前对高4位取反。
四、特别注意
特别注意: 仿真跑起来灯不亮,先检查压缩包是否解压完整;Proteus用7.8或8.6版本;改了汇编源码要重新编译生成hex再跑仿真。
五、资料下载
付费后获取下载链接,直接下载到电脑上,然后解压即可!每个链接前面都配了二维码,手机扫码可以直接跳转。
/

