奪萃u 2024-05-18 10:42 采纳率: 0%
浏览 5

求牢大,汇编语言控制单片机LED反向递增亮灯

这个是依次从P1.0指向P1.7方向通过累加器递增亮灯,现在要反过来从1.7向1.0递增亮灯,求牢大解答

        ORG 0000H       ; 设置程序存储起始地址为0000H
        AJMP MAIN       ; 绝对跳转到标签MAIN
        ORG 0030H       ; 设置程序存储起始地址为0030H
MAIN:                      ; 主程序开始
        MOV A, #0FFH    ; 将255(十六进制的FF)加载到累加器A
        MOV P1, A       ; 将累加器A的值移动到端口P1
        SETB P3.3       ; 设置P3.3为高电平(1)
LOOP:                   ; 循环开始
        INC A           ; 累加器A的值加1
SHOW:                   ; 显示标签
        JNB P3.3, INCR  ; 如果P3.3不是0,则跳转到INCR
        JMP SHOW        ; 无条件跳回SHOW
INCR:                   ; INCR标签
        JNB P3.3, INCR  ; 如果P3.3是0,则保持在INCR
        MOV P1, A       ; 将累加器A的值移动到端口P1
        LCALL DELAY     ; 调用延迟子程序
        JMP LOOP        ; 跳回LOOP开始新的循环

DELAY:                  ; 延迟子程序
        MOV R4, #250    ; 将250加载到寄存器R4
D2:                     ; D2标签
        MOV R5, #250    ; 将250加载到寄存器R5
        DJNZ R5, $      ; R5减1,如果不为0则跳转到当前位置
        DJNZ R4, D2     ; R4减1,如果不为0则跳转到D2
        RET             ; 从子程序返回
END                     ; 程序结束    

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2024-05-18 10:42
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    【您想要解决的问题】: 您提问的目的是要修改现有的汇编语言程序,使得单片机控制的LED灯能够从P1.7向P1.0方向反向递增亮起,而不是当前的从P1.0向P1.7方向。

    【问题出现原因】: 当前程序通过累加器A的值来控制P1端口的LED灯,累加器A的初始值是0xFF(即二进制的11111111),然后通过INC A指令递增,使得LED灯依次亮起。要实现反向亮起,需要调整累加器A的初始值和递增逻辑,以确保LED灯从P1.7开始亮起。

    【问题解决方案】: 要实现LED灯从P1.7向P1.0方向递增亮起,可以采取以下步骤:

    1. 将累加器A的初始值设置为0xFE(二进制的11111110),这样P1.7位为1,其他位为0。
    2. 修改INC A指令后的逻辑,确保当累加器A的值达到0x00(所有LED灯都熄灭)时,能够循环回到0xFE。

    【提供代码】: 以下是修改后的代码:

    ORG 0000H       ; 设置程序存储起始地址为0000H
        AJMP MAIN       ; 绝对跳转到标签MAIN
    ORG 0030H       ; 设置程序存储起始地址为0030H
    MAIN:          			; 主程序开始
        MOV A, #0FEH    ; 将254(十六进制的FE)加载到累加器A,P1.7亮起
        MOV P1, A       ; 将累加器A的值移动到端口P1
        SETB P3.3       ; 设置P3.3为高电平(1)
    LOOP:           		; 循环开始
        INC A           ; 累加器A的值加1
        JZ RESET       ; 如果累加器A的值变为0,则跳转到RESET
        SHOW:          ; 显示标签
        JNZ P3.3, INCR  ; 如果P3.3不是0,则跳转到INCR
        JMP SHOW        ; 无条件跳回SHOW
    INCR:           		; INCR标签
        JNB P3.3, INCR  ; 如果P3.3是0,则保持在INCR
        MOV P1, A       ; 将累加器A的值移动到端口P1
        LCALL DELAY     ; 调用延迟子程序
        JMP LOOP        ; 跳回LOOP开始新的循环
    RESET:          ; RESET标签
        MOV A, #0FEH   ; 重置累加器A的值为254
        JMP SHOW       ; 跳回显示标签继续循环
    
    DELAY:          		; 延迟子程序
        MOV R4, #250    ; 将250加载到寄存器R4
    D2:             		; D2标签
        MOV R5, #250    ; 将250加载到寄存器R5
        DJNZ R5, $      ; R5减1,如果不为0则跳转到当前位置
        DJNZ R4, D2     ; R4减1,如果不为0则跳转到D2
        RET             ; 从子程序返回
    END             		; 程序结束
    

    【代码运行方式】:

    • 将上述代码烧录到51单片机中。
    • 确保P1端口连接到LED灯。
    • 使用仿真软件如Proteus进行测试,或者直接在硬件上运行。

    【代码预期运行结果】:

    • LED灯将从P1.7开始,依次反向点亮到P1.0,然后循环。

    【推荐相关链接】:

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 5月18日
  • 修改了问题 5月18日
  • 创建了问题 5月18日

悬赏问题

  • ¥15 asp写PC网站开通了微信支付,扫码付款不能跳转
  • ¥50 AI大模型精调(百度千帆、飞浆)
  • ¥15 关于#c语言#的问题:我在vscode和codeblocks中编写c语言时出现打不开源文件该怎么办
  • ¥15 非科班怎么跑代码?如何导数据和调参
  • ¥15 福州市的全人群死因监测点死亡原因报表
  • ¥15 Altair EDEM中生成一个颗粒,并且各个方向没有初始速度
  • ¥15 系统2008r2 装机配置推荐一下
  • ¥500 服务器搭建cisco AnyConnect vpn
  • ¥15 悬赏Python-playwright部署在centos7上
  • ¥15 psoc creator软件有没有人能远程安装啊