?
Hallo Leute,
naja mit Assembler hab ich noch meine Probleme, und jetzt muss ich auch noch in der Schule einen Lauflicht auf Assebler programmieren als Jahresarbeit.
Das Problem ist, dass ich eigentlich schon mind. 70% des Programms programmiert habe(wovon ich ausgehe), aber ich weiss nicht, wie ich da noch den Taster programmieren soll, und noch vielleicht ein oder zwei kleine Befehle, die siecherlich fehlen.
Fakt ist, dass ich nur noch soweit Programmieren konnte, und nicht mehr weiter machen kann. Vielleicht bild ich es mir nur ein, dass da etwas noch fehlt, aber den Taster müsst ich doch noch programmirern oder nicht? Und wenn ja, dann sagt mir doch bitte auch noch wie?
Die genaue Afgabe heißt so:
Lauflicht mit Treffer anzeige:
- von 5 Leds, leuchtet immer nur einer
- außer beim einschlten sind nie alle Leds dunkel
- ein Leuchtpunkt wandert zyklisch auf und ab
- der Wechsel erfolgt nach jeweils 100 ms (10Hz)
- Das Lauflicht satrtet mit Q0
- Über einen Taster S0 soll die mittlere LED erwischt werden (Betätiging innerhalb der Zeit, in der diese LED leuchtet
- für den Fall, dass man zum richtigen Zeitpunkt drückt, wird eine Trefferanzeige um 1 erhöht.
Jetzt kommt der wichtigste Teil:
- der Taster S0 löst einen Interrupt aus (reaktion auf negative Flanke)
- die zugehörige Interrupr Service Routine erhöhtden Trefferzähler nur dann um eins, wenn zu diesem Zeitpunkt die mittlere LED leuchtet
- Die Trefferanzeige erfolgt in einem 7-Segmentanzeige
- Wenn 9 Punkte erreicht sind, stoppt das Spiel und kann nur über einen Reset wieder neu gestartet werden
- Die Steuerleitung sin entprellt
- Die angegben Portbezeichnungen gelten für einen MC der 8051-Familie
So: Der Taster S0 ist an Port P3.2 angeschlossen
Wie soll ich das programmieren, und muss ich noch weite sachen programmieren damit das Programm fertig wird.
Jetzt schon danke für eure Hilfe
Das Programm, soweit ich gekommen bin:
code at 0 ;Programm startet bei 0
include reg_51.pdf ;bindet die Datei "reg_51.pdf" mit ein
org 0F00h
;*********************Initialisierung**********************
Start:
MOV P0,#00000000b ;nach Reset sind kurz alle LEDs dunkel
MOV R2,#0 ;Trefferregister zurücksetzen
MOV DPTR,#Seg7Code ;Datenpointer mit Anfangsadresse der Codetabelle laden(Basiswert)
;*********************Initialisierung Interrupt************
SETB IT0 ;Externer Interrupt 0 bei abfallender Flanke
CLR IE0 ;eventuelle Anforderung löschen
SETB EX0 ;externer Interrupt 0 (P3.2) freigeben
SETB EA ;globale Interruptfreigabe
;*********************HAUPTPROGRAMM************************
Lauflicht: ;Sprungmarke für Lauflicht
MOV P0,#00000001b ;Ausgabe Bitmuster 1 an Port 0
ACALL Pause ;Aufruf des Unterprogramms Pause
MOV P0,#00000010b ;Ausgabe Bitmuster 2 an Port 0
ACALL Pause ;Aufruf des Unterprogramms Pause
MOV P0,#00000100b ;Ausgabe Bitmuster 3 an Port 0
ACALL Pause ;Aufruf des Unterprogramms Pause
MOV P0,#00001000b ;Ausgabe Bitmuster 4 an Port 0
ACALL Pause ;Aufruf des Unterprogramms Pause
MOV P0,#00010000b ;Ausgabe Bitmuster 5 an Port 0
ACALL Pause ;Aufruf des Unterprogramms Pause
MOV P0,#00001000b ;Ausgabe Bitmuster 6 an Port 0
ACALL Pause ;Aufruf des Unterprogramms Pause
MOV P0,#00000100b ;Ausgabe Bitmuster 7 an Port 0
ACALL Pause ;Aufruf des Unterprogramms Pause
MOV P0,#00000010b ;Ausgabe Bitmuster 8 an Port 0
ACALL Pause ;Aufruf des Unterprogramms Pause
SJMP Lauflicht ;Sprung zum Anfang des Lauflichts
Seg7Code: ;Beginn der Tabelle für 7-Segment-Code
DB 11111100b, 01100000b, 11011010b ;7-Segment-Code für die Zahlen 0,1,2
DB 11110010b, 01100110b, 10110110b ;7-Segment-Code für die Zahlen 3,4,5
DB 10111110b, 11100000b, 11111110b ;7-Segment-Code für die Zahlen 6,7,8
DB 11110110b ;7-Segment-Code für die Zahl 9
;******************Unterprogramm Pause********************
Pause: ;Sprungmarke für Unterprogramm Pause
MOV R0,#200d ;Äußere Schleife mit Wert 200 laden
Pause1: MOV R1,#250d ;Innere Schleife mit Wert 250 laden
Pause2: DJNZ R1,Pause2 ;Innere Schleife
DJNZ R0,Pause1 ;Äußere Schleife
RET ;Ende Unterprogramm und Rücksprung zum HP
;********************InterruptServiceRoutine*********************************
SJMP Start ;ISR überspringen (Beginne mit Hauptprogramm)
ORG 0003h ;Einsprungadresse für externen Interrupt 0
PUSH ACC ;Akuinhalt retten
CLR EX0 ;externen Interrupt 0 (P3.2) sperren
JNB P0.2,nichts ;Wenn kein Treffer, dann überspringe Erhöhung
INC R2 ;Wenn Treffer, dann erhöhe Trefferegister
nichts: MOV A,R2 ;Lade Trefferregister in Akku
MOVC A,@A+DPTR ;Hole 7-Seg-Code für Trefferanzahl
MOV P2,A ;Gib Trefferanzahl im 7-Seg-Code an P2 aus
CJNE R2,#9,weiter ;Wenn 9 Punkte noch nicht erreicht, dann weiter
Spielende: SJMP Spielende ;Wenn 9 Punkte erreicht, dann Spielende
weiter: SETB EX0 ;externer Interrupt 0 (P3.2) wieder freigeben
POP ACC ;Gepeicherten Akkuinhalt holen
RETI ;Ende ISR und Rücksprung zum Hauptprogramm
END ;Ende des Hauptprogramms