#include ;------------------------------------------------ ; Reservierung des Stack-Bereichs ?STACK SEGMENT IDATA ;?STACK im indirekt adressierbaren internen RAM RSEG ?STACK ;?STACK-Segment waehlen DS 10H ;Reserviere z.B. 16Byte Stack ;------------------------------------------------ ; Reserviere Speicherplatz fur Variablen im int. direkt adressierbaren RAM dir_daten SEGMENT DATA ;deklariere Datensegment RSEG dir_daten ;waehle Datensegment zahl: DS 1 ;Zaehlerbytes anlegen ;------------------------------------------------ ; Reserviere Speicherplatz fur Bitvariablen bit_daten SEGMENT BIT ;deklariere Datensegment RSEG bit_daten ;waehle Datensegment aspur: dbit 1 ;Zaehlerbits anlegen aspuralt: dbit 1 bspur: dbit 1 ;------------------------------------------------------------------------------ ; Auf Adresse 0 im Code-Speicher muss ein LJMP zum Programmanfang stehen CSEG AT 0 ;absolutes Code-Segment bei Adresse 0 ljmp start ;Springe zur Marke start ;------------------------------------------------------------------------------ ; Interrupt Vektoren cseg at 0bh ljmp auswertung ;------------------------------------------------------------------------------ ; Hier folgt Programmcode (Code-Beginn ueber Linker festgelegt) program_code SEGMENT CODE RSEG program_code ;waehle Code-Segment USING 0 ;Zeige Benuetzung von Registerbank 0 fuer den folgenden Programmcode an ;------------------------------------------------------------------------------ ; Initialisierung Stack und I/O-Karte start: mov sp,#?stack-1 ;STACK-Definition orl clkreg,#01h ;x2-Modus (6 Takte pro Befehl) ;------------------------------------------------------------------------------ setb ea ;Interrupts zulassen orl tmod,#01h ;tmod einstellen anl tmod,#0f1h mov tl0,#0efh ;timerbeginn mov th0,#0d8h setb tr0 ;timer einschalten mov c,p3.2 ;aspur vorladen mov aspur,c mov zahl,#0 ;Zahl vordefinieren loop: mov a,zahl ;Zahl ausgeben cpl a mov p0,a setb et0 ;Pause für Interrupt nop clr et0 ljmp loop ;Hauptschleife ;------------------------------------------------------------------------------ auswertung: ;Timer Interrupt 0 clr tr0 ;timerbeginn erneut einstellen mov tl0,#0efh mov th0,#0d8h setb tr0 mov c,aspur ;alten Zustand verschieben mov aspuralt,c mov c,p3.2 ;aktuellen Zustand speichern mov aspur,c mov c,p3.3 mov bspur,c mov c,aspur ;beide 1? anl c,aspuralt jc endinterrupt mov c,aspur ;beide 0? orl c,aspuralt jnc endinterrupt mov c,aspur ;revers1? anl c,bspur jc revers mov c,aspur ;revers2? orl c,bspur jnc revers inc zahl ;forward endinterrupt: reti revers: dec zahl ;revers ljmp endinterrupt ;------------------------------------------------------------------------------ END ;END Of File