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

汇编8位LED计数器循环内x值递增实现及INX指令咨询

问题结论

INX指令本身功能是对16位X寄存器执行+1操作,但在你当前的代码逻辑下,完全无法实现x从0到255递增后输出到LED的预期效果,核心问题出在代码逻辑和寄存器选型上。

现有代码的核心错误
  • X寄存器初始化位置错误:你把LDX #0放在了循环标签Again的内部,每次循环跳回Again时都会强制把X重置为0,X的递增结果根本无法跨循环保留。实际运行时X每次只会从0加到1,下一轮循环就被清零,永远不可能累加到255。
  • 寄存器位宽不匹配:你要实现的是8位计数,但X是16位索引寄存器:
    • INX执行的是16位递增,会从0一直加到65535才会溢出回0,不会在255的位置停下
    • STX PTB是16位存储指令,会把X的高8位写入PTB相邻的高地址寄存器,直接篡改其他外设配置,导致端口输出异常
  • 执行顺序不符合需求:当前代码刚把X加载为0就立刻执行STX PTB输出到LED,之后才执行INX递增,输出值永远是0,根本不是等x到255再输出的逻辑。
修正方案

8位计数不要使用16位的X寄存器,直接用8位内存变量或者8位累加器实现即可,8位值递增到255后再加1会自然溢出回0,完全符合你的计数需求。修正后的可运行参考代码(基于68HC11指令集,和你现有代码的指令兼容):

; 常量定义
mycount EQU  $1000  ; 外层延时循环计数变量
x_count EQU  $1001  ; 8位递增计数变量x

; 端口初始化,仅上电执行一次
MOVB #$FF, DDRB     ; 配置端口B所有引脚为输出模式
MOVB #$00, x_count  ; 初始化x计数初值为0,放在循环外避免重复重置

Main:
Again:
  MOVB #$FF, mycount; 加载延时循环初值255
Wait:
  DEC  mycount      ; 延时计数递减
  BNE  Wait         ; 未减到0则循环等待,实现固定时长延时
  INC  x_count      ; 一轮延时结束,8位x值+1,到255后自增自动溢出为0
  MOVB x_count, PTB ; 将当前x值输出到端口B驱动LED
  BRA  Again        ; 进入下一轮计数循环

内容的提问来源于stack exchange,提问作者Ryan Paye

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:54:29