; 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 "C:\avrtools\appnotes\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 ;