A10基于51单片机汇编四按键控制LED的Proteus设计
作者:单片机仿真   类别:51单片机仿真    日期:2026-10-13 12:08:04    阅读:11 次   消耗积分:5 分

image.png

A10基于51单片机汇编四按键控制LED的Proteus设计

一、设计任务

使用51单片机设计一个四按键控制LED。

1、使用汇编语言设计。

2、使用4个按键控制4个LED。

3、每个按键对应一个LED,当按键按下的时候对应的LED点亮,按键断开的时候LED熄灭。

四条指令搞定四路独立开关,这个设计是理解51单片机口线复用和位运算的经典案例。

二、仿真演示

仿真运行效果

仿真里四个按键分别对应四个LED,按哪个亮哪个,松手就灭,互不干扰。

程序在Keil里用汇编编写,编译生成hex后加载到Proteus的51芯片里运行。工程截图如下:

Keil工程截图

实物效果:

实物演示

三、关于程序

全部程序只有四条指令:

`
START: MOV A,P1 ;读取P1口数据
SWAP A ;交换A中高四位与低四位的位置
ORL A,#0F0H ;与0F0H相或
MOV P1,A ;将开关状态送LED显示
SJMP START
`

1、硬件接法:一个口两用

P1口的8条线被分成两半使用:

口线接什么方向
P1.0~P1.34个按键(另一端接地)输入
P1.4~P1.74个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态1110P1.0被接地,读回0
SWAP后1110原LED态按键态搬到高位
ORL后11101111低位全置1
输出到P1P1.4=0→亮全1第一个LED亮

4、为什么不用消抖

和A07的台灯一样,这里没有软件消抖。但对这个设计影响很小:按键抖动只有几毫秒,期间对应LED也只是微闪,肉眼看不出来。如果哪天要做"按一次加一分"的计数器,就必须加消抖。

特别注意: 如果按某个键亮的是另一个LED,检查按键和LED的口线对应关系;如果亮灭相反,把LED改成共阴极接法,或输出前对高4位取反。

四、特别注意

特别注意: 仿真跑起来灯不亮,先检查压缩包是否解压完整;Proteus用7.8或8.6版本;改了汇编源码要重新编译生成hex再跑仿真。

五、资料下载

付费后获取下载链接,直接下载到电脑上,然后解压即可!每个链接前面都配了二维码,手机扫码可以直接跳转。

/

版权所有,转载本站文章请注明出处:proteus单片机
上一篇:A09基于51单片机汇编LED流水灯Proteus设计
下一篇:A11基于51单片机汇编语言LED循环显示Proteus设计
${comment['nickname']}   ${comment['createtime']}
  
       
${comment.content}
${reply.nickname} 回复 ${comment.nickname}    ${reply.createtime}
     
  
回复内容:${reply.content}