aVenger
2004-11-12, 11:00:13
Meine Aufgabe ist es ein Assembler Programm zu schreiben bei welchem bei jedem Tastendruck eine LED dazu geschaltet wird. Wenn alle 8 LEDS leuchten sollen ie nacheinander per Knopfdruck wieder abgeschaltet werden.
Vielleicht kann mir jemand helfen da ich schon seit einer Woche an dem Programm rumschreibe.
Der Taster ist an PortB RP0.
Hier das bisherige Programm. Nach einer gewissen Zeit werden die LED's am Port C immer nach der Reihe eingeschalten.
; Includedatei für den 16F876 einbinden
;
list p=16f876 ;Bauteilauswahl (immer vor der include)
#include "P16f876.INC" ;Include Datei
; Variablennamen vergeben (Speicherplatz festlegen, ab 20h möglich)
;
loop1 Equ 0x22 ; Zähler für Warteschleife
loop2 Equ 0x23 ; Zähler für Warteschleife
;Platz für Macros und Define-Anweisungen
;nach Reset des Programmes geht das Programm an die Adresseh "0h" und springt dann zum "main"
;
;Befehle immer in die zweite Spalte schreiben
; ||
; \/
org 0h ; Adresse des naechsten Befehls im Programmspeicher
goto main ; naechster Befehl
;**************************************************************
; Hauptprogramm:
; Port C auf Ausgabe stellen
main ; Hauptprogramm
bsf STATUS, RP0 ; auf Bank 1 umschalten (bsf=bit set file)
movlw B'00000000' ; PortC alle auf Output
movwf TRISC
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
clrf PORTC ; alle LEDs ausschalten
; 1. LED einschalten
bsf PORTC,0 ; LED an RC0 einschalten
; Lauflicht
Loop
call Wait ; Wartezeit (Schleife)
rlf PORTC,f ; laufen zur nächsten LED (rotate left)
goto Loop
;**********************************************************
; Warteschleife 250 ms (zwei verschachtelte Schleifen)
Wait
movlw 5 ;D'250' ; 250 ms Pause
movwf loop1
Wait1
movlw 3 ;.110 ; Zeitkonstante für 1ms (110 x 9Zyklen x 1/4MHz/4(1us) ~ 1ms)
movwf loop2
Wait2 nop ;
nop
nop
nop
nop
nop ; Dercrement, überspringe nächste Zeile, wenn Inhalt 0
decfsz loop2, F ; 1 ms vorbei?, F equ 1 -> Ergebnis im F (loops2)
; F schreib Ergebnis zurück in den Speicher, W : daten würden im Working Register bleiben
; Zählt bis 0 herunter -> dann überspringt er den goto befehl und geht weiter
goto Wait2 ; nein, noch nicht
;
decfsz loop1, F ; 250 ms vorbei?
goto Wait1 ; nein, noch nicht
retlw 0 ; Ende der Warteschleife (250ms)
end
Vielleicht kann mir jemand helfen da ich schon seit einer Woche an dem Programm rumschreibe.
Der Taster ist an PortB RP0.
Hier das bisherige Programm. Nach einer gewissen Zeit werden die LED's am Port C immer nach der Reihe eingeschalten.
; Includedatei für den 16F876 einbinden
;
list p=16f876 ;Bauteilauswahl (immer vor der include)
#include "P16f876.INC" ;Include Datei
; Variablennamen vergeben (Speicherplatz festlegen, ab 20h möglich)
;
loop1 Equ 0x22 ; Zähler für Warteschleife
loop2 Equ 0x23 ; Zähler für Warteschleife
;Platz für Macros und Define-Anweisungen
;nach Reset des Programmes geht das Programm an die Adresseh "0h" und springt dann zum "main"
;
;Befehle immer in die zweite Spalte schreiben
; ||
; \/
org 0h ; Adresse des naechsten Befehls im Programmspeicher
goto main ; naechster Befehl
;**************************************************************
; Hauptprogramm:
; Port C auf Ausgabe stellen
main ; Hauptprogramm
bsf STATUS, RP0 ; auf Bank 1 umschalten (bsf=bit set file)
movlw B'00000000' ; PortC alle auf Output
movwf TRISC
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
clrf PORTC ; alle LEDs ausschalten
; 1. LED einschalten
bsf PORTC,0 ; LED an RC0 einschalten
; Lauflicht
Loop
call Wait ; Wartezeit (Schleife)
rlf PORTC,f ; laufen zur nächsten LED (rotate left)
goto Loop
;**********************************************************
; Warteschleife 250 ms (zwei verschachtelte Schleifen)
Wait
movlw 5 ;D'250' ; 250 ms Pause
movwf loop1
Wait1
movlw 3 ;.110 ; Zeitkonstante für 1ms (110 x 9Zyklen x 1/4MHz/4(1us) ~ 1ms)
movwf loop2
Wait2 nop ;
nop
nop
nop
nop
nop ; Dercrement, überspringe nächste Zeile, wenn Inhalt 0
decfsz loop2, F ; 1 ms vorbei?, F equ 1 -> Ergebnis im F (loops2)
; F schreib Ergebnis zurück in den Speicher, W : daten würden im Working Register bleiben
; Zählt bis 0 herunter -> dann überspringt er den goto befehl und geht weiter
goto Wait2 ; nein, noch nicht
;
decfsz loop1, F ; 250 ms vorbei?
goto Wait1 ; nein, noch nicht
retlw 0 ; Ende der Warteschleife (250ms)
end