Das habe ich jetzt zustande gekriegt, aber habe keinen Plan ob es richtig ist oder wie ich das Leuchten von Außen nach Innen machen soll.
;************************************************* ****
#include <P18f4550.INC>
;************************************************* ****
; Variablen deklarieren (RAM)
bitposition EQU 0x0A
zaehler EQU 0x0B
flanke EQU 0x0C
wert EQU 0x0D
;************************************************* ****
; Interruptvektoren
; 0x800 Offset bei Verwendung des USB Bootloaders auf dem
; Board
ORG 0x800 ; Reset Einsprung
goto initmain
ORG 0x808 ; HP-Interrupt Einsprung
goto initmain
ORG 0x818 ; LP-Interrupt Einsprung
goto initmain
;************************************************* ****
; Initialisierung
ORG 0x828
initmain
movlw B'11111111' ; PortB auf Eingang
movwf TRISB
movlw B'00000000' ; PortD auf Ausgang
movwf TRISD
movlw H'0D' ; Alle optionalen Analogeingänge mit Ausnahme von AN0,AN1 (PA0,PA1)
movwf ADCON1 ; werden auf digital In/Out initialisiert
bcf INTCON2,7 ; PortB mit Pull up Widerstaenden
;************************************************* ****
; Hauptprogramm
mainloop
btfss PORTB,2
goto einlesen
goto modis
einlesen
clrf WREG,0
clrf LATD,0
bsf bitposition,7
goto wohinistegal
wohinistegal
btfsc PORTB,0
goto flankenhigh ;=1
goto wohinistegal
flankenhigh
movlw B'0001'
movwf flanke,0
movf PORTB,WREG
cpfseq flanke,0
goto flankenlow
goto flankenhigh
flankenlow
clrf flanke
movf PORTB,WREG
cpfseq flanke,0
goto trolololo
goto flankenlow
trolololo
addlw B'0001'
addwf zaehler,1,0
btfsc zaehler,3
goto mainloop
btfss PORTB,1 ;Abfrage von PB.1
goto einlesenlow ;Wenn 0 dann Sprung zu "einlesenlow"
goto einlesenhigh
einlesenhigh ;Abfrage welches Bit als 1 eingelesen werden soll
btfsc bitposition,7 ;Abfrage von LATD.7
bsf wert,7 ;Wenn LATD.7 gesetzt dann muster.7 auf 1 setzen
btfsc bitposition,6 ;Abfrage von LATD.6
bsf wert,6 ;Wenn LATD.6 gesetzt dann muster.6 auf 1 setzen
btfsc bitposition,5 ;Abfrage von LATD.5
bsf wert,5 ;Wenn LATD.5 gesetzt dann muster.5 auf 1 setzen
btfsc bitposition,4 ;Abfrage von LATD.4
bsf wert,4 ;Wenn LATD.4 gesetzt dann muster.4 auf 1 setzen
btfsc bitposition,3 ;Abfrage von LATD.3
bsf wert,3 ;Wenn LATD.3 gesetzt dann muster.3 auf 1 setzen
btfsc bitposition,2 ;Abfrage von LATD.2
bsf wert,2 ;Wenn LATD.2 gesetzt dann muster.2 auf 1 setzen
btfsc bitposition,1 ;Abfrage von LATD.1
bsf wert,1 ;Wenn LATD.1 gesetzt dann muster.1 auf 1 setzen
btfsc bitposition,0 ;Abfrage von LATD.0
bsf wert,0 ;Wenn LATD.0 gesetzt dann muster.0 auf 1 setzen
rrncf bitposition,1 ;Rotieren von LATD um 1 nach rechts
goto trolololo ;Sprung zu "hlschleife"
einlesenlow
btfsc bitposition,7 ;Abfrage von LATD.7
bcf wert,7 ;Wenn LATD.7 gesetzt dann muster.7 auf 1 setzen
btfsc bitposition,6 ;Abfrage von LATD.6
bcf wert,6 ;Wenn LATD.6 gesetzt dann muster.6 auf 1 setzen
btfsc bitposition,5 ;Abfrage von LATD.5
bcf wert,5 ;Wenn LATD.5 gesetzt dann muster.5 auf 1 setzen
btfsc bitposition,4 ;Abfrage von LATD.4
bcf wert,4 ;Wenn LATD.4 gesetzt dann muster.4 auf 1 setzen
btfsc bitposition,3 ;Abfrage von LATD.3
bcf wert,3 ;Wenn LATD.3 gesetzt dann muster.3 auf 1 setzen
btfsc bitposition,2 ;Abfrage von LATD.2
bcf wert,2 ;Wenn LATD.2 gesetzt dann muster.2 auf 1 setzen
btfsc bitposition,1 ;Abfrage von LATD.1
bcf wert,1 ;Wenn LATD.1 gesetzt dann muster.1 auf 1 setzen
btfsc bitposition,0 ;Abfrage von LATD.0
bcf wert,0 ;Wenn LATD.0 gesetzt dann muster.0 auf 1 setzen
rrncf bitposition,1 ;Rotieren von LATD um 1 nach rechts
goto trolololo ;Sprung zu "hlschleife"
modis
btfss PORTB,3
goto firstway
goto secondway
firstway
btfss PORTB,4
goto statisch
goto rotate
secondway
btfss PORTB,4
goto blinken
goto außeninnen
statisch
btfss PORTB,3
movff wert,LATD
goto modis
rotate
movff wert,LATD
btfss PORTB,4
goto modis
rrncf LATD
call Delay
goto rotate
blinken
movff wert,LATD
call Delay
btfss PORTB,3
goto modis
clrf LATD
call Delay
goto blinken
;****************************************
; Warteschleife für 250ms bei tm = 250ns
; (2+[2+{2+(8*215-1)}*142-1]*9-1)mz = 2.199.448 mz
; 2.199.448 * 250ns = 549.862.000ns ~ 549ms
;****************************************
loopzaehler1 EQU H'00'
loopzaehler2 EQU H'01'
loopzaehler3 EQU H'02'
Delay
bcf STATUS, C
movlw D'009' ; (1)
movwf loopzaehler3,0 ; (1)
Wait1msa movlw D'142' ; (1)
movwf loopzaehler2,0 ; (1)
Wait1msb movlw D'215' ; (1)
movwf loopzaehler1,0 ; (1)
Wait1msc nop ; (1) x 5
nop
nop
nop
nop
decfsz loopzaehler1,1,0 ; (1)/(2)
goto Wait1msc ; (2)
decfsz loopzaehler2,1,0 ; (1)/(2)
goto Wait1msb ; (2)
decfsz loopzaehler3,1,0 ; (1)/(2)
goto Wait1msa ; (2)
return
END