1.4 Ports Einlesen und Ausgeben
Schalter an PB7..PB0 einlesen und auf LEDs ausgeben

main:
ldr R4,=GPIOB // Schalter
ldr R5,=GPIOC // LEDs
schleife:
ldrb R6,[R4,IDR] // Lade alle Schalter
strb R6,[R5,ODR] // Gib auf LEDs aus
b schleife
Die Werte der Schalter PB7..PB0 sollen auf den LED7..LED0 ausgegeben werden.
Links der Assemblercode.
Im Debug-Modus fällt auf, dass LED3 leuchtet also PB3=1 beim Debuggen ist.
Knight-Rider-Lauflicht mit Shift-Befehlen
K.I.T.T. Scanner: Ein Lauflicht, dass LED0 bis LED7 und dann wieder zurück bis LED0 leuchten lässt, also wirkt wie ein Scanner, soll erstellt werden. Links der PAP dazu.
Die Leuchtdauer ist in einer Konstanten vorgegeben:.equ DELAYZEIT // Leuchtdauer der LED in ms
Entwickeln Sie den Assember-Code dazu und testen Sie ihn. Tipps:
warte(DELAYZEIT) mit diesem Code übersetzen:mov r0,#DELAYZEIT<br>bl HAL_Delay // benutzt R2 und R3
Lösung
.equ DELAYZEIT,200 // Leuchtdauer in ms
main:
ldr r4,=GPIOB // Schalter
ldr r5,=GPIOC // LEDs
mov r6,#1. // Muster in R6
do:
strb r6,[r5,ODR] // Ausgeben LEDs
mov r0,#DELAYZEIT
bl HAL_Delay // benutzt R2 und R3
lsl r6,r6,#1 // 1 nach links schieben
cmp r6,#128 // schon LED7 ?
blt do // Sprung, wenn kleiner
do2:
strb r6,[r5,ODR] // Ausgeben LEDs
mov r0,#DELAYZEIT
bl HAL_Delay
lsr r6,r6,#1. // 1 nach rechts schieben
cmp r6,#1. // schon LED0 ?
bhi do2 // Sprung, wenn groesser
b do
Lauflicht mit ausschaltbaren LEDs
Einzelne LED sollen nun mit den Schaltern PB7..PB0 ausgeschaltet werden, d.h. das Ausgeben wird bei PBi=0 übersprungen.
Dazu werden am Anfang jedes Durchlaufs die Schalter in r7 eingelesen und vor der Ausgabe mit bitweisem Und verglichen ob die LED leuchten soll. Dazu dieser Code:tst r6,r7 // bitweises und setzt Z-Flag<br>beq dunkel // falls Schalter PBi=0 Ausgabe überspringen
Implementieren und testen Sie die Programmerweiterung.
Lösung
.equ DELAYZEIT,200 // Geschwindigkeit einstellen
main:
ldr r4,=GPIOB // Schalter
ldr r5,=GPIOC // LEDs
mov r6,#1 // Muster in R6
loop:
ldrb r7,[r4,IDR] // Lade Schalter
do:
tst r6,r7 // r6&r7 soll LED leuchten?
beq dunkel // nein dann weiter
strb r6,[r5,ODR] // Ausgeben LEDs
mov r0,#DELAYZEIT
bl HAL_Delay // benutzt R2 und R3
dunkel:
lsl r6,r6,#1 // 1 nach links schieben
cmp r6,#128 // schon LED7 ?
blt do // Sprung, wenn kleiner
do2:
tst r6,r7 // r6&r7 soll LED leuchten?
beq dunkel2 // nein dann weiter
strb r6,[r5,ODR]. // Ausgeben LEDs
mov r0,#DELAYZEIT
bl HAL_Delay
dunkel2:
lsr r6,r6,#1 // 1 nach rechts schieben
cmp r6,#1 // schon LED0 ?
bhi do2 // Sprung, wenn groesser
b loop