我目前正在摆弄一台LPC2378,它有一个连接了应用程序的主板。风扇上有几个组件,其中2个是风扇和加热器。
如果端口4的位6和7连接到风扇(电机控制器),则以下代码将打开风扇:
FanOn
STMFD r13!,{r0,r5,r14} ; Push r0, r5 and LR
LDR R5, =FIO4PIN ; Address of FIO4PIN
LDR r0, [r5] ; Read current Port4
ORR r0, r0, #0x80
STR r0, [r5] ; Output
LDMFD r13!,{r0,r5,r14} ; Pop r0, r5 and LR
mov pc, r14 ; Put link register back into PC如何重写这段代码来打开连接到端口4的位5的加热器(将位设置为1将打开加热器,将位设置为0将关闭加热器)。
在回答问题后编辑:
;==============================================================================
; Turn Heater On
;==============================================================================
heaterOn
STMFD r13!,{r0,r5,r14} ; Push r0, r5 and LR
LDR R5, =FIO4PIN ; Address of FIO4PIN
LDR r0, [r5] ; Read current Port4
ORR r0, r0, #0x20
STR r0, [r5] ; Output
LDMFD r13!,{r0,r5,r14} ; Pop r0, r5 and LR
mov pc, r14 ; Put link register back into PC
;==============================================================================
; Turn The Heater Off
;==============================================================================
heaterOff
STMFD r13!,{r0,r5,r14} ; Push r0, r5 and LR
LDR R5, =FIO4PIN ; Address of FIO4PIN
LDR r0, [r5] ; Read current Port4
AND r0, r0, #0xDF
STR r0, [r5] ; Output
LDMFD r13!,{r0,r5,r14} ; Pop r0, r5 and LR
mov pc, r14 ; Put link register back into PC 发布于 2012-05-15 16:40:00
就我所理解的代码而言,风扇只连接到位7(如果位从0开始)。
下面这行代码负责打开风扇位:
ORR r0, r0, #0x80您正在将“掩码”中为1的所有位都设置为1。由于掩码是0x80,即二进制形式的1000 0000,因此它只打开位7。
现在,如果您需要打开加热器而不是风扇,并且您必须设置位5而不是7(在同一端口上),您只需更改该行中的掩码。新的掩码应该是0010 0000二进制,即十六进制的0x20,所以新的代码应该是:
ORR r0, r0, #0x20此外,如果您想在以后某个时刻关闭加热器,只需取消设置位5,通过与掩码and进行and操作,该掩码在除第5位以外的所有位置都具有1。如果表示逐位and的助记符为BIC,则该行将为:
BIC r0, r0, 0xDF现在,我已经几个月没有做任何汇编了,但是如果我没有弄错的话,你给出的代码片段实际上是一个子例程。您可以使用类似于FanOn地址的call从您的主要功能调用它。而且,在我看来,这个子例程在某种程度上很好,它保留了它使用的所有寄存器,例如,它将它们推入第一行的堆栈中,并在最后恢复它们。
因此,要重用代码,您可以只编写一个新的子例程来打开加热器,如果需要,还可以编写一个用于关闭每个东西的子例程,并且只更改每个东西的标签/子例程名称,例如FanOff、HeaterOn……
因为它们都保存了所有的寄存器,所以你可以不用担心地按顺序使用它们。
发布于 2012-05-15 16:39:51
ORR指令开启一位,#0x80常量决定位(在这种情况下,仅开启位7)。要关闭该位,您将需要一个AND指令并计算适当的掩码(例如,要关闭位7,您需要and常量#0x7F)。位5的适当常量为#0x20和#0xDF。
https://stackoverflow.com/questions/10596917
复制相似问题