Pfad: Home => AVR-Übersicht => Software => LPM-Befehl

; Testet den LPM-Befehl zum Auslesen von Bytes aus dem Programmspeicher

; Liest die Tasten und wandelt die Nummer der Taste
; über eine Liste im Programmspeicher in die Anzahl
; an LEDs um und beleuchtet diese. (Taste 0 = 8 Stück)
; Ein ziemlich unnützes Programm, aber es demonstriert
; neben dem LPM-Befehl auch das Rollen und Springen.
;
.NOLIST
.INCLUDE "8515def.inc"
.LIST
;

; Register

;
.DEF   erg=R0 ; Der LPM-Befehl wirkt ausschliesslich auf R0
.DEF   mpr=R16 ; Multifunktionsregister
;
; Verwendet werden auch die Register ZL (R30) und ZH (R31).
; Dies wird im 8515def.inc definiert, daher braucht es hier nicht.
;

; Reset-/Interrupt-Vektor

;
   RJMP   main
;
main:   CLR   mpr ; Lade 0 in Register mpr
   OUT   DDRD,mpr ; alle D-Ports sind Eingang Schalter
   DEC   mpr ; Lade FF in Register B
   OUT   DDRB,mpr ; Alle B-Ports sind Ausgang LEDs
   OUT   PORTD,mpr ; Alle Pullups auf D einschalten

loop:   LDI   ZL,LOW(liste2) ; Registerpaar Z zeigt auf das
   LDI   ZH,HIGH(liste2) ; erste Byte (FF) in der Liste
   IN   mpr,PIND ; Lese Schalter aus
   CPI   mpr,0xFF ; Alle Schalter aus? Alle LEDs aus!
   BREQ   ;lesen
incp:   INC   ZL ;Zeige mit LSB auf nächstes Byte der Liste
   BRNE   rolle ;kein Überlauf des MSB, weiter
   INC   ZH ;MSB übergelaufen, eins weiter
rolle:   ROR   mpr ;schiebe Bit 0 in das Carry-Flag
   BRLO   incp ; Carry=1, nicht gedrückt, weiter in der Liste
lesen:   LPM ; Lese das Byte, auf das Zeiger Z zeigt in Register R0
   OUT   PORTB,erg ; Gib Byte auf LEDs aus
   RJMP   loop ; Im Kreis drehen
;
; Die Liste mit den Lampenkombinationen, jedes Byte entspricht einem
; Schalter.
; Die Werte müssen jeweils wortweise angegeben werden, weil bei der
; Verwendung von .DB xx immer automatisch ein Null-Byte mitgespeichert
; würde! Es geht aber auch .DB xx,yy! Die werden zu einem Wort ver-
; knüpft. Dasselbe gilt bei Texten mit .DB "abcd...": Geradzahlige An-
; zahlen gehen, ungeradzahlige kriegen ein Nullbyte zusätzlich!
;
liste:
.DW   0xFEFF
; 1 Lampe, 0 Lampen (0 ist hinten, 1 vorne!)
.DW   0xF8FC ; 3 Lampen, 2 Lampen
.DW   0xE0F0 ; 5 Lampen, 4 Lampen
.DW   0x80C0 ; 7 Lampen, 6 Lampen
;
.EQU   liste2=liste*2 ; Wird gebraucht, weil die Adresse
;      wortweise organisiert ist, die Werte aber
;      byteweise gelesen werden sollen


©2002 by http://www.avr-asm-tutorial.net