yuanyuxixue 发表于 2023-12-21 10:39:15

汇编:按键控制发光二极管

本帖最后由 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

FishC 发表于 2023-12-21 10:39:32

你好!根据你的描述,你可以使用汇编语言来实现按键控制发光二极管的功能。下面是一个示例代码,你可以在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]
查看完整版本: 汇编:按键控制发光二极管