;**************************************************** ;* * ;* LED-Laufschrift * ;* * ;**************************************************** ; Quarzfrequenz: 12MHz max_clock equ P3.5 ;Clock-Eingang an Max max_load equ P3.6 ;Load-Eingang an Max max_din equ P3.7 ;Daten-Eingang an Max led_end bit 00h ;Steuerbit Schrift zuende control bit 01h ;Steuerbit für die Gechwindigkeit displ_clr bit 02h displ bit 03h max_adresse equ 21h ;Speicherort der Adresse des Max´s max_daten equ 22h ;Speicherort der Daten an den Max dpth equ 23h dptl equ 24h dpthm equ 25h dptlm equ 26h dpl_ascii equ 27h dph_ascii equ 28h rows_compl equ 29h display equ 30h displ_akt equ 31h module equ 8 ;Anzahl der verwendeten Module rows equ 8 ;Anzahl der Spalten pro Modul intensity equ 5 ;Helligkeit der Laufschrift vmax equ 8 ;Geschwindigkeit der Schrift org 000h ajmp main ;*********Einsprungadresse bei Timer 0 Überlauf org 0bh ;Einsprungadresse in das Programm bei Timer 0 Überlauf mov TH0,#04Ch ;Timer 0 High-Byte laden mov TL0,#000h ;Timer 0 Low-Byte laden inc r7 ;Inkrementieren vom Akku cjne r7,#vmax,time setb control time: reti ;Rücksprung aus dem Interrupt ;*********Hauptprogramm org 0100h main: mov sp,#031h ;Stackpointer auf Wert hinter Variablen setzen lcall init ;UP Aufruf der Initialisierung der Laufschrift lcall erase ;UP Aufruf zum Löschen der Anzeige lcall max_init ;UP Aufruf zur Initialisierung des Max´s ;jnb ri,$ lcall serin loop: lcall speed lcall led ;UP Aufruf zur Datenausgabe jnb displ_clr, wait setb displ wait: wait1: jnb control,wait clr control jnb led_end,loop ;Neue Initialisierung der Laufschrift wenn led_end gesetzt lcall init ;UP Aufruf der Initialisierung der Laufschrift lcall max_init ;UP Aufruf zur Initialisierung des Max´s lcall erase sjmp loop ;Sprung zur Marke Loop ;*********Programminitialisierung ;Herstellen eines definierten Grunzustandes. init: mov r0,#0 ;Löschen von r0 mov r1,#0 ;Löschen von r1 mov r2,#0 ;Löschen von r2 mov r3,#0 ;Löschen von r3 mov r4,#module ;r4 mit der Anzahl der angeschlossenen Module mov r5,#1 ;r5 mit dem Wert 1 Laden mov r6,#0 mov r7,#0 mov display,#0 mov displ_akt,#0 clr max_load ;Rücksetzen vom Load-Pin clr max_clock ;Rücksetzen vom Clock-Pin clr max_din ;Rücksetzen vom Daten-Pin clr led_end ;Steuerbit Zurücksetzen clr control clr displ_clr clr displ mov a,#module mov b,#rows mul ab mov rows_compl,a mov 0D2h,#02h mov 0a2h,#1 mov dptr,#00h ;Datenpointer mit Startwert des Text´s laden mov dptl,dpl mov dpth,dph mov dptlm,dpl mov dpthm,dph mov r2,dptl mov r0,dpth mov 8fh,#01h mov PCON,#00h mov TMOD,#22h mov TH1, #243 mov TL1, #243 setb TCON.6 mov SCON,#80 clr p0.0 setb ti ret ;Rücksprung aus UP serin: jnb ri,$ mov a,sbuf inc r6 cjne a,#5ah,next5 clr ri mov a,#0aah lcall eeprom_in lcall programm mov 0a2h,#1 mov dptr,#00h ret next5: mov 0a2h,#0 mov dptr,#spalten clr c subb a,#32 mov b,#5 mul ab mov dpl_ascii,a mov dph_ascii,b add a,dpl mov dpl,a jnc next10 inc dph next10: mov a,dph_ascii add a,dph mov dph,a clr ri lcall ascii cjne r6,#10,serin mov r6,#0 setb p0.0 jb ri,serin lcall programm clr p0.0 sjmp serin ascii: mov 0a2h,#0 clr a movc a,@a+dptr inc dptr inc r7 lcall eeprom_in cjne r7,#5,ascii clr a lcall eeprom_in mov r7,#0 ret eeprom_in: mov 0D2h,#02h mov 0a2h,#1 movx @dptr,a inc dptr ret programm: mov 0D2h,#050h mov 0D2h,#0A0h next4: mov a,0d2h ANL a,#00000001b jnz next4 ret ;*********Leeren der Laufschrift ;Die Anzeige der Laufschrift wird gelöscht sodass alle Led´s AUS sind. erase: mov r4,#module ;Laden von r4 mit der Anzahl der Module erase1: mov max_adresse,r5 ;Auswahl der Zeile der Led-Matrix mov max_daten,#0 ;Löschen der ausgewählten Zeile lcall max_out ;UP Aufruf zur Datenausgabe setb max_load ;Übernahme der Daten in den Max inc r5 ;nächste Zeile auswählen cjne r5,#9,erase1 ;nächste Zeile wenn nicht alle Zeilen eines Modules gelöscht mov r5,#1 ;1. Zeile wählen djnz r4,erase1 ;Modul als gelöscht "abhaken" mov r4,#module ;Laden von r4 mit der Anzahl der Module ret ;Rücksprung aus UP ;*********Geschwindigkeit ;Mithilfe der Dauer der Pause zwischen 2 Anzeige-Schritten wird die Geschwindigkeit ;eingestellt. speed: mov TH0,#03Ch ;Timer 0 High-Byte laden mov TL0,#0B0h ;Timer 0 Low-Byte laden mov TMOD,#21h ;Timer 0 16-bit setb TR0 ;Timer 0 starten mov IE,#082h ;Interrupt freigeben mov r7,#0 ;Pausenregister Rücksetzen ret ;*********Initialisierung der Module ;Setzen der Standard-Einstellungen zum Betreiben der Module. max_init: mov max_adresse,#0Bh ;Register: DIGIT Anzahl mov max_daten,#07h ;8 DIGITS call max_out ;Aufruf des UP´s zur Ausgabe setb max_load ;Übernahme der Daten in den Max mov max_adresse,#09h ;Register: Dekodiermodus mov max_daten,#00h ;Kein Dekodiermodus call max_out ;Aufruf des UP´s zur Ausgabe setb max_load ;Übernahme der Daten in den Max mov max_adresse,#0Ah ;Register: Helligkeit mov max_daten,#intensity ;max. 0Fh--> min. 00h call max_out ;Aufruf des UP´s zur Ausgabe setb max_load ;Übernahme der Daten in den Max mov max_adresse,#0Ch ;Register: Operationsmodus mov max_daten,#01h ;Normalbetrieb call max_out ;Aufruf des UP´s zur Ausgabe setb max_load ;Übernahme der Daten in den Max mov max_adresse,#0Fh ;Register: Operationsmodus mov max_daten,#00h ;Normalbetrieb call max_out ;Aufruf des UP´s zur Ausgabe setb max_load ;Übernahme der Daten in den Max shift: mov max_adresse,#0 ;Schieben der Einstellungen in jedes Modul lcall max_out ;abhängig von der Anzahl der Module setb max_load ;Übernahme der Daten in den Max djnz r4,shift mov r4,#module ret ;Rücksprung aus UP ;*********Auswahl der Zeile und die zugehörigen Daten ;Hier wird das passende Modul und die jeweilige Zeile ausgewählt um den aktuellen Stand ;der Laufschrift anzuzeigen. led: inc r1 clr a mov dpl,r2 ;Aktuellen Zeiger laden mov dph,r0 dec r2 ;Zeiger eine Zeile zurück cjne r2,#255,led1 dec r0 led1: jnb displ,led4 push 6 push acc inc displ_akt mov a,displ_akt mov r6,display cjne a,06h,led5 mov displ_akt,#0 clr displ led5: pop acc pop 6 sjmp led3 led4: mov 0D2h,#02h movx a,@dptr ;Auswahl der Zeile aus dem Text mov 0D2h,#00h cjne a,#0aah,led3 inc display mov a,#0 setb displ_clr mov a,display mov r6,rows_compl cjne a,06h,led6 sjmp ende led6: clr a led3: mov max_adresse,r1 ;benötigte Zeile laden mov max_daten,a ;Zeile aus dem Text zur Datenübergabe vorbereiten lcall max_out ;Ausgabe der Daten an den Max lcall out ;Auswahl des benötigten Moduls setb max_load ;Übernahme der Daten in den Max lcall clear ;Leeren der Max´s cjne r1,#rows,step1 ;Wenn Modul komplett lcall max_init mov r1,#0 ;Zeile 1 vorbereiten (0 da bei Label led inkrementiert wird) inc r3 ;nächstes zu beschreibendes Modul wählen cjne r3,#module,step1 ;wenn noch nicht alle Module beschrieben sind, bis letzte Schriftzeile schreiben sjmp step2 ende: setb led_end ;Steuerbit Laufschrift zuende setzen sjmp step2 ;Ende der Laufschrift step1: mov r6,dptlm mov a,dpl cjne a,06h,led mov r6,dpthm mov a,dph cjne a,06h,led step2: mov r2,dptl mov r0,dpth inc r2 ;nächster Schritt der Schrift-Ausgabe cjne r2,#0,led2 inc r0 led2: mov dptl,r2 mov dpth,r0 mov r1,#0 mov r3,#0 ret ;Rücksprung aus UP ;*********Datenübergabe an die Laufschrift max_out: push acc push 0 CLR MAX_LOAD MOV A,#10000000b MOV R0,A adresse: ANL A,MAX_ADRESSE CLR MAX_DIN jz adresse31 SETB MAX_DIN adresse31: SETB MAX_CLOCK CLR MAX_CLOCK MOV A,R0 RR A MOV R0,A cjne A,#128,adresse MOV R0,A daten: ANL A,MAX_DATEN CLR MAX_DIN jz daten2 SETB MAX_DIN daten2: SETB MAX_CLOCK CLR MAX_CLOCK MOV A,R0 RR A MOV R0,A cjne A,#128,daten pop 0 pop acc ret ;*********Auswahl des richtigen Moduls out: mov a,r3 leer: cjne a,#0,next ret next: mov max_adresse,#0 lcall max_out djnz acc,next ret ;*********Löschen der Bus-Leitung clear: mov a,#module subb a,r3 mov r4,a clear1: mov max_adresse,#0 lcall max_out djnz r4,clear1 mov r4,#module ret spalten: ; Zeichensatz ASCII-Zeichen ab 32(dez.) db 0,0,0,0,0 ; Leerzeichen db 0,0,79,0,0 ; ! db 0,7,0,7,0 ; " db 20,127,20,127,20 ; # db 36,42,127,42,18 ; $ db 35,19,8,100,98 ; % db 54,73,85,34,80 ; & db 0,5,3,0,0 ; ï db 0,28,34,65,0 ; ( db 0,65,34,28,0 ; ) db 20,8,62,8,20 ; * db 8,8,62,8,8 ; + db 0,160,96,0,0 ; , db 8,8,8,8,8 ; - db 0,96,96,0,0 ; . db 32,16,8,4,2 ; / db 62,81,73,69,62 ; 0 db 0,66,127,64,0 ; 1 db 66,97,81,73,70 ; 2 db 33,65,69,71,57 ; 3 db 24,20,18,127,16 ; 4 db 39,69,69,69,57 ; 5 db 60,74,73,73,48 ; 6 db 1,113,9,5,3 ; 7 db 54,73,73,73,54 ; 8 db 6,73,73,41,30 ; 9 db 0,108,108,0,0 ; : db 0,172,108,0,0 ; ; db 8,20,34,65,0 ; < db 20,20,20,20,20 ; = db 0,65,34,20,8 ; > db 2,1,81,9,6 ; ? db 50,73,121,33,62 ; @ db 126,9,9,9,126 ; A db 127,73,73,73,54 ; B db 62,65,65,65,34 ; C db 127,65,65,65,62 ; D db 127,73,73,73,65 ; E db 127,9,9,9,1 ; F db 62,65,73,73,58 ; G db 127,8,8,8,127 ; H db 0,65,127,65,0 ; I db 33,65,65,65,63 ; J db 127,8,20,34,65 ; K db 127,64,64,64,64 ; L db 127,2,4,2,127 ; M db 127,2,4,8,127 ; N db 62,65,65,65,62 ; O db 127,9,9,9,6 ; P db 62,65,81,33,94 ; Q db 127,9,25,41,70 ; R db 70,73,73,73,49 ; S db 1,1,127,1,1 ; T db 63,64,64,64,63 ; U db 31,32,64,32,31 ; V db 63,64,56,64,63 ; W db 99,20,8,20,99 ; X db 7,8,112,8,7 ; Y db 97,81,73,69,67 ; Z db 0,127,65,65,0 ; [ db 2,4,8,16,32 ; \ db 0,65,65,127,0 ; ] db 4,2,1,2,4 ; ^ db 64,64,64,64,64 ; _ db 0,1,2,4,0 ; ` db 32,84,84,84,120 ; a db 127,72,68,68,56 ; b db 56,68,68,68,32 ; c db 56,68,68,72,127 ; d db 56,84,84,84,24 ; e db 8,126,9,1,2 ; f db 24,164,164,164,124 ; g db 127,8,4,4,120 ; h db 0,68,125,64,0 ; i db 0,32,64,68,61 ; j db 0,127,16,40,68 ; k db 0,65,127,64,0 ; l db 124,4,24,4,120 ; m db 124,8,4,4,120 ; n db 56,68,68,68,56 ; o db 248,40,40,40,16 ; p db 16,40,40,48,248 ; q db 124,8,4,4,8 ; r db 72,84,84,84,32 ; s db 4,63,68,64,32 ; t db 60,64,64,32,124 ; u db 28,32,64,32,28 ; v db 60,64,48,64,60 ; w db 68,40,16,40,68 ; x db 24,160,160,160,120 ; y db 68,100,84,76,68 ; z db 0,8,54,65,0 ; { db 0,0,127,0,0 ; | db 0,65,54,8,0 ; } db 8,4,8,16,8 ; ~ db 0,0,0,0,0 ; (ASCII 127 dez.) ;A db 124,18,17,18,124,0 ;B db 127,73,73,54,0 ;C db 28,34,65,65,65,0 ;D db 127,65,65,34,28,0 ;E db 127,73,73,65,0 ;F db 127,9,9,1,0 ;G db 28,34,65,81,50,0 ;H db 127,8,8,8,127,0 ;I db 127,0 ;J db 48,64,64,63,0 ;K db 127,8,20,34,65,0 ;L db 127,64,64,64,0 ;M db 127,2,4,2,127,0 ;N db 127,4,8,16,127,0 ;O db 28,34,65,65,34,28,0 ;P db 127,9,9,6,0 ;Q db 28,34,65,81,34,92,0 ;R db 127,25,41,70,0 ;S db 38,73,73,50,0 ;T db 1,1,127,1,1,0 ;U db 63,64,64,64,63,0 ;V db 3,12,48,64,48,12,3,0 ;W db 63,64,56,64,63,0 ;X db 99,20,8,20,99,0 ;Y db 3,4,120,4,3,0 ;Z db 97,81,73,69,67,0 ;a db 32,84,84,84,120,0 ;b db 127,68,68,56,0 ;c db 56,68,68,68,0 ;d db 56,68,68,127,0 ;e db 56,84,84,84,24,0 ;f db 126,5,1,0 ;g db 24,164,164,164,124,0 ;h db 127,4,4,120,0 ;i db 68,125,64,0 ;j db 64,132,125,0 ;k db 127,16,40,68,0 ;l db 65,127,64,0 ;m db 124,4,120,4,120,0 ;n db 124,8,4,4,120,0 ;o db 56,68,68,68,56,0 ;p db 252,36,36,24,0 ;q db 24,36,36,252,0 ;r db 124,8,4,0 ;s db 72,84,84,84,36,0 ;t db 4,63,68,32,0 ;u db 60,64,64,64,60,0 ;v db 28,32,64,32,28,0 ;w db 60,64,56,64,60,0 ;x db 68,40,16,40,68,0 ;y db 28,160,160,160,124,0 ;z db 68,100,84,96,68,0 ;0 db 62,81,73,69,62,0 ;1 db 4,2,127,0 ;2 db 66,97,81,73,70,0 ;3 db 34,65,73,73,54,0 ;4 db 16,24,20,18,127,0 ;5 db 39,69,69,69,57,0 ;6 db 60,74,73,73,48,0 ;7 db 1,113,9,5,3,0 ;8 db 54,73,73,73,54,0 ;9 db 6,73,73,73,62,0 ;- db 8,8,8,8,0 ;* db 20,8,62,8,20,0 ;. db 96,96,0 ;LEER db 0,0,0,0 ;LEERFELD 0,0,0,0,0,0,0,0 end