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.
;
;
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