工具/软件:Code Composer Studio
大家好,
我正在使用我的MSP430以一个圆圈的方式点亮8个LED。 我希望每个LED依次亮起,然后返回到开头。 我的方法是使用通用寄存器R5 (较低的字节)来存储当前LED。 我稍后会对每个位进行比较,以确定打开哪个LED。
我正在编写两段代码,一段用于增加当前LED,另一段用于减少:
MOV.W #0x01,R5 ;将通用寄存器R5设置为1。 ;------------------ ; 这个主循环无限期地执行 ;------------------ 主要: 无操作 ;主程序 ;BIS.W #LPM0+GEE,SR ;输入带中断的LPM0 JMP ledDown ledUp: RLA.B R5 ;左移R5 (仅前8位) Jnc. 主 ;如果不携带,则跳转,即如果不在LED 8上 MOV.W #0x01,R5 ;如果携带,即LED 8亮起,则返回到1 JMP 主 ;返回 ledDown: RA.B R5 ;右移R5 (仅前8位) Jnc. 主 ;如果不携带,则跳转,即如果不在LED指示灯1上,则跳转 MOV.W #0x80,R5 ;如果携带,即LED指示灯1亮起,则返回到8 JMP 主 返回 ;------------------
ledUp部分按我的预期工作。 当我逐步执行代码时,R5更改如下:
R5 = 0000 0001
R5 = 0000 0010
R5 = 0000 0100
R5 = 0000 1000
R5 = 0001 0000
R5 = 0010 0000
R5 = 0100 0000
R5 = 1000 0000
R5 = 0000 0001
R5 = 0000 0010 等等
但是,当我使用ledDown句段时,我得到以下信息:
R5 = 0000 0001
R5 = 1000 0000
R5 = 1100 0000
R5 = 1110 0000
R5 = 1111 0000
R5 = 1111 1000
R5 = 1111 1100
R5 = 1111 1110
R5 = 1111 1111
R5 = 1000 0000 ,这不是我想要的。
有人能告诉我为什么这是因为我正在努力单独使用数据表来解决问题吗? 当我使用ledDown时,我不知道为什么它会继续生产更多的1,而不是仅仅将现有的1向右移动。 当然,它的行为应该像一个算术/2
我们非常感谢您提供任何解决方案!
