Ampelschaltung002 verbessert-1 2006-05-27 16:50:46 code at 0 include C51RD2.INC mov r0, #0 ;startzuweisung fuer r0 mov a, r0 ;startzuordnung von r0 zu a sjmp init ;überspringen des org-teils org 000bh ;einsprungadresse des timer I sjmp timer ;sprung zum timer-marker intermarkend: ;setzen des end-markers reti ;Interupt-abbruch init: mov TMOD, #00000001b ;nur 16 bit modus des timer eingestellt mov TCON, #00010000b ;ausschalten des timers mov IP, #0 ;keine proritaeten mov TL0, #0F0h ;nötig um 10 milisekunden als interuptzeit - mov TH0, #0D8h ;einzustellen, hier genauso setb ET0 ;timer freischlatung setb EA ;globale freischaltung lcall ampelsprung ;erster aufruf vom UP ampelsprung mainschleife: ;setzen des schleifen-markers sjmp mainschleife ;sprung zum marker, endlosschleife timer: ;setzen des timer-markers mov a, r0 ;r0 geht zu a clr c ;carry-bit löschen subb a, #00000100b ;a minus 4, weil stelle 4 und 0 lange warten jz zeitlang ;wenn eins drüber 0 sprung zu lang-marker mov a, r0 ;r0 geht zu a jz zeitlang ;wenn r0 0 dann ebenfalls lang-marker sjmp zeitkurz ;wenn r0 weder 4 noch 0 sprung zu kurz-marker zeitlang: ;setzen des lang-markers mov r1, #00001010b ;r1 bekommt zahl zugeordnet, 10 für 10 sekunden loop1: ;setzen des loop1-markers mov r2, #01100100b ;r2 bekommt zahl zugewiesen, 100 für 1 sekunde loop2: ;setzen des loop2-markers djnz r2, loop2 ;r2 minus 1, sprung solange wie r2 ungleich 0 ist djnz r1, loop1 ;r1 minus 1, sprung solange wie r1 ungleich 0 ist sjmp abfrage ;weiter zu abfrage-marker zeitkurz: ;setzen des kurz-markers mov r1, #00000011b ;r1 bekommt zahl zugeordnet, 3 für 3 sekunden loop3: ;setzen des loop3-markers mov r2, #01100100b ;r2 bekommt zahl zugewiesen, 100 für 1 sekunde loop4: ;setzen des loop4-markers djnz r2, loop4 ;r2 minus 1, sprung solange wie r2 ungleich 0 ist djnz r1, loop3 ;r1 minus 1, sprung solange wie r1 ungleich 0 ist sjmp abfrage ;weiter zu abfrage-marker abfrage: ;setzen des abfrage-markers inc r0 ;r0 um 1 erhöhen mov a, r0 ;r0 wird a zugewiesen clr c ;löschen des carry-bits subb a, #00001000b ;a minus 8, für endlosdurchlauf der ampel jz reset ;bei 0 sprung zu reset sjmp ausfuehrung ;wenn ungleich 0 zu ausführen weiter reset: ;setzen des reset-markers mov r0, #0 ;r0 wird genullt um neu zu beginnen sjmp intermarkend ;sprung zum end-marker im interupt ausfuehrung: ;setzen des ausführen-markers mov a, r0 ;r0 wird a zugewiesen lcall ampelsprung ;aufruf des UP ampelsprung mov p2, a ;a wird an leds (p2) weitergeleitet sjmp intermarkend ;sprung zum end-marker im interupt ampelsprung: ;zuweisung aus der tabelle, altbekannt mov dptr, #ampelphasen movc a, @a+dptr ret ampelphasen: DB 10000001b, 10000010b, 10000100b, 11000100b, 00100100b, 01000100b, 10000100b, 10000110b