汇编:按键控制发光二极管
本帖最后由 yuanyuxixue 于 2023-12-23 12:48 编辑大佬们救救命
要求如下:
使用proteus画出图
基于8086芯片实现
按键要求能够实现对二极管的点亮与熄灭的控制,用S1~S4组成的键盘分别控制4个发光二极管的点亮,S5按键来熄灭各二极管,按键具有防抖动功能。
例如:S1点亮1号灯,按S5可以将其熄灭。S2点亮2号灯,按S5可以将其熄灭。
请大神改一下代码,简洁一些。
图片网址:https://i.postimg.cc/3w82SwX2/32233.png
代码如下:
DATASEGMENT
;U1
IOCON EQU 8006H ;
IOA EQU 8000H ;
IOB EQU 8002H ;
IOC EQU 8004H ;
X0 DB0FEH
X1 DB0FDH
X2 DB0FBH
X3 DB0F7H
X4 DB0EFH
X5 DB0DFH
X6 DB0BFH
X7 DB07FH
DISPLAY DB6FH,7FH,07H,7DH,6DH,66H,4FH,5BH,06H
DATA ENDS
CODE SEGMENT
ASSUMECS:CODE,DS:DATA
START:MOV BX,OFFSET DISPLAY;
MOV AL,80H ;
MOV DX,IOCON
OUT DX,AL
MOV DX,IOC ;
MOV AL,0FFH
OUT DX,AL
MOV DX,IOA ;
MOV AL,0FFH
OUT DX,AL
MOV AL,0FFH ;
MOV DX,IOB
OUT DX,AL
MOV CX,9 ;
TIMER:
MOV DX,IOC ;
IN AL,DX ;
CMP AL,X0 ;
JE LED0
CMP AL,X1 ;
JE LED1
CMP AL,X2 ;
JE LED2
CMP AL,X3 ;
JE LED3
CMP AL,X4 ;
JE LED4
CMP AL,X5 ;
JE LED5
CMP AL,X6 ;
JE LED6
CMP AL,X7 ;
JE LED7
INC BX ;
DEC CX ;
JZ TIMER ;
CALL DELAY1 ;
JMP TIMER
LED0: MOV AL,X0
MOV DX,IOB
OUT DX,AL
JMP STOP
LED1: MOV AL,X1
MOV DX,IOB
OUT DX,AL
JMP STOP
LED2: MOV AL,X2
MOV DX,IOB
OUT DX,AL
JMP STOP
LED3: MOV AL,X3
MOV DX,IOB
OUT DX,AL
JMP STOP
LED4: MOV AL,X4
MOV DX,IOB
OUT DX,AL
JMP STOP
LED5: MOV AL,X5
MOV DX,IOB
OUT DX,AL
JMP STOP
LED6: MOV AL,X6
MOV DX,IOB
OUT DX,AL
JMP STOP
LED7: MOV AL,X7
MOV DX,IOB
OUT DX,AL
JMP STOP
STOP: MOV DX,IOA
IN AL,DX
CMP AL,X1
JE START
JMP STOP
DELAY1:
PUSH AX
PUSH CX
MOV CX,0004H
DELY2:
CALL DELAY2
LOOP DELY2
POP CX
POP AX
RET
DELAY2:
PUSH CX
MOV CX,0f000H
;--------------------------------------;
MOV DX,IOC ;
IN AL,DX ;
CMP AL,X0 ;
JE LED0
CMP AL,X1 ;
JE LED1
CMP AL,X2 ;
JE LED2
CMP AL,X3 ;
JE LED3
CMP AL,X4 ;
JE LED4
CMP AL,X5 ;
JE LED5
CMP AL,X6 ;
JE LED6
CMP AL,X7 ;
JE LED7
;--------------------------------------;
DELA1:
LOOP DELA1
POP CX
RET
ENDLESS:
JMP ENDLESS
CODE ENDS
END START
你好!根据你的描述,你可以使用汇编语言来实现按键控制发光二极管的功能。下面是一个示例代码,你可以在DOSBox中运行:
.MODEL SMALL
.DATA
PORT_A EQU 0x03C8 ; IO端口A地址
PORT_B EQU 0x03C9 ; IO端口B地址
.CODE
.STARTUP
MOV AL, 11110000B ; 设置IO口A引脚1-4为输出,引脚5-8为输入
OUT PORT_A, AL ; 向PORT_A端口写入控制字节
MAINLOOP:
IN AL, PORT_A ; 从PORT_A端口读取数据到AL寄存器
AND AL, 00001111B ; 将AL寄存器的高四位清零,只保留低四位
CMP AL, 00001111B ; 检查S5按键
JE RESET ; 如果S5按下,跳转到RESET标签
CMP AL, 00000001B ; 检查S1按键
JE LED1_ON ; 如果S1按下,跳转到LED1_ON标签
CMP AL, 00000010B ; 检查S2按键
JE LED2_ON ; 如果S2按下,跳转到LED2_ON标签
CMP AL, 00000100B ; 检查S3按键
JE LED3_ON ; 如果S3按下,跳转到LED3_ON标签
CMP AL, 00001000B ; 检查S4按键
JE LED4_ON ; 如果S4按下,跳转到LED4_ON标签
JMP MAINLOOP ; 如果没有按键按下,继续循环
LED1_ON:
MOV AL, 00000001B ; 将AL寄存器置为00000001B
OUT PORT_B, AL ; 向PORT_B端口写入数据
JMP MAINLOOP
LED2_ON:
MOV AL, 00000010B ; 将AL寄存器置为00000010B
OUT PORT_B, AL ; 向PORT_B端口写入数据
JMP MAINLOOP
LED3_ON:
MOV AL, 00000100B ; 将AL寄存器置为00000100B
OUT PORT_B, AL ; 向PORT_B端口写入数据
JMP MAINLOOP
LED4_ON:
MOV AL, 00001000B ; 将AL寄存器置为00001000B
OUT PORT_B, AL ; 向PORT_B端口写入数据
JMP MAINLOOP
RESET:
MOV AL, 00000000B ; 将AL寄存器置为00000000B
OUT PORT_B, AL ; 向PORT_B端口写入数据
JMP MAINLOOP
.END
请注意,这只是一个示例代码,具体的端口和引脚配置可能与你的实际硬件连接有所不同。你需要根据你的硬件情况进行相应的修改。此外,这段代码并未包含防抖动功能的实现,你可以根据具体需求进行进一步的优化。希望对你有所帮助!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]