简单回路(读取温度 - MC68HC)

Simple loop (reading temperature - MC68HC)

我正在使用 MC68HC11 阅读与 I/O 相关的章节;这本书展示了一个建议的练习(不是真的很难)但我无法使用汇编来解决它:

我一直在想,我可以通过使用一些基本逻辑来做到这一点(我用 C 和 C++ 编写程序)但是我在尝试用汇编来做时卡住了。

逻辑是这样的:

Loop:

value = ReadSensorValue()

if (value condition 1) // do action else if (value condition 2) // do something end if

go to Loop

可以帮助我解决它但在汇编中使用真正的指令吗?



编辑:

这是一种方法(使用 ASM11)。我知道你正在努力学习,但你没有表现出任何努力。 (这是我做的最后一个,没有先看到你的努力。)

;*******************************************************************************
; MCU specific
;*******************************************************************************

REGS                equ       00               ;register base
PORTB               equ       REGS+            ;port B (output only)
PORTC               equ       REGS+            ;port C
STACKTOP            equ       FF               ;Top of Stack
ROM                 equ       $F800               ;beginning of ROM
Vreset              equ       $FFFE               ;reset vector

;*******************************************************************************
; Application specific
;*******************************************************************************

TEMPERATURE         equ       PORTC               ;temperature is available here

CONTROL             equ       PORTB
HEATER.             equ       1                   ;bit that controls heater
COMPRESSOR.         equ       2                   ;bit that controls cooler

MIN_TEMP            equ       20                  ;min allowed temp in C
MAX_TEMP            equ       22                  ;max allowed temp in C

;*******************************************************************************
                    org       ROM
;*******************************************************************************

;*******************************************************************************
; Purpose: Get temperature as Centigrade degrees
; Input  : None
; Output : A = temperature in whole degrees (fractional part discarded)
; Note(s): Formula is TEMPERATURE*5/10 using integer arithmetic
;        : Simplifies to TEMPERATURE/2

GetTemperature      proc
                    ldaa      TEMPERATURE         ;A = temperature
                    lsra                          ;A = temperature/2
                    adca      #0                  ;(optional) round up
                    rts

;*******************************************************************************

CoolIt              proc
                    pshx
                    ldx       #CONTROL
                    bclr      ,x,HEATER.
                    bset      ,x,COMPRESSOR.
                    pulx
                    rts

;*******************************************************************************

HeatIt              proc
                    pshx
                    ldx       #CONTROL
                    bclr      ,x,COMPRESSOR.
                    bset      ,x,HEATER.
                    pulx
                    rts

;*******************************************************************************

AllOff              proc
                    pshx
                    ldx       #CONTROL
                    bclr      ,x,COMPRESSOR.|HEATER.
                    pulx
                    rts

;*******************************************************************************

Start               proc
                    lds       #STACKTOP
                    bsr       AllOff

Loop@@              bsr       GetTemperature      ;A = temperature in degrees

                    cmpa      #MIN_TEMP           ;if below minimum
                    blo       HeatIt@@            ; go heat it up

                    cmpa      #MAX_TEMP           ;if above maximum
                    bhi       CoolIt@@            ; go cool it down

                    bsr       AllOff              ;if within range turn all off
                    bra       Loop@@              ;go check temperature again

CoolIt@@            bsr       CoolIt
                    bra       Loop@@              ;go check temperature again

HeatIt@@            bsr       HeatIt
                    bra       Loop@@              ;go check temperature again

;*******************************************************************************
                    org       Vreset
                    dw        Start
;*******************************************************************************