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

PAP für Knight-Rider
PAP für Knight-Rider

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

PAP
Lauflicht mit ausschaltbaren LED

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