$nomod51 ;der Modus fuer 8051 wird abgeschaltet $debug $nolist ;es wird kein Listing fuer reg535 erstellt $include(reg535.pdf) ;die 80535-spezifischen Daten $list ;es wird ein Listing erstellt $ title (ZAEHL2-5.A51) ;------------------------------------------------------------------------ ;Programmbeschreibung ;------------------------------------------------------------------------ ;Programm: ;ZAEHLn-m zaehlt in digitaler Form von n bis n+m und wieder zurück ;Das Programm basiert auf BLIN_INT ;Datum: 2.1.2004 ;Programmiert: J. Walter ; ;Verwendete Einspruenge: keine ; ;Verwendete Unterprogramme: keine ; ; ;Verwendete Register und Variable: ;Registerbank(0) ;R0 Anfangswert = n ;R1 Zaehlw = m ;R2 Zaehlregister n*65536 Mikrosekunden ; ;Kommentar: ; ;Aenderungen: ;Datum: ; ; ;------------------------------------------------------------------------ ;Initialisierungsteil für allgemeine Konstanten ;------------------------------------------------------------------------ USING 0 ;Benutzung von Registerbank 0 V_BLINK EQU 30 ;Blinkfrequenz 30 Dezimal ~ 2 Sekunden ANFANGSW EQU 1 ;Anfangswert zum Zaehlen = n ZAEHLW EQU 5 ;Endwert=Anfangswert+ZAEHLW CSEG AT 0H ;Legt absolute Codesegmentadresse auf 0h jmp INIT ; ;------------------------------------------------------------------------ ;Interrupt-Vektoren ;------------------------------------------------------------------------ ORG 0Bh ;Sprungmarke zur ISR fuer Timer0 TIME_INT0: ;ISR fuer Timer0 (Adresse 0Bh) call ISR_TIMER_0 ;Aufruf: UP Schleife reti ;------------------------------------------------------------------------ ;Initialisierungsteil für On-Chip Peripherie ;------------------------------------------------------------------------ ORG 100H ;Programmstart bei 100H INIT: setb P3.2 ;Lampe ausschalten mov R2,#V_BLINK ;R2 Ist Zaehlvariable mov IEN0,#10010010b ;Generelle Interrupt Freigabe,Freigabe Timer0 Interrupt ;Serielle Interrupt Freigabe mov TMOD,#00000001b ;Modus1: 16 Bit Zaehler/Zeitgeber ;------------------------------------------------------------------------ ;Programmschleife ;------------------------------------------------------------------------ ABFRAGE: jnb P1.1,LAMPE_AN jnb P1.2,LAMPE_AUS jnb P1.3,LAMPE_BLINKT ajmp ABFRAGE LAMPE_AN: clr TR0 ;Timer0 ausschalten setb P3.3 ;Leuchten ausschalten setb P3.4 clr P3.2 ;Licht einschalten ajmp ABFRAGE ;Springe zur Adresse ABFRAGE LAMPE_AUS: clr TR0 ;Timer0 ausschalten setb P3.3 ;Leuchten ausschalten setb P3.4 setb P3.2 ;Licht ausschalten ajmp ABFRAGE ;Springe zur Adresse ABFRAGE LAMPE_BLINKT: mov TL0,#0h ;LOW-Byte Zaehlregister von Timer0 auf 0h setzen mov TH0,#0h ;HIGH-Byte Zaehlregister von Timer0 auf 0h setzen setb TR0 ;Timer0 aktivieren, TF0 wird bei Sprung auf die ;ISR (Adresse 0Bh) von der Hardware wieder zurueck- ;gesetzt mov R0,#ANFANGSW ;Anfangswert = Variable WERT mov R1,#ZAEHLW ;Endwert=R0+R1 clr F0 ;HOCH-RUNTER-BIT = 0 ajmp ABFRAGE ISR_TIMER_0: djnz R2,SPRUNG ;Sprung falls R2 noch nicht 0 ;Jetzt wird gezählt jnb F0,HOCH ;HOCH oder HERAB? HERAB: call AUSGABE ;Inhalt von R0 wird ausgegeben dec R0 ;Wert -1 djnz R1,KEINE_UMKEHR jmp UMKEHR HOCH: call AUSGABE ;Wert von R0 digital ausgeben inc R0 ;Anfangswert+1 djnz R1,KEINE_UMKEHR UMKEHR: cpl F0 ;F0=0 Hochzaehlen mov R1,#ZAEHLW ;Wie weit wird gezaehlt? KEINE_UMKEHR: mov R2,#V_BLINK ;Register 2 erhaelt wieder den Wert V_BLINK SPRUNG: ret AUSGABE: nop mov A,R0 ;Wert ist in A - wird ueber Carry ausgegeben cpl A ;Ausgabe über Leuchten - ist invertiert rrc A ;rechts über Carry shiften mov P3.2,C ;Ausgabe an P3.2 rrc A mov P3.3,C ;Ausgabe an P3.3 rrc A mov P3.4,C ;Ausgabe an P3.4 ret end