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
相关产品推荐
相关产品推荐

