我已经学习了一段时间,而且我刚开始学习汇编程序。
我有这个问题:当按下开关s1和s2时,更改上面的代码以打开LED 1和LED 2(否则关闭两个LED)(4标记)
以下是代码:
; CONFIGURE PORTS FOR INPUT AND OUTPUT
bis.b #0x01,&P1DIR ; set P1.0 as output
bic.b #0x40,&P2DIR ; set P2.6 as input
bis.b #0x40,&P2REN ; enable pullup for P2.6
bis.b #0x40,&P2OUT ; enable pullup for P2.6
sw_check: bit.b #0x40,&P2IN ; check if switch is pressed
jnz led_off ; if so jump to led_off
; else
bis.b #0x01,&P1OUT ; turn on LED 1
jmp continue
led_off: bic.b #0x01,&P1OUT ; turn off LED 1
continue: jmp sw_check
nop
我知道如何用C语言来解决这个问题,但是在汇编语言中,我不太确定。如果你看这一行:
sw_check: bit.b #0x40,&P2IN ; check if switch is pressed
要检查是否在C中按下了sw1和sw2,我只想放置if(P2IN& BIT6 + BIT7)。在汇编程序中编写它的等效方法是什么?
答案 0 :(得分:2)
这看起来像msp430代码,但这真的不相关,直到你进入最终实现。似乎是斗争与此无关。
在C /伪代码中,如果你想测试一下你和它然后比较相等
if((0x40&P1IN)==0) then
if((0x40&P1IN)!=0) then
如果你想测试两位,那么第一个显而易见的方法是
if(((0x40&P1IN)!=0)&&((0x80&P1IN)!=0)) then
(这有竞争条件,我们在不同时间对P1IN进行采样,因此这不是一个好的解决方案)
但是我们知道这只意味着我们想要同时设置位0x40和0x80,所以我们想知道我们是否在这两位上看到0xC0 我们可以
if((P1IN&0xC0)==0xC0) then
现在它成为指令集依赖,你必须小心你不想要比赛条件的时间,所以你必须做几个步骤
A = P1IN&0xC0;
if(A==0xC0) then
将其翻译成指令集。除了为了娱乐或教育目的而极度减少之外,指令集将具有AND指令,您可能必须首先从P1IN地址加载/读取/移动到寄存器或存储器中然后隔离感兴趣的位然后比较特定的测试,包括on,on,one,特别是另一个特别关闭等等。
当然" off" " on"可以是零或一个取决于,可以让开关在按下时将输入拉高,使其作为一个读取,或者可以让它在按下时将开关拉低,使其读为一个,因此按下可能为零,如果就是这里的情况让它更简单
if(P1IN&0xC0)==0) then.
会检查是否"按下"