鱼C论坛

 找回密码
 立即注册
查看: 688|回复: 1

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

[复制链接]
发表于 2023-12-21 10:39:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 yuanyuxixue 于 2023-12-23 12:48 编辑

大佬们救救命
要求如下:
使用proteus画出图
基于8086芯片实现
按键要求能够实现对二极管的点亮与熄灭的控制,用S1~S4组成的键盘分别控制4个发光二极管的点亮,S5按键来熄灭各二极管,按键具有防抖动功能。
例如:S1点亮1号灯,按S5可以将其熄灭。S2点亮2号灯,按S5可以将其熄灭。
请大神改一下代码,简洁一些。


图片网址:

                               
登录/注册后可看大图



代码如下:
DATA  SEGMENT
        
        ;U1
        IOCON         EQU 8006H          ;
        IOA      EQU 8000H          ;
        IOB      EQU 8002H          ;
        IOC      EQU 8004H            ;

        
        X0      DB  0FEH
        X1      DB  0FDH
        X2      DB  0FBH
        X3      DB  0F7H
        
        X4      DB  0EFH
        X5      DB  0DFH
        X6      DB  0BFH
        X7      DB  07FH
        
        DISPLAY DB  6FH,7FH,07H,7DH,6DH,66H,4FH,5BH,06H
        DATA    ENDS
        CODE    SEGMENT
        ASSUME  CS: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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 MAINLOOPLED2_ON:    MOV AL, 00000010B       ; 将AL寄存器置为00000010B    OUT PORT_B, AL          ; 向PORT_B端口写入数据    JMP MAINLOOPLED3_ON:    MOV AL, 00000100B       ; 将AL寄存器置为00000100B    OUT PORT_B, AL          ; 向PORT_B端口写入数据    JMP MAINLOOPLED4_ON:    MOV AL, 00001000B       ; 将AL寄存器置为00001000B    OUT PORT_B, AL          ; 向PORT_B端口写入数据    JMP MAINLOOPRESET:    MOV AL, 00000000B       ; 将AL寄存器置为00000000B    OUT PORT_B, AL          ; 向PORT_B端口写入数据    JMP MAINLOOP.END
请注意,这只是一个示例代码,具体的端口和引脚配置可能与你的实际硬件连接有所不同。你需要根据你的硬件情况进行相应的修改。此外,这段代码并未包含防抖动功能的实现,你可以根据具体需求进行进一步的优化。希望对你有所帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 19:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表