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

