Taster für einen Lauflicht programmieren? Abi-aufgabe 06



  • 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
    

Anmelden zum Antworten