利用单片机AT89S52、7个按键以及3个LED指示灯组成I/O控制实验系统。P0.0-P0.7与8个开关键相连,P1.0~P1.2与3个LED灯相连;利用按键控制LED指示灯亮与灭,完成如下功能: 1.当P0.1开关键被按下时,P1.0~P1.2灯的状态依次为灭灭亮,即1的二进制状态001; 2.以此类推,当P0.7开关键被按下时,P1.0~P1.2灯的状态依次为亮亮亮,即7的二进制状态111;使用汇编语言
时间: 2023-12-09 11:02:36 浏览: 188
非常感谢您的问题。下面是关于利用单片机AT89S52、7个按键以及3个LED指示灯组成I/O控制实验系统的汇编语言代码:
```
ORG 0H ; 程序的起始地址
MOV P1, #00000000B ; 将P1口初始化为000,即3个LED全灭
START:
MOV A, P0 ; 将P0口的状态读入累加器A中
CJNE A, #01H, CHECK_2 ; 当A不为1时,跳转到CHECK_2进行判断
MOV P1, #00000001B ; 当P0.1按键被按下时,将P1口的状态设为001,即P1.0亮,P1.1和P1.2灭
SJMP WAIT ; 执行完毕后跳转到WAIT等待按键释放
CHECK_2:
CJNE A, #02H, CHECK_3 ; 当A不为2时,跳转到CHECK_3进行判断
MOV P1, #00000010B ; 当P0.2按键被按下时,将P1口的状态设为010,即P1.1亮,P1.0和P1.2灭
SJMP WAIT ; 执行完毕后跳转到WAIT等待按键释放
CHECK_3:
CJNE A, #03H, CHECK_4 ; 当A不为3时,跳转到CHECK_4进行判断
MOV P1, #00000100B ; 当P0.3按键被按下时,将P1口的状态设为100,即P1.2亮,P1.0和P1.1灭
SJMP WAIT ; 执行完毕后跳转到WAIT等待按键释放
CHECK_4:
CJNE A, #04H, CHECK_5 ; 当A不为4时,跳转到CHECK_5进行判断
MOV P1, #00000011B ; 当P0.4按键被按下时,将P1口的状态设为011,即P1.0和P1.1亮,P1.2灭
SJMP WAIT ; 执行完毕后跳转到WAIT等待按键释放
CHECK_5:
CJNE A, #05H, CHECK_6 ; 当A不为5时,跳转到CHECK_6进行判断
MOV P1, #00000101B ; 当P0.5按键被按下时,将P1口的状态设为101,即P1.0和P1.2亮,P1.1灭
SJMP WAIT ; 执行完毕后跳转到WAIT等待按键释放
CHECK_6:
CJNE A, #06H, CHECK_7 ; 当A不为6时,跳转到CHECK_7进行判断
MOV P1, #00000110B ; 当P0.6按键被按下时,将P1口的状态设为110,即P1.1和P1.2亮,P1.0灭
SJMP WAIT ; 执行完毕后跳转到WAIT等待按键释放
CHECK_7:
CJNE A, #07H, WAIT ; 当A不为7时,跳转到WAIT等待按键释放
MOV P1, #00000111B ; 当P0.7按键被按下时,将P1口的状态设为111,即3个LED全亮
SJMP WAIT ; 执行完毕后跳转到WAIT等待按键释放
WAIT:
ACALL DELAY ; 调用延时函数DELAY
MOV A, P0 ; 将P0口的状态读入累加器A中
CJNE A, #00H, WAIT ; 当P0口的状态不为0时,说明按键仍未释放,跳转到WAIT继续等待
SJMP START ; 当按键已经释放时,跳转到START重新开始
DELAY:
MOV R0, #100 ; 将R0寄存器的值设为100
AGAIN:
DJNZ R0, AGAIN ; 当R0寄存器的值减至0时,跳出循环
RET ; 返回主程序
END ; 程序结束
```
希望这个代码能够帮助到您。如果您还有其他问题,请随时提出。
阅读全文