biohazard360
13.04.2007, 16:04
Hallo nun ich will mein Display mit dem Max 7219 ansteuern dieser soll dann einen Buchstaben ausgeben:
Variablenfestlegung:
CBLOCK H'20'
variable1 ; das Wort variable1 entspricht der Adresse H'20'
zaehl ; das Wort zaehl entspricht der Adresse H'21'
register
sendregister
value
temp
z1
z2
z3
ENDC
Hauptprogamm und unterprogramm:
;*****************
;* Hauptprogramm *
;*****************
main
BSF PORTB,1 ;setze Bit des Registers PORTB,1
GOTO up_initmax ;gehe zu up_initmax
GOTO up_zeichen ;gehe zu up_zeichen
GOTO up_warte ;gehe zu up_warten
GOTO main ;gehe zu main
;******************
;* Unterprogramme *
;******************
up_warte ;warteschleife
MOVLW D'170' ;lade W-Register mit D'170'
MOVWF z1 ;kopiere W-Register nach z1
outer
MOVLW D'120' ;lade W-Register mit D'120'
MOVWF z2 ;kopiere W-Register nach z2
middle
MOVLW D'70' ;lade W-Register mit D'70'
MOVWF z3 ;kopiere W-Register nach z3
inner
DECFSZ z3 ;decrementier Register z3 und springe bei 0
GOTO inner ;gehe zu inner
DECFSZ z2 ;decrementier Register z2 und springe bei 0
GOTO middle ;gehe zu middle
DECFSZ z1 ;decrementier Register z1 und springe bei 0
GOTO outer ;gehe zu outer
RETURN
up_zeichen ; Tabelle mit den Werten der Ausgabe
addwf PCL, f ;addiere W-Register zu PCL,f
retlw b'10000000' ;springe aus dem Unterprogramm mit der Übergabe b'10000000'
retlw b'10000000' ;springe aus dem Unterprogramm mit der Übergabe b'10000000'
retlw b'10000000' ;springe aus dem Unterprogramm mit der Übergabe b'10000000'
retlw b'10000000' ;springe aus dem Unterprogramm mit der Übergabe b'10000000'
retlw b'10000000' ;springe aus dem Unterprogramm mit der Übergabe b'10000000'
retlw b'11000000' ;springe aus dem Unterprogramm mit der Übergabe b'11000000'
retlw b'01000000' ;springe aus dem Unterprogramm mit der Übergabe b'01000000'
retlw b'11000000' ;springe aus dem Unterprogramm mit der Übergabe b'11000000'
retlw b'01000000' ;springe aus dem Unterprogramm mit der Übergabe b'01000000'
retlw b'01000000' ;springe aus dem Unterprogramm mit der Übergabe b'01000000'
retlw b'11100000' ;springe aus dem Unterprogramm mit der Übergabe b'11100000'
retlw b'00100000' ;springe aus dem Unterprogramm mit der Übergabe b'00100000'
retlw b'11100000' ;springe aus dem Unterprogramm mit der Übergabe b'11100000'
retlw b'00100000' ;springe aus dem Unterprogramm mit der Übergabe b'00100000'
retlw b'00100000' ;springe aus dem Unterprogramm mit der Übergabe b'00100000'
retlw b'11110000' ;springe aus dem Unterprogramm mit der Übergabe b'11110000'
retlw b'00010000' ;springe aus dem Unterprogramm mit der Übergabe b'00010000'
retlw b'11110000' ;springe aus dem Unterprogramm mit der Übergabe b'11110000'
retlw b'00010000' ;springe aus dem Unterprogramm mit der Übergabe b'00010000'
retlw b'00010000' ;springe aus dem Unterprogramm mit der Übergabe b'00010000'
retlw b'11111000' ;springe aus dem Unterprogramm mit der Übergabe b'11111000'
retlw b'10001000' ;springe aus dem Unterprogramm mit der Übergabe b'10001000'
retlw b'11111000' ;springe aus dem Unterprogramm mit der Übergabe b'11111000'
retlw b'10001000' ;springe aus dem Unterprogramm mit der Übergabe b'10001000'
retlw b'10001000' ;springe aus dem Unterprogramm mit der Übergabe b'10001000'
retlw b'01111100' ;springe aus dem Unterprogramm mit der Übergabe b'01111100'
retlw b'01000100' ;springe aus dem Unterprogramm mit der Übergabe b'01000100'
retlw b'01111100' ;springe aus dem Unterprogramm mit der Übergabe b'01111100'
retlw b'01000100' ;springe aus dem Unterprogramm mit der Übergabe b'01000100'
retlw b'01000100' ;springe aus dem Unterprogramm mit der Übergabe b'01000100'
retlw b'00111110' ;springe aus dem Unterprogramm mit der Übergabe b'00111110'
retlw b'00100010' ;springe aus dem Unterprogramm mit der Übergabe b'00100010'
retlw b'00111110' ;springe aus dem Unterprogramm mit der Übergabe b'00111110'
retlw b'00100010' ;springe aus dem Unterprogramm mit der Übergabe b'00100010'
retlw b'00100010' ;springe aus dem Unterprogramm mit der Übergabe b'00100010'
retlw b'00011111' ;springe aus dem Unterprogramm mit der Übergabe b'00000000'
retlw b'00010001' ;springe aus dem Unterprogramm mit der Übergabe b'00010001'
retlw b'00011111' ;springe aus dem Unterprogramm mit der Übergabe b'00000000'
retlw b'00010001' ;springe aus dem Unterprogramm mit der Übergabe b'00010001'
retlw b'00010001' ;springe aus dem Unterprogramm mit der Übergabe b'00010001'
retlw b'00001111' ;springe aus dem Unterprogramm mit der Übergabe b'00001111'
retlw b'00001000' ;springe aus dem Unterprogramm mit der Übergabe b'00001000'
retlw b'00001111' ;springe aus dem Unterprogramm mit der Übergabe b'00001111'
retlw b'00001000' ;springe aus dem Unterprogramm mit der Übergabe b'00001000'
retlw b'00001000' ;springe aus dem Unterprogramm mit der Übergabe b'00001000'
retlw b'00000111' ;springe aus dem Unterprogramm mit der Übergabe b'00000111'
retlw b'00000100' ;springe aus dem Unterprogramm mit der Übergabe b'00000100'
retlw b'00000111' ;springe aus dem Unterprogramm mit der Übergabe b'00000111'
retlw b'00000100' ;springe aus dem Unterprogramm mit der Übergabe b'00000100'
retlw b'00000100' ;springe aus dem Unterprogramm mit der Übergabe b'00000100'
retlw b'00000011' ;springe aus dem Unterprogramm mit der Übergabe b'00000011'
retlw b'00000010' ;springe aus dem Unterprogramm mit der Übergabe b'00000010'
retlw b'00000011' ;springe aus dem Unterprogramm mit der Übergabe b'00000011'
retlw b'00000010' ;springe aus dem Unterprogramm mit der Übergabe b'00000010'
retlw b'00000010' ;springe aus dem Unterprogramm mit der Übergabe b'00000010'
retlw b'00000001' ;springe aus dem Unterprogramm mit der Übergabe b'00000001'
retlw b'00000001' ;springe aus dem Unterprogramm mit der Übergabe b'00000001'
retlw b'00000001' ;springe aus dem Unterprogramm mit der Übergabe b'00000001'
retlw b'00000001' ;springe aus dem Unterprogramm mit der Übergabe b'00000001'
retlw b'00000001' ;springe aus dem Unterprogramm mit der Übergabe b'00000001'
retlw b'00000000' ;springe aus dem Unterprogramm mit der Übergabe b'00000000'
retlw b'00000000' ;springe aus dem Unterprogramm mit der Übergabe b'00000000'
retlw b'00000000' ;springe aus dem Unterprogramm mit der Übergabe b'00000000'
retlw b'00000000' ;springe aus dem Unterprogramm mit der Übergabe b'00000000'
retlw b'00000000' ;springe aus dem Unterprogramm mit der Übergabe b'00000000'
;------------------------
up_initmax ;max initialisierung
Banksel TRISB ;Umschalten auf die Datenspeicherbank TRISB
bcf TRISB,1 ;lösche Bit des Registers TRISB,1
bcf TRISB,2 ;lösche Bit des Registers TRISB,2
bcf TRISB,0 ;lösche Bit des Registers TRISB,0
Banksel PORTB ;Umschalten auf die Datenspeicherbank PORTB
bsf PORTB,1 ;setze PORTB,1 LOAD_PORT
bcf PORTB,2 ;lösche PORTB,2 CLK_PORT
call clear ;rufe clear auf
movlw b'00001111';lade W-Register mit D'170'
call intensity ;rufe clear auf
movlw b'11111111';lade W-Register mit D'170'
call decodemode ;rufe clear auf
movlw b'00000111';lade W-Register mit D'170'
call scanlimit ;rufe clear auf
movlw b'00000001';lade W-Register mit D'170'
call shutdown ;rufe clear auf
movlw b'00000000';lade W-Register mit D'170'
call displaytest ;rufe clear auf
return ;zurück
send ;senden
movf register,w ;kopiere Register
movwf sendregister;kopiere W-Register nach z2
movlw d'16' ;lade W-Register mit D'170'
bcf PORTB,1 ;lösche PORTB,1
sendloop ;sendenschleife
bcf PORTB,0 ;lösche PORTB,0
btfsc sendregister,7 ;teste sendregister,7 und springe wenn gelöscht
bsf PORTB,0 ;setze PORTB,0
rlf value,f ;rotiere value,f nach links durch carryflag
rlf sendregister,f ;rotiere sendregister,f nach links durch carryflag
bsf PORTB,2 ;setze PORTB,2
nop ;keine Operation
bcf PORTB,2 ;lösche PORTB,2
addlw 0xff ;addiere Arbeitsregister mit 0xff
btfss STATUS,Z ;teste STATUS,Z und springe wenn gesetzt
goto sendloop ;geh zu sendloop
bsf PORTB,1 ;setze PORTB,1
return ;zurück
decodemode ;decodemode
movwf value ;kopiere W-Register nach value
movlw b'00001001' ;lade W-Register mit b'00001001'
movwf register ;kopiere W-Register nach register
goto send ;gehe zu send
intensity ;intensity
movwf value ;kopiere W-Register nach value
movlw b'00001010' ;lade W-Register mit b'00001010'
movwf register ;kopiere W-Register nach register
goto send ;gehe zu send
scanlimit ;scanlimit
movwf value ;kopiere W-Register nach value
movlw b'00001011' ;lade W-Register mit b'00001011'
movwf register ;kopiere W-Register nach register
goto send ;gehe zu send
displayon ;displayon
movlw b'00000001';lade W-Register mit b'00000001'
goto shutdown ;gehe zu shutdown
displayoff ;displayoff
movlw b'00000000';lade W-Register mit b'00000000'
shutdown ;shutdown
movwf value ;kopiere W-Register nach value
movlw b'00001100' ;lade W-Register mit b'00001100'
movwf register ;kopiere W-Register nach register
goto send ;gehe zu send
displaytest ;displaytest
movwf value ;kopiere W-Register nach value
movlw b'00001111' ;lade W-Register mit b'00001111'
movwf register ;kopiere W-Register nach register
goto send ;gehe zu send
clear
movlw 0x00 ;lade W-Register mit D'170'
goto send ;gehe zu send
END ;Programmende
Könnt ihr mir sagen wo der Fehler liegt?
Ach ja es werden übrigens nur 4 LED´s von der D-M-Anzeige angezeigt![/list]
Variablenfestlegung:
CBLOCK H'20'
variable1 ; das Wort variable1 entspricht der Adresse H'20'
zaehl ; das Wort zaehl entspricht der Adresse H'21'
register
sendregister
value
temp
z1
z2
z3
ENDC
Hauptprogamm und unterprogramm:
;*****************
;* Hauptprogramm *
;*****************
main
BSF PORTB,1 ;setze Bit des Registers PORTB,1
GOTO up_initmax ;gehe zu up_initmax
GOTO up_zeichen ;gehe zu up_zeichen
GOTO up_warte ;gehe zu up_warten
GOTO main ;gehe zu main
;******************
;* Unterprogramme *
;******************
up_warte ;warteschleife
MOVLW D'170' ;lade W-Register mit D'170'
MOVWF z1 ;kopiere W-Register nach z1
outer
MOVLW D'120' ;lade W-Register mit D'120'
MOVWF z2 ;kopiere W-Register nach z2
middle
MOVLW D'70' ;lade W-Register mit D'70'
MOVWF z3 ;kopiere W-Register nach z3
inner
DECFSZ z3 ;decrementier Register z3 und springe bei 0
GOTO inner ;gehe zu inner
DECFSZ z2 ;decrementier Register z2 und springe bei 0
GOTO middle ;gehe zu middle
DECFSZ z1 ;decrementier Register z1 und springe bei 0
GOTO outer ;gehe zu outer
RETURN
up_zeichen ; Tabelle mit den Werten der Ausgabe
addwf PCL, f ;addiere W-Register zu PCL,f
retlw b'10000000' ;springe aus dem Unterprogramm mit der Übergabe b'10000000'
retlw b'10000000' ;springe aus dem Unterprogramm mit der Übergabe b'10000000'
retlw b'10000000' ;springe aus dem Unterprogramm mit der Übergabe b'10000000'
retlw b'10000000' ;springe aus dem Unterprogramm mit der Übergabe b'10000000'
retlw b'10000000' ;springe aus dem Unterprogramm mit der Übergabe b'10000000'
retlw b'11000000' ;springe aus dem Unterprogramm mit der Übergabe b'11000000'
retlw b'01000000' ;springe aus dem Unterprogramm mit der Übergabe b'01000000'
retlw b'11000000' ;springe aus dem Unterprogramm mit der Übergabe b'11000000'
retlw b'01000000' ;springe aus dem Unterprogramm mit der Übergabe b'01000000'
retlw b'01000000' ;springe aus dem Unterprogramm mit der Übergabe b'01000000'
retlw b'11100000' ;springe aus dem Unterprogramm mit der Übergabe b'11100000'
retlw b'00100000' ;springe aus dem Unterprogramm mit der Übergabe b'00100000'
retlw b'11100000' ;springe aus dem Unterprogramm mit der Übergabe b'11100000'
retlw b'00100000' ;springe aus dem Unterprogramm mit der Übergabe b'00100000'
retlw b'00100000' ;springe aus dem Unterprogramm mit der Übergabe b'00100000'
retlw b'11110000' ;springe aus dem Unterprogramm mit der Übergabe b'11110000'
retlw b'00010000' ;springe aus dem Unterprogramm mit der Übergabe b'00010000'
retlw b'11110000' ;springe aus dem Unterprogramm mit der Übergabe b'11110000'
retlw b'00010000' ;springe aus dem Unterprogramm mit der Übergabe b'00010000'
retlw b'00010000' ;springe aus dem Unterprogramm mit der Übergabe b'00010000'
retlw b'11111000' ;springe aus dem Unterprogramm mit der Übergabe b'11111000'
retlw b'10001000' ;springe aus dem Unterprogramm mit der Übergabe b'10001000'
retlw b'11111000' ;springe aus dem Unterprogramm mit der Übergabe b'11111000'
retlw b'10001000' ;springe aus dem Unterprogramm mit der Übergabe b'10001000'
retlw b'10001000' ;springe aus dem Unterprogramm mit der Übergabe b'10001000'
retlw b'01111100' ;springe aus dem Unterprogramm mit der Übergabe b'01111100'
retlw b'01000100' ;springe aus dem Unterprogramm mit der Übergabe b'01000100'
retlw b'01111100' ;springe aus dem Unterprogramm mit der Übergabe b'01111100'
retlw b'01000100' ;springe aus dem Unterprogramm mit der Übergabe b'01000100'
retlw b'01000100' ;springe aus dem Unterprogramm mit der Übergabe b'01000100'
retlw b'00111110' ;springe aus dem Unterprogramm mit der Übergabe b'00111110'
retlw b'00100010' ;springe aus dem Unterprogramm mit der Übergabe b'00100010'
retlw b'00111110' ;springe aus dem Unterprogramm mit der Übergabe b'00111110'
retlw b'00100010' ;springe aus dem Unterprogramm mit der Übergabe b'00100010'
retlw b'00100010' ;springe aus dem Unterprogramm mit der Übergabe b'00100010'
retlw b'00011111' ;springe aus dem Unterprogramm mit der Übergabe b'00000000'
retlw b'00010001' ;springe aus dem Unterprogramm mit der Übergabe b'00010001'
retlw b'00011111' ;springe aus dem Unterprogramm mit der Übergabe b'00000000'
retlw b'00010001' ;springe aus dem Unterprogramm mit der Übergabe b'00010001'
retlw b'00010001' ;springe aus dem Unterprogramm mit der Übergabe b'00010001'
retlw b'00001111' ;springe aus dem Unterprogramm mit der Übergabe b'00001111'
retlw b'00001000' ;springe aus dem Unterprogramm mit der Übergabe b'00001000'
retlw b'00001111' ;springe aus dem Unterprogramm mit der Übergabe b'00001111'
retlw b'00001000' ;springe aus dem Unterprogramm mit der Übergabe b'00001000'
retlw b'00001000' ;springe aus dem Unterprogramm mit der Übergabe b'00001000'
retlw b'00000111' ;springe aus dem Unterprogramm mit der Übergabe b'00000111'
retlw b'00000100' ;springe aus dem Unterprogramm mit der Übergabe b'00000100'
retlw b'00000111' ;springe aus dem Unterprogramm mit der Übergabe b'00000111'
retlw b'00000100' ;springe aus dem Unterprogramm mit der Übergabe b'00000100'
retlw b'00000100' ;springe aus dem Unterprogramm mit der Übergabe b'00000100'
retlw b'00000011' ;springe aus dem Unterprogramm mit der Übergabe b'00000011'
retlw b'00000010' ;springe aus dem Unterprogramm mit der Übergabe b'00000010'
retlw b'00000011' ;springe aus dem Unterprogramm mit der Übergabe b'00000011'
retlw b'00000010' ;springe aus dem Unterprogramm mit der Übergabe b'00000010'
retlw b'00000010' ;springe aus dem Unterprogramm mit der Übergabe b'00000010'
retlw b'00000001' ;springe aus dem Unterprogramm mit der Übergabe b'00000001'
retlw b'00000001' ;springe aus dem Unterprogramm mit der Übergabe b'00000001'
retlw b'00000001' ;springe aus dem Unterprogramm mit der Übergabe b'00000001'
retlw b'00000001' ;springe aus dem Unterprogramm mit der Übergabe b'00000001'
retlw b'00000001' ;springe aus dem Unterprogramm mit der Übergabe b'00000001'
retlw b'00000000' ;springe aus dem Unterprogramm mit der Übergabe b'00000000'
retlw b'00000000' ;springe aus dem Unterprogramm mit der Übergabe b'00000000'
retlw b'00000000' ;springe aus dem Unterprogramm mit der Übergabe b'00000000'
retlw b'00000000' ;springe aus dem Unterprogramm mit der Übergabe b'00000000'
retlw b'00000000' ;springe aus dem Unterprogramm mit der Übergabe b'00000000'
;------------------------
up_initmax ;max initialisierung
Banksel TRISB ;Umschalten auf die Datenspeicherbank TRISB
bcf TRISB,1 ;lösche Bit des Registers TRISB,1
bcf TRISB,2 ;lösche Bit des Registers TRISB,2
bcf TRISB,0 ;lösche Bit des Registers TRISB,0
Banksel PORTB ;Umschalten auf die Datenspeicherbank PORTB
bsf PORTB,1 ;setze PORTB,1 LOAD_PORT
bcf PORTB,2 ;lösche PORTB,2 CLK_PORT
call clear ;rufe clear auf
movlw b'00001111';lade W-Register mit D'170'
call intensity ;rufe clear auf
movlw b'11111111';lade W-Register mit D'170'
call decodemode ;rufe clear auf
movlw b'00000111';lade W-Register mit D'170'
call scanlimit ;rufe clear auf
movlw b'00000001';lade W-Register mit D'170'
call shutdown ;rufe clear auf
movlw b'00000000';lade W-Register mit D'170'
call displaytest ;rufe clear auf
return ;zurück
send ;senden
movf register,w ;kopiere Register
movwf sendregister;kopiere W-Register nach z2
movlw d'16' ;lade W-Register mit D'170'
bcf PORTB,1 ;lösche PORTB,1
sendloop ;sendenschleife
bcf PORTB,0 ;lösche PORTB,0
btfsc sendregister,7 ;teste sendregister,7 und springe wenn gelöscht
bsf PORTB,0 ;setze PORTB,0
rlf value,f ;rotiere value,f nach links durch carryflag
rlf sendregister,f ;rotiere sendregister,f nach links durch carryflag
bsf PORTB,2 ;setze PORTB,2
nop ;keine Operation
bcf PORTB,2 ;lösche PORTB,2
addlw 0xff ;addiere Arbeitsregister mit 0xff
btfss STATUS,Z ;teste STATUS,Z und springe wenn gesetzt
goto sendloop ;geh zu sendloop
bsf PORTB,1 ;setze PORTB,1
return ;zurück
decodemode ;decodemode
movwf value ;kopiere W-Register nach value
movlw b'00001001' ;lade W-Register mit b'00001001'
movwf register ;kopiere W-Register nach register
goto send ;gehe zu send
intensity ;intensity
movwf value ;kopiere W-Register nach value
movlw b'00001010' ;lade W-Register mit b'00001010'
movwf register ;kopiere W-Register nach register
goto send ;gehe zu send
scanlimit ;scanlimit
movwf value ;kopiere W-Register nach value
movlw b'00001011' ;lade W-Register mit b'00001011'
movwf register ;kopiere W-Register nach register
goto send ;gehe zu send
displayon ;displayon
movlw b'00000001';lade W-Register mit b'00000001'
goto shutdown ;gehe zu shutdown
displayoff ;displayoff
movlw b'00000000';lade W-Register mit b'00000000'
shutdown ;shutdown
movwf value ;kopiere W-Register nach value
movlw b'00001100' ;lade W-Register mit b'00001100'
movwf register ;kopiere W-Register nach register
goto send ;gehe zu send
displaytest ;displaytest
movwf value ;kopiere W-Register nach value
movlw b'00001111' ;lade W-Register mit b'00001111'
movwf register ;kopiere W-Register nach register
goto send ;gehe zu send
clear
movlw 0x00 ;lade W-Register mit D'170'
goto send ;gehe zu send
END ;Programmende
Könnt ihr mir sagen wo der Fehler liegt?
Ach ja es werden übrigens nur 4 LED´s von der D-M-Anzeige angezeigt![/list]