Pfad:
Home =>
AVR-Übersicht =>
Anwendungen =>
LED-Grab => Software
(This page in English:
Software für das 8*8-Matrix LED-Grab mit ATmega16
;
; ********************************************
; * LED-Grab 8-mal-8 LED matrix *
; * Version 1 Januar 2011 *
; * (C)2011 by http://avr-asm-tutorial.net *
; ********************************************
;
; Include-Datei fuer ATmega16
.NOLIST
.INCLUDE "m16def.inc" ; Header fuer mega16
.LIST
;
; =============================================
; H A R D W A R E I N F O R M A T I O N E N
; =============================================
; ATmega16 ___________
; 1 / |40
; S1-P0 o--|PB0 PA0|--o Col1u
; S2-P1 o--|PB1 PA1|--o Col2u
; S3-uu o--|PB2 PA2|--o Col3u
; S4-XR o--|PB3 PA3|--o Col4u
; --|PB4 PA4|--o Col5u
; MOSI o--|MOSI PA5|--o Col6u
; MISO o--|MISO PA6|--o Col7u
; SCK o--|SCK PA7|--o Col8u
; RESET o--|RESET AREF|--
; VCC o--|VCC |--o GND
; GND o--|GND AVCC|--
; --|XTAL2 PC7|--o Col8l
; --|XTAL1 PC6|--o Col7l
; Row1u o--|PD0 PC5|--o Col6l
; Row2u o--|PD1 PC4|--o Col5l
; Row3u o--|PD2 PC3|--o Col4l
; Row4u o--|PD3 PC2|--o Col3l
; Row1l o--|PD4 PC1|--o Col2l
; Row2l o--|PD5 PC0|--o Col1l
; Row3l o--|PD6 PD7|--o Row4l
; |____________|
;
; Switches:
; ---------
; S1,S2 : Auswahl der Textsequenzen 0..3
; S3 on : Ueberschreiben der Buchstaben im Display
; off: Rotieren des Textes im Display
; S4 on : Maximale Display Helligkeit
; off: Halbe Display Helligkeit
;
; Fuses:
; ------
; Die folgenden Fuses muessen ausgewaehlt sein:
; - JTAGEN Fuse aus (JTAG disabled)
; - EESAVE Fuse an (beibehalten des EEPROM-Inhalts
; beim flashen)
; Die folgenden Fuses zur Takteinstellung sind
; auszuwaehlen (entspreicht dem Urzustand):
; - SUT CK SEL = Int RC Osc, 1 MHz, 6 CK + 64 ms
; Fuse Setting: High=D1, Low=E1
;
; ============================================
; P O R T S U N D P I N S
; ============================================
;
.equ pColU = PORTA ; Oberer Spaltentreiber
.equ pColUD = DDRA ; Richtung oberer Spaltentreiber
.equ pColL = PORTC ; Unterer Spaltentreiber
.equ pColLD = DDRC ; Richtung unterer Spaltentreiber
.equ pRow = PORTD ; Zeilentreiber
.equ pRowD = DDRD ; Richtung Zeilentreiber
.equ pSw = PORTB ; Schaltereingang
.equ pSwD = DDRB ; Richtung Schaltereingang
;
;
; ============================================
; P R O G R A M M I N F O
; ============================================
;
; Prozessortakt:
; Der Prozessor laeuft mit seiner Defaulteinstellung,
; dem internen RC Taktgenerator mit 1 MHz
;
; Timer 1:
; 16-bit-Timer 1 wird im CTC-Mode betrieben und
; verwendet das ICR-Register fuer Vergleich und
; Ruecksetzen. Interrupts bei ICR-Compare-Match
; sind eingeschaltet und steuern das Multiplexen
; der Anzeige. In der programmierten Einstellung
; wird der Int alle 5 ms ausgefuehrt (50 Hz, 4
; Zeilen).
; Falls mit dem Schalter 4 die niedrigere Hellig-
; keit ausgewaehlt ist, ist der Compare Match Int
; A zusaetzlich aktiv. Er schaltet die Zeilentrei-
; ber nach der halben Zeit (2,5 ms) aus.
;
; LED-Steuerung:
; Die Ports A und C treiben die Spaltentransistoren,
; Port D treibt die Zeilentransistoren.
; Der Timer 1 ICR Int
; - loescht alle Zeilentreiber,
; - gibt die Spaltendaten im SRAM an die Ports A
; und C aus,
; - schaltet dann die Zeilentransistoren an.
; Das Zeilenbyte (0x88, 0x44, 0x22,0x11) wird dann
; nach rechts geschoben. Wenn dabei ein Ueberlauf
; in das Carry-Flag erfolgt, sind vier Multiplex-
; zyklen vorbei. Das Zeilenbyte beginnt dann mit
; 0x88 neu und der Zeiger X auf die Spaltendaten
; im SRAM wird von vorne gestartet.
; Nach vier Schiebevorgaengen wird ein Zaehler
; vermindert. Erreicht dieser Null, dann wird das
; T-Flag gesetzt und der Zaehler aus dem Register
; rAct neu gesetzt. Das T-Flag wird von der Software
; auszerhalb des Interrupts rueckgesetzt.
; Das Register rAct erlaubt eine dynamische Einstel-
; der Display-Wechselgeschwindigkeit. Wenn Schalter
; S3 aus ist (Einschieben des naechsten Buchstabens),
; wird die im Text angegebene Geschwindigkeit durch
; acht geteilt, um die acht Spalten schneller herein
; zu schieben.
; Wenn Schalter 4 ausgeschaltet ist, werden die LEDs
; nach der halben Anzeigezeit ausgeschaltet. Die LEDs
; erscheinen dann weniger hell.
;
; Textanzeige:
; Vier verschiedene Textsequenzen koennen im EEPROM
; hinterlegt werden. Jede muss mit 0xFF enden. Als
; Characterset ist 7-Bit-ASCII implementiert, die
; unteren 32 Steuercodes sind mit Grafikzeichen
; belegt.
; Innerhalb des Textes koennen Geschwindigkeits-
; steuernde Zeichen untergebracht werden. Dies sind
; Zeichen zwischen 128 und 254. Sie setzen die Zeit
; zwischen der Ausgabe zweier Zeichen auf 20*(n-128)
; Millisekunden (n=128 setzt auf 20*256 ms = 5 s).
; Abhaengig von den beiden Schaltern S1 und S2 wird
; eine von vier Textsequencen abgespielt.
; Ist Schalter S3 an, wird der Text Zeichen fuer
; Zeichen angezeigt. Ist er aus, dann wird der Text
; mit achtfacher Geschwindigkeit von rechts nach
; links ueber das Display geschoben.
;
; ================================================
; K O N S T A N T E N Z U M V E R S T E L L E N
; ================================================
;
.equ mux_freq = 50 ; Multiplexfrequenz der Anzeige
;
; ============================================================
; F E S T E U N D B E R E C H N E T E K O N S T A N T E N
; ============================================================
;
.equ clock = 1000000 ; Interne RC-Generator Frequenz
.equ mux_int_freq = 4 * mux_freq ; Interrupt Frequenz fuer MUX
.equ presc = 8 ; 16-bit Timer Vorteiler
.equ comp = clock / presc / mux_int_freq ; 16-bit Timer Compare
;
; ============================================
; R E G I S T E R D E F I N I T I O N E N
; ============================================
;
; benutzt: R0 fuer LPM und andere Zwecke auszerhalb Ints, unbenannt
; benutzt: R1..R8 fuer Schiebezwecke auszerhalb Ints, unbenannt
; frei: R9..R14
.def rSreg = R15 ; temporaeres SREG Flagregister
.def rmp = R16 ; Vielzweckregister auszerhalb Ints
.def rimp = R17 ; Vielzweckregister innerhalb Ints
.def rCntDwn = R18 ; Countdown Register innerhalb Ints
.def rMux = R19 ; Multiplex-Zeilentreiberregister
.def rAct = R20 ; Anzahl Multiplexzyklen bis zum Setzen der T-Flagge
.def rChr = R21 ; Zaehler fuer das Schieben der Zeichen
.def rLCol = R22 ; Spaltenregister zum Feststellen ob Spalte leer
; frei: R23..R25
; benutzt: R27:R26 (X) als Zeiger auf Multiplexdaten innerhalb Ints
; benutzt: R29:R28 (Y) als Zeiger auszerhalb Ints
; benutzt: R31:R30 (Z) als Zeiger auszerhalb Ints
;
; ============================================
; S R A M D E F I N I T I O N E N
; ============================================
;
.DSEG
.ORG Sram_Start
MuxData: ; Spalteninfo fuer Multiplexen der LEDs
.byte 8
;
; ==============================================
; R E S E T U N D I N T V E K T O R E N
; ==============================================
;
.CSEG
.ORG $0000
rjmp Main ; Reset-Vektor
nop
reti ; Int0
nop
reti ; Int1
nop
reti ; TC2 compare int
nop
reti ; TC2 overflow
nop
rjmp Tc1Capt ; TC1 capture int
nop
rjmp Tc1CmpA ; TC1 compare A
nop
reti ; TC1 compare B
nop
reti ; TC1 overflow
nop
reti ; TC0 overflow
nop
reti ; SPI STC
nop
reti ; USART RXC
nop
reti ; USART UDRE
nop
reti ; USART TXC
nop
reti ; ADC
nop
reti ; EE_RDY
nop
reti ; ANA_COMP
nop
reti ; TWI
nop
reti ; INT2
nop
reti ; TC0 Compare
nop
reti ; SPM Ready
nop
;
;
; ==========================================
; I N T E R R U P T S E R V I C E S
; ==========================================
;
; MUX Interrupt Serviceroutine
Tc1Capt:
in rSreg,SREG ; Retten der Flags
ldi rimp,0 ; Anzeige aus
out pRow,rimp
ld rimp,X+ ; lese oberen Spaltenwert
out pColU,rimp ; schreibe oberen Spaltentreiber
ld rimp,X+ ; lese unteren Spaltenwert
out pColL,rimp ; schreibe unteren Spaltentreiber
out pRow,rMux ; Zeilentreiber und Anzeige an
lsr rMux ; schiebe Multiplexregister rechts
brcc Tc1Capt1 ; kein Ueberlauf, fertig
ldi rMux,0x88 ; start with first column
ldi XL,LOW(MuxData) ; Neustart des MUX-Zeigers
dec rCntDwn ; abwaerts zaehlen
brne Tc1Capt1 ; nicht Null, fertig
mov rCntDwn,rAct ; Neustart Abwaertszaehler
out SREG,rSreg ; Wiederherstellen des SREG
set ; setze T-Flagge
reti
Tc1Capt1:
out SREG,rSreg ; stelle SREG wieder her
reti
;
; Tc1CmpA schaltet die Anzeige vorzeitig aus
Tc1CmpA:
ldi rimp,0 ; schreibe Nullen in Zeilentreiber
out pRow,rimp
reti
;
; ============================================
; H A U P T P R O G R A M M I N I T
; ============================================
;
Main:
; Init Stapel
ldi rmp,HIGH(RAMEND) ; Stapelzeiger auf RAMEND
out SPH,rmp
ldi rmp,LOW(RAMEND)
out SPL,rmp
; Init Multiplexvariablen
ldi rMux,0x88 ; Starte mit den obersten Zeilen
ldi rAct,50 ; Multiplexzyklen fuer T-Flagge, 1 Sekunde
mov rCntDwn,rAct ; Multiplexzyklenzaehler
ldi XH,HIGH(MuxData) ; X auf Anfang Multiplexdaten im SRAM
ldi XL,LOW(MuxData)
; Init Anzeigeports
clr rmp ; alle Ports aus
out pColU,rmp ; obere Spalten
out pColL,rmp ; untere Spalten
out pRow,rmp ; Zeilen
ldi rmp,0xFF ; Alle Porttreiber fuer die Anzeige auf Ausgang
out pColUD,rmp ; oberer Spaltentreiber
out pColLD,rmp ; unterer Spaltentreiber
out pRowD,rmp ; Zeilentreiber
; Init Anzeigetest
ldi YH,HIGH(MuxData) ; Y zeigt auf Multiplexdaten im SRAM
ldi YL,LOW(MuxData)
ldi rmp,'A' ; Buchstabe A anzeigen
rcall Rmp2Asc ; Z auf Anfang A im Flashspeicher setzen
ldi rmp,8
WriteDisp:
lpm R0,Z+
st Y+,R0
dec rmp
brne WriteDisp
; Init Schalterports
clr rmp ; Schalterport auf Eingang
out pSwD,rmp
ldi rmp,0x0F ; Pull-up-Widerstaende einschalten
out pSw,rmp
; Init TC1 als Multiplextimer mit ICR-CTC und Compare A Int
ldi ZH,HIGH(comp) ; TC1 CTC-Wert an ICR
ldi ZL,LOW(comp)
out ICR1H,ZH
out ICR1L,ZL
lsr ZH ; TC1 Compare A auf Halbzeit
ror ZL
out OCR1AH,ZH ; TC1 Compare A schreiben
out OCR1AL,ZL
ldi rmp,0 ; WGM11 und WGM10 auf Null
out TCCR1A,rmp
ldi rmp,(1<<WGM13)|(1<<WGM12)|(1<<CS11) ; ICR-CTC, Vorteiler 8
out TCCR1B,rmp
ldi rmp,(1<<TICIE1)|(1<<OCIE1A) ; beide Ints einschalten
sbis PINB,3 ; Schalter 3 aus?
ldi rmp,1<<TICIE1 ; nur CTC Int
out TIMSK,rmp ; setze Timer Int Maske
ldi rmp,1<<SE ; Schlafen einschalten
out MCUCR,rmp
sei
;
; ============================================
; P R O G R A M M - L O O P
; ============================================
;
Loop:
sleep ; Schlafen bis Interrupt
nop ; Dummy fuer Aufwachen
brtc Loop ; T-Flagge aus?
rcall TFlag ; behandle gesetzte T-Flagge
rjmp loop ; Zurueck in Loop
;
; T-Flagge ist gesetzt
;
TFlag:
clt ; loesche T-Flagge
ldi rmp,(1<<TICIE1)|(1<<OCIE1A) ; ermoegliche beide Ints
sbis PINB,3 ; Schalter 3 aus?
ldi rmp,1<<TICIE1 ; nur CTC Int
out TIMSK,rmp ; setze Timer Int Maske
in rmp,PINB ; lese Schalter
andi rmp,0x03 ; Maskiere die beiden untersten Schalter
ldi YH,HIGH(Text0) ; Y zeigt auf EEPROM-Anfang
ldi YL,LOW(Text0)
mov R0,rmp
GetEep:
breq Display ; erste Sequenz oder Eeprom Textmarke gefunden
rcall ReadEep ; lese naechstes Zeichen aus EEPROM
brne GetEep ; Warte auf Textmarke
dec R0
brne GetEep ; Sequenz noch nicht gefunden
Display:
brtc Display ; Warte auf T-Flagge
clt ; loesche T-Flagge
rcall ReadEep ; lese Zeichen aus EEPROM
brne DisplayChkSpd ; nicht auf Textmarke
rjmp DispEnd ; letztes Zeichen, beende Ausgabesequenz
DisplayChkSpd:
sbrs rmp,7 ; ist das ein Ascii-Zeichen?
rjmp DisplayChar ; ja
; setze Geschwindigkeit
andi rmp,0x7F ; Bit 7 loeschen (-128)
sbis PINB,2 ; 1/8 Verzoegerung wenn schieben eingeschaltet
rjmp DisplaySetSpeed
lsr rmp ; / 2
lsr rmp ; / 4
lsr rmp ; / 8
inc rmp ; + eins um Null zu vermeiden
DisplaySetSpeed:
mov rAct,rmp ; setze Geschwindigkeitsregister
rjmp Display ; naechstes Zeichen
DisplayChar:
push YH ; sichere Y
push YL
rcall Rmp2Asc ; Z zeigt auf Zeichen in der Ascii-Tabelle
sbic PINB,PINB2 ; ueberschreiben oder Schieben eingestellt?
rjmp DispRot ; Schieben
; Ueberschreibe direkt, kein Schieben
ldi YH,HIGH(MuxData) ; Y auf Muxdaten
ldi YL,LOW(MuxData)
ldi rmp,8 ; lese acht Bytes aus der Ascii-Tabelle
DispExch:
lpm R0,Z+ ; Lese aus Ascii-Tabelle im Flash
st Y+,R0 ; kopieren in das SRAM
dec rmp
brne DispExch
pop YL ; Y wiederherstellen
pop YH
rjmp Display ; naechstes Zeichen
; Schiebe Zeichen von rechts in das Display
DispRot:
; lese Zeichencode in die Register R1..R8
ldi YH,0 ; Zeige auf Register R1
ldi YL,1
ldi rmp,8
DispRotRdAsc:
lpm R0,Z+ ; lese Ascii-Tabelle in Register R0
st Y+,R0 ; kopiere Zeichen in Register R1..R8
dec rmp
brne DispRotRdAsc
lsr rLCol ; letzte Spalte des vorherigen Zeichens leer?
brcc DispRotGetCol ; keine Leerspalte einfuegen
; Schiebe leere Spalte von rechts ein
ldi YH,HIGH(MuxData) ; Y zeigt auf Multiplexdaten
ldi YL,LOW(MuxData)
ldi rmp,8
DispRotEmptyCol:
ld R0,Y ; lese Multiplexdaten
lsl R0 ; schiebe Null von rechts ein
st Y+,R0 ; speichere Multiplexdaten
dec rmp
brne DispRotEmptyCol
; Analyse der letzten Spalte des neuen Zeichens
DispRotGetCol:
clr rLCol
or rLCol,R1
or rLCol,R2
or rLCol,R3
or rLCol,R4
or rLCol,R5
or rLCol,R6
or rLCol,R7
or rLCol,R8
set ; springe ueber die nachfolgende Pause
; schiebe das naechste Zeichen ins Display
ldi rChr,8 ; acht Spalten
DispRotChar:
brtc DispRotChar ; warte
clt
ldi YH,0 ; Y zeigt auf Register R1
ldi YL,1
ldi ZH,HIGH(MuxData) ; Z zeigt auf Muxdaten
ldi ZL,LOW(MuxData)
ldi rmp,8
DispRotate:
ld R0,Y ; lese Register in R0
lsl R0 ; schiebe hoechstes Bit ins Carry
st Y+,R0 ; sichere Register fuer die naechste Runde
ld R0,Z ; lese Muxdaten
rol R0 ; Rotiere Carry von links ins Mux Byte
st Z+,R0 ; schreibe Muxdaten
dec rmp ; zaehle herunter
brne DispRotate ; weitere Zeile
dec rChr ; naechste Spalte
brne DispRotChar ; noch eine Spalte schieben
pop YL ; Y wieder herstellen
pop YH
rjmp Display ; naechstes Zeichen der Sequenz
; Sequenzende, warte fuer eine gewisse Zeit
DispEnd:
ldi YL,2 ; zwei Zeichen lang warten
sbic PINB,2 ; Schalter 3 auf Schieben?
rjmp DispEndRot ; ja
ldi ZH,HIGH(MuxData) ; Z auf Muxdaten
ldi ZL,LOW(MuxData)
clr R0 ; Nullen
ldi rmp,8
DispEndExch:
st Z+,R0 ; loesche Daten
dec rmp
brne DispEndExch
DispEndExchWait:
brtc DispEndExchWait ; warte eine Periode
clt
dec YL ; noch weiter warten
brne DispEndExchWait ; ja
ret ; Ende, zurueck zum Loop
DispEndRot:
brtc DispEndRot ; warte auf T-Flagge
clt ; loesche T-Flagge
ldi ZH,HIGH(MuxData) ; Z zeigt auf Muxdaten
ldi ZL,LOW(MuxData)
ldi rmp,8
DispEndShift:
ld R0,Z ; lese Byte aus Mux
lsl R0 ; schiebe 0 ein
st Z+,R0 ; schreibe Byte in Mux
dec rmp
brne DispEndShift ; noch eine Zeile
dec YL ; weitere Zeile?
brne DispEndRot ; ja
ret ; Ende Schiebesequenz, zurueck zum Loop
;
; Lese ein Zeichen aus dem EEPROM an AQdresse Y
; gibt Zero zueruck, wenn Textendmarke erreicht ist
;
ReadEep:
out EEARH,YH ; Adresse in Adressenregister
out EEARL,YL
sbi EECR,EERE ; Strobe fuer Lesen
adiw YL,1 ; Zeiger auf naechste Position
in rmp,EEDR ; lese Zeichen in rmp
cpi rmp,0xFF ; Textende erreicht?
ret
; ============================================
; D I S P L A Y - B E D I E N U N G
; ============================================
;
; Z auf Ascii-Zeichen rmp
;
Rmp2Asc:
ldi ZH,HIGH(2*Ascii) ; Z auf Ascii-Tabelle im Flash
ldi ZL,LOW(2*Ascii)
clr R0
lsl rmp ; Zeichencode mal 2, Bit 7 ignorieren
lsl rmp ; mal 4
rol R0 ; carry in R0
lsl rmp ; mal 8
rol R0 ; carry in R0
add ZL,rmp ; addieren zur Adresse
adc ZH,R0 ; addiere MSB mit Ueberlauf
ret
;
; ============================================
; A S C I I T A B E L L E
; ============================================
;
; Ascii-table (1U,1L,2U,2L,3U,3L,4U,4L)
; erstellt mit calc-table.ods
;
Ascii:
.db 0,24,0,0,0,0,24,0 ; 'a0'
.db 0,36,0,60,60,0,36,0 ; 'a1'
.db 0,66,126,66,66,126,66,0 ; 'a2'
.db 255,129,129,129,129,129,129,255 ; 'a3'
.db 0,24,0,36,36,0,24,0 ; 'a4'
.db 0,24,66,36,36,66,24,0 ; 'a5'
.db 129,24,66,36,36,66,24,129 ; 'a6'
.db 0,255,0,0,0,0,0,0 ; 'a7'
.db 0,12,0,3,192,0,48,0 ; 'a8'
.db 128,8,64,4,32,2,16,1 ; 'a9'
.db 32,8,32,8,16,4,16,4 ; 'aa'
.db 16,16,16,16,16,16,16,16 ; 'ab'
.db 4,16,4,16,8,32,8,32 ; 'ac'
.db 1,16,2,32,4,64,8,128 ; 'ad'
.db 0,48,0,192,3,0,12,0 ; 'ae'
.db 0,0,0,0,0,0,0,0 ; 'af'
.db 0,16,0,0,0,0,16,0 ; '10'
.db 0,28,0,0,0,0,16,0 ; '11'
.db 0,28,0,0,4,0,20,0 ; '12'
.db 0,28,12,0,4,0,20,0 ; '13'
.db 0,28,60,0,4,0,20,0 ; '14'
.db 0,28,124,0,68,0,20,0 ; '15'
.db 0,92,124,0,68,0,84,0 ; '16'
.db 0,92,124,64,68,64,84,0 ; '17'
.db 0,92,124,64,68,112,84,0 ; '18'
.db 0,92,124,64,68,124,84,0 ; '19'
.db 0,92,124,64,68,127,84,0 ; '1A'
.db 0,93,124,65,68,127,84,0 ; '1B'
.db 0,93,124,65,69,127,85,0 ; '1C'
.db 0,93,125,65,69,127,85,0 ; '1D'
.db 0,0,0,0,0,0,0,0 ; '1E'
.db 0,0,0,0,0,0,0,0 ; '1F'
.db 0,0,0,0,0,0,0,0 ; ' '
.db 8,8,8,0,8,8,8,8 ; '!'
.db 36,0,36,0,0,0,0,0 ; '�'
.db 10,36,10,254,127,72,20,80 ; '#'
.db 8,40,8,42,28,28,42,8 ; 'c|'
.db 225,48,163,103,230,197,12,135 ; '%'
.db 24,113,36,78,68,38,120,25 ; '&'
.db 24,0,24,0,24,0,0,0 ; '''
.db 8,32,16,32,32,16,32,8 ; '('
.db 16,4,8,4,4,8,4,16 ; ')'
.db 0,126,90,60,60,90,126,0 ; '*'
.db 0,126,24,24,24,24,126,0 ; '+'
.db 0,0,0,8,0,24,0,48 ; ','
.db 0,60,0,0,0,0,60,0 ; '-'
.db 0,0,0,0,0,24,0,24 ; '.'
.db 6,24,6,24,12,48,12,48 ; '/'
.db 60,195,126,195,195,126,195,60 ; '0'
.db 6,6,30,6,62,6,102,6 ; '1'
.db 126,56,255,97,134,255,28,254 ; '2'
.db 56,30,124,135,135,124,30,56 ; '3'
.db 28,255,60,255,108,12,204,12 ; '4'
.db 255,102,255,3,192,198,254,252 ; '5'
.db 28,222,62,227,96,118,192,60 ; '6'
.db 255,24,3,48,6,96,12,192 ; '7'
.db 60,126,126,195,195,126,126,60 ; '8'
.db 60,63,126,3,195,190,231,254 ; ' 9'
.db 0,24,0,0,0,24,24,24 ; ':'
.db 0,12,0,0,0,12,12,24 ; ';'
.db 4,48,12,24,24,12,48,4 ; '<'
.db 0,0,0,60,0,0,60,0 ; ' ='
.db 32,12,48,24,24,48,12,32 ; '>'
.db 24,12,60,24,102,0,4,24 ; '?'
.db 124,168,130,185,132,130,184,124 ; '@'
.db 24,195,60,255,102,255,195,195 ; 'A'
.db 252,254,254,195,195,254,254,252 ; 'B'
.db 60,192,126,195,195,126,192,60 ; 'C'
.db 252,195,254,195,195,254,195,252 ; 'D'
.db 255,248,255,192,192,255,248,255 ; 'E'
.db 255,248,254,240,192,192,192,192 ; 'F'
.db 60,255,126,227,195,126,192,60 ; 'G'
.db 195,255,195,195,195,195,255,195 ; 'H'
.db 60,24,24,24,24,24,24,60 ; 'I'
.db 255,3,255,198,3,252,3,120 ; 'J'
.db 198,240,204,216,216,204,240,198 ; 'K'
.db 192,192,192,192,192,254,192,254 ; 'L'
.db 195,219,231,195,255,195,219,195 ; 'M'
.db 195,219,227,207,243,199,219,195 ; 'N'
.db 24,195,60,102,102,60,195,24 ; 'O'
.db 252,252,254,192,195,192,254,192 ; 'P'
.db 24,203,60,102,102,62,195,27 ; 'Q'
.db 252,254,254,204,195,198,254,195 ; 'R'
.db 60,126,126,3,195,254,224,124 ; 'S'
.db 255,24,255,24,24,24,24,24 ; 'T'
.db 195,195,195,195,195,126,195,60 ; 'U'
.db 195,195,195,102,195,60,195,24 ; 'V'
.db 195,219,195,219,195,231,219,102 ; 'W'
.db 195,60,195,102,102,195,60,195 ; 'X'
.db 195,60,195,24,195,24,102,24 ; 'Y'
.db 255,24,255,49,134,127,12,254 ; 'Z'
.db 56,32,32,32,32,32,32,56 ; '['
.db 48,4,16,4,8,2,8,2 ; '\'
.db 28,4,4,4,4,4,4,28 ; ']'
.db 8,0,20,0,34,0,0,0 ; '^'
.db 0,0,0,0,0,0,0,255 ; '_'
.db 6,0,12,0,24,0,0,0 ; '�'
.db 0,38,0,98,0,38,26,26 ; ' a'
.db 32,50,32,35,32,50,44,44 ; ' b'
.db 0,102,0,64,0,102,60,60 ; ' c'
.db 4,124,4,132,4,124,52,52 ; ' d'
.db 0,50,0,100,0,41,30,30 ; ' e'
.db 14,30,26,16,16,16,16,16 ; ' f'
.db 0,68,0,60,0,4,56,120 ; ' g'
.db 32,56,32,36,32,36,32,36 ; ' h'
.db 0,16,0,16,16,16,0,16 ; ' i'
.db 0,8,8,8,0,40,8,16 ; ' j'
.db 32,40,32,48,32,40,38,38 ; ' k'
.db 32,32,32,32,32,18,32,12 ; ' l'
.db 0,180,0,218,0,146,0,146 ; ' m'
.db 0,44,0,50,0,34,0,34 ; ' n'
.db 0,24,0,36,0,36,0,24 ; ' o'
.db 0,26,0,26,0,20,20,16 ; ' p'
.db 0,76,0,76,0,52,52,4 ; ' q'
.db 0,50,0,32,0,32,44,32 ; ' r'
.db 0,48,0,8,24,36,36,24 ; ' s'
.db 32,32,32,32,32,18,120,12 ; ' t'
.db 0,34,0,34,0,38,34,26 ; ' u'
.db 0,34,0,20,0,20,34,8 ; ' v'
.db 0,129,0,90,0,90,129,36 ; ' w'
.db 0,40,0,16,0,40,68,68 ; ' x'
.db 0,36,0,28,0,4,36,4 ; ' y'
.db 0,8,0,16,0,36,124,124 ; ' z'
.db 12,48,8,8,8,8,48,12 ; '0'
.db 8,8,8,8,8,8,8,8 ; '|'
.db 24,6,8,8,8,8,6,24 ; '}'
.db 0,74,0,132,0,0,49,0 ; '~'
;
; ============================================
; D I S P L A Y - T E X T E E E P R O M
; ============================================
;
.eseg ; Anfang des EEPROM Segments
; Bytes mit 128..254: setze Geschwindigkeit auf (Wert-128),
; wenn Schieben gewaehlt: (Wert-128) / 8
; Byte 0xFF als Textendmarke
.org $0000
;
Text0:
.db 4+0x80,' ',0,1,2,3,2,1,0 ; explodieren und implodieren
.db 16+0x80,4,5,6,5,4,0,' ' ; Kreuz
.db 4+0x80,7,8,9,10,11,12,13,14,7,' ' ; rotieren
.db 16+0x80,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30 ; Spirale
.db 32+0x80,29,28,27,26,25,24,23,22,21,20,19,18,17,16,' ' ; Spirale rueckwaerts
.db 0xFF
Text1:
.db 32+0x80,"Gerhard Schmidt, Kastanienallee 20, 64289 Darmstadt",0xFF
Text2:
.db 40+0x80,"Willkommen beim LED-Grab von DG4FAC, Version 1 ",0xFF
Text3:
.db 64+0x80,"Text nicht programmiert ",0xFF
;
; Ende des EEPROM-Segments
.cseg
;
; End of source code
; Copyright info
.db "(C)2010 by Gerhard Schmidt " ; menschenlesbar
.db "C(2)10 0ybG reahdrS hcimtd " ; wortgerecht
;
An den Seitenanfang
©2011 by http://www.avr-asm-tutorial.net