Hochzählen & Reset (Interrupts)

Einführung

Dieses Beispiel ist recht einfach gehalten. Ziel ist es mithilfe eines Tasters einen Zähler bei jedem Tastendruck um 1 zu erhöhen und mithilfe eines anderen Tasters diesen wiederum zurückzusetzen.

Taster 1 (Inkrement) ist an Port 3.2 angeschlossen und agiert somit als Interrupt 0 in diesem Programm. Taster 2 (Reset) ist an Port 3.3 angeschlossen und agiert als Interrupt 1. Der Zähler befindet sich an Port 2. Sobald also Taster 1 gedrückt wird, wird P2 um 1 erhöht. Sobald Taster 2 gedrückt wird, wird P2 zurückgesetzt auf 0.

 

Quelltext

$NOMOD51                  //Vordefinitionen vergessen
#include <at89c5131.h>    //Neue Definitionen einbinden

cseg at 0x0000            //Nachfolgende Befehle betreffen das Code-Segment ab Adresse 0x0000
jmp main                  //Springe zu "main"
cseg at 0x0003            //Nachfolgende Befehle betreffen das Code-Segment ab Adresse 0x0003
jmp inkrement             //Springe zu "inkrement"
cseg at 0x0013            //Nachfolgende Befehle betreffen das Code-Segment ab Adresse 0x0013
jmp reset                 //Springe zu "reset"

main:                     //Sprungmarke "main"
   setb it0               //setze Flanken-Modus bei INT0 
   setb it1               //setze Flanken-Modus bei INT1
   setb ex0               //INT0 freischalten
   setb ex1               //INT1 freischalten
   setb ea                //Alle Interrupts "generell" freischalten
   mov p2,#0              //Zaehler auf 0 setzen
   loop:                  //Endlosschleife
      jmp loop            //Springe zu "loop"
 
inkrement:                //Sprungmarke "inkrement"
   inc p2                 //Zaehler inkrementieren
   reti                   //ISR verlassen

reset:                    //Sprungmarke "reset"
   mov p2,#0              //Zaehler zurücksetzen
   reti                   //ISR verlassen
 
end                       //Programmende