You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ARM汇编家庭安防系统:错误分支退出与代码续行问题咨询

ARM家庭安防系统汇编代码问题:错误PIN处理与流程优化

我用ARM汇编开发家庭安防系统,系统由开关启用,激活后进入运动检测状态,要求用户输入指定按键序列:

  • 输入错误时,红色LED亮起
  • 输入正确时,绿色LED闪烁一次,白色LED常亮

现在卡在错误PIN输入的处理部分,当前wrong分支代码如下:

wrong
        MOV R6, #0x01; wrong key

想知道如何退出wrong分支并继续执行后续代码,同时希望得到实现思路的正确性建议。完整代码如下:

area Final, code, readonly
        export __main
__main  proc
    
    LDR R0,=0x40004C21 ;port 4 inputs
    LDR R1,=0x40004C40 ;port 5 outputs
    
    MOV R2, #0x00 ; all pin as input in DDIR
    STRB R2, [R0, #0x04]; 
    MOV R2, #0xFF ;all input pins as ren enabled
    STRB R2, [R0, #0x06]; 
    MOV R2, #0xFF ;all input pins as pullup
    STRB R2, [R0, #0x02]; 
    
    MOV R3, #0xFF ; all pin as output in DDIR
    STRB R3, [R1, #0x04]; port 5 is all outputs
    
repeat  
enable  LDRB R2, [R0, #0x00] ;load input regsiter
        AND R4,R2,#0x01 ; check if pin 0 is enabled 
        CMP R4, #0x00
        BEQ motion
        
motion  LDRB R2, [R0, #0x00] ;load input regsiter
        AND R4,R2,#0x02 ; check if pin 1 is enabled 
        CMP R4, #0x00
        MOV R5, #0x05; 5 attempts for user
        BEQ keys
        
keys        
        ;key1   
        LDRB R2, [R0, #0x00] ;load input regsiter
        AND R4,R2,#0x08 ; check if pin 3 is enabled 
        CMP R4, #0x00
        BNE wrong
                
        ;key2    
        LDRB R2, [R0, #0x00] ; Load input register
        AND R4, R2, #0x20    ; Check if pin 5 is enabled
        CMP R4, #0x00
        BNE wrong

        ;key3    
        LDRB R2, [R0, #0x00] ; Load input register
        AND R4, R2, #0x04    ; Check if pin 2 is enabled 
        CMP R4, #0x00
        BNE wrong

        ;key4    
        LDRB R2, [R0, #0x00] ; Load input register
        AND R4, R2, #0x20    ; Check if pin 5 is enabled 
        CMP R4, #0x00
        BNE wrong

        ;key5    
        LDRB R2, [R0, #0x00] ; Load input register
        AND R4, R2, #0x08    ; Check if pin 3 is enabled 
        CMP R4, #0x00
        BNE wrong
        
        ;key6    
        LDRB R2, [R0, #0x00] ; Load input register
        AND R4, R2, #0x10    ; Check if pin 4 is enabled 
        CMP R4, #0x00
        BNE wrong

        ;key7    
        LDRB R2, [R0, #0x00] ; Load input register
        AND R4, R2, #0x10    ; Check if pin 4 is enabled 
        CMP R4, #0x00
        BNE wrong

        ;key8    
        LDRB R2, [R0, #0x00] ; Load input register
        AND R4, R2, #0x08    ; Check if pin 3 is enabled 
        CMP R4, #0x00
        BNE wrong
        
wrong
        MOV R6, #0x01; wrong key
        
        
        ;check for wrong keys
        CMP R6,#0x01
        BEQ wrongseq
        BNE right
        
wrongseq    
        MOV R4,#0x04 ;red light
        STRB R4,[R2, #0x02]
        BL delay1
        SUB R5,R5, #0x01; decrease attempts
        CMP R5,#0x00
        BNE keys
        
        ;used all attempts
        MOV R4,#0x04 ;red light
        STRB R4,[R2, #0x02]
        BL delay2
        
right   ;right sequence
        MOV R4,#0x02 ;green light
        STRB R4,[R2, #0x02]
        BL delay1
        
        MOV R4,#0x01 ;white light
        STRB R4,[R2, #0x02]
        
        B repeat ; loop indefinitely
        
        endp
        end 

问题解决与优化建议

1. 错误分支退出逻辑修复

当前代码进入wrong分支后存在两个核心问题:一是R2被复用导致LED操作地址错误,二是冗余的判断逻辑。直接修改wrong分支,完成错误处理后直接跳转至对应流程即可:

wrong
        ; 点亮红色LED(使用R1作为输出端口基地址,避免地址错误)
        MOV R4,#0x04 ; red light
        STRB R4,[R1, #0x02]
        BL delay1
        SUB R5,R5, #0x01 ; 减少剩余尝试次数
        CMP R5,#0x00
        BNE keys ; 还有尝试机会,回到按键输入流程
        
        ; 所有尝试用完,保持红灯常亮后回到初始状态
        MOV R4,#0x04 ; red light
        STRB R4,[R1, #0x02]
        BL delay2
        B repeat ; 回到系统初始等待状态

修改后,错误分支执行完对应逻辑后,会直接跳回keys重新输入或回到repeat初始状态,无需额外的冗余判断。

2. 现有实现思路的问题与优化点

  • 按键无防抖处理:当前直接读取引脚状态,按键抖动会导致误判,建议在每个按键检测前添加短延迟,或多次读取确认状态
  • 寄存器滥用:R2同时存储输入数据和LED操作地址,容易引发地址错误,建议固定寄存器用途:R0存输入端口基地址,R1存输出端口基地址,R2专门临时存储输入数据
  • 运动检测逻辑缺失:当前motion标签仅读取一次引脚状态,没有持续等待运动触发的逻辑,需添加循环检测直到运动触发:
    motion  
    wait_motion:
            LDRB R2, [R0, #0x00] ; 循环读取输入寄存器
            AND R4,R2,#0x02 ; 检测运动传感器引脚状态
            CMP R4, #0x00
            BNE wait_motion ; 未检测到运动则继续等待
            MOV R5, #0x05; 设置5次尝试机会
            B keys ; 进入按键输入流程
    
  • 按键检测逻辑僵硬:当前仅读取一次引脚状态,没有等待用户按键的逻辑,需在每个按键检测处添加循环,直到对应按键按下。

内容的提问来源于stack exchange,提问作者Boo Man

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 12:57:36