i have a practice problem where we have to create an assembly language program.
ID: 3881549 • Letter: I
Question
i have a practice problem where we have to create an assembly language program. This involves setting up a DIP switch and then to activate the LEDs on the Dragon 12 light board. The problem I am having is to implement the instruction where I have to set up switch 1 and 8. Can you provide an example of the instructions using the Code Warrior shell text (see below) as a guideline?
I use the HCS12 Microcontrollers and Embedded Systems as a reference.
1. When both DIP switches #8 and #1 are high, turn on all LEDs.
2. When both DIP switches #8 and #1 are low, turn off all LEDs
3. When DIP switch #8 is high and #1 is low, turn on all the even numbered LEDs.
4. When DIP switch #1 is high and #8 is low, turn on all the odd numbered LEDs.
5. Your program must to read DIP switches and turn on/off corresponding LRDs continuously until a Reset.
Explanation / Answer
START: CPL P1.0
ACALL WAIT
SJMP START
WAIT: MOV R4,#05H
WAIT1: MOV R3,#00H
WAIT2: MOV R2,#00H
WAIT3: DJNZ R2,WAIT3
DJNZ R3,WAIT2
DJNZ R4,WAIT1
RET
START: CPL P1.0
ACALL WAIT
CPL P1.0
CPL P1.1
ACALL WAIT
CPL P1.1
SJMP START
WAIT: MOV R4,#05H
WAIT1: MOV R3,#00H
WAIT2: MOV R2,#00H
WAIT3: DJNZ R2,WAIT3
DJNZ R3,WAIT2
DJNZ R4,WAIT1
RET
; 5s_delay.asm 5 second delay timer for DRAGON12 Rev. E board
; (c)2002, EVBplus.com, written by Wayne Chu
;
; Function: 5 second delay routine using output comparator 6
; The PB0 LED will be turned on immediately after running
; this program. It will be turned off after 5 second delay.
; Change the DELAY_TIME to 36000 will delay 3 minutes.
PB0: equ 1
DB6: equ $40
;
TB1MS: equ 24000 ; 1ms time base of 24,000 instruction cycles
; ; 24,000 x 1/24MHz = 1ms at 24 MHz bus speed
;DELAY_TIME: equ 36000 ; 36000 X 5 ms= 180 sec = 3 min
DELAY_TIME: equ 5000 ; 5000 X 1 ms= 5 sec
REGBLK: equ $0
#include reg9s12.h ; include register equates
org $1000
;
flag_5s: rmb 1
cnt_5s: rmb 2
STACK: equ $2000
org $2000
start:
lds #STACK
ldx #timer6
stx $3E62 ; initialize the int vetctor
ldx #REGBLK
ldaa #$ff
staa ddrb,x ; make port B an output port
staa ddrp,x ; make port P an output port
staa ptp,x ; turn off 7-segment LED display
staa ddrj,x ; make port J an output port
clr ptj,x ; make PJ1 low to enable LEDs
ldaa #$80
staa tscr,x ; enable timer
ldaa #DB6
staa tios,x ; select t6 as an output compare
staa tmsk1,x
cli
bset portb,x PB0 ; turn on LED PB0
jsr delay_5s
bclr portb,x PB0 ; turn off LED PB0
stp: jmp stp
delay_5s:
clr cnt_5s
clr cnt_5s+1
clr flag_5s
delay: ldaa flag_5s
beq delay
rts
timer6:
ldx cnt_5s
inx
stx cnt_5s
cpx #DELAY_TIME
bne tmr6
clr cnt_5s
clr cnt_5s+1
ldaa #1
staa flag_5s
rti
tmr6: ldx #REGBLK
ldd #TB1MS ; reload the count for 1 ms time base
addd tc6,x
std tc6,x
ldaa #DB6
staa tflg1,x ; clear flag
rti
org $3E62
fdb timer6
end
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.