3

我目前正在使用连接了应用板的 LPC 2378。风扇上有几个组件,其中两个是风扇和加热器。

如果端口 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   
4

2 回答 2

1

ORR指令打开一点,#0x80常数确定位(在这种情况下,只有位 7 被打开)。要关闭该位,您将需要一个 AND 指令并计算适当的掩码(例如,要关闭位 7,您将与常量#0x7F 进行与)。位 5 的适当常数是#0x20#0xDF

于 2012-05-15T08:39:50.937 回答
1

据我了解代码,风扇仅连接到第 7 位(如果位从 0 开始计算)。

以下行负责打开风扇位:

ORR r0, r0, #0x80

您将“掩码”中为 1 的所有位设置为 1。由于掩码是0x80,即1000 0000二进制,它只打开第 7 位。

现在,如果您需要打开加热器而不是风扇,并且您必须设置位 5 而不是 7(在同一端口上),您只需更改该行中的掩码。新掩码应该是0010 0000二进制的,即0x20六进制,所以新代码应该是:

ORR r0, r0, #0x20

此外,如果您想稍后关闭加热器,您可以通过仅取消设置第 5 位来实现,方法是使用除第 5 位之外的所有位置都为 1 的掩码进行与运算。如果按位和的助记符是BIC,则该行将是:

BIC r0, r0, 0xDF

现在,我已经好几个月没有进行任何组装了,但如果我没记错的话,你提供的代码片段实际上是一个子例程。你可以从你的主要功能中调用它,比如call地址FanOn。而且,对我来说,似乎子程序很好,因为它保留了它使用的所有寄存器,例如它在第一行将它们推送到堆栈并最终恢复它们。

因此,要重用代码,您可以编写一个新的子程序来打开加热器,如果您愿意,可以编写一个新的子程序来关闭每个东西,并且只更改每个子程序的标签/子程序名称,例如FanOffHeaterOn...

由于它们都保留了所有寄存器,因此您可以按顺序使用它们而无需担心。

于 2012-05-15T08:40:00.193 回答