/*****************************************************************************//*                                                                           *//*                   Demo opto-elektr. Drehimpulsgeber                       *//*                   =================================                       *//*                                                                           *//*    Name:	        drehge_1.c                                               *//*    Funktion:	    Demo-Betrieb für opto.-elektr. Drehimpulsgeber           *//*    Autor:        v.Bg. / Gr.                                              *//*    Stand:        10.02.01                                                 *//*                                                                           *//*                                                                           *//*****************************************************************************//*** Allgemeine Festlegungen für den Compiler ***/#pragma DEBUG OBJECTEXTEND CODE/*** Einbinden von Include-Dateien ***/#include <ADuC812.h>                   // Register-Definitionen für ADuC812#include <stdio.h>                     // Standard I/O Funktionen// Port-Festlegungen für den Drehgeber-Betriebsbit KA = P2^0;							// Kanal A = P2.0sbit KB = P2^1;							// Kanal B = P2.1sbit S = P2^2;							// Schalter S = P2.2	                          	/********************************************************************************//* Selbstgeschriebene Funktionen                                                *//********************************************************************************//*** Initialisierung der ser. Schnittstelle auf:   ***//**   9600 Bd, 8 Datenbits, keine Parität          ***/void ser_init(void)   {		SCON=0x52;		TMOD |=0x20;		TH1=0xfd;		TR1=1;		TI=1;   }/*****************************************************************************//*** Bildschirm löschen ***/void clear_screen(void){   printf("\x1b\x48\x1b\x4a");}/*****************************************************************************//*** Wartezeit: Vielfaches von 10ms ******************************************/void wait_10ms(unsigned char Multiplikator) {  unsigned char a;  unsigned int	i;  for(a=0;a<Multiplikator;a++)   {	     for(i=0;i<20000;i++);   }}/*****************************************************************************//*** Bildschirm-Cursor positionieren ***/void set_cursor(unsigned char z, unsigned char s){    printf("\x1b\x59%c%c",(32+z),(32+s));}/*********************************************************************************//*** Aufbau der Bildschirmmaske ***/void bs_mask(void){    unsigned int zw;    zw=0;    clear_screen();    printf("Betrieb des Opto-elektronischen Impulsdrehgebers MRTC25\n");    printf("=======================================================\n");    printf("  (Zaehlbereich:  -128 ..... +127)");    set_cursor(10,2);    printf("Bisher richtungsabhaengig gezaehlte Impulse:");    set_cursor(13,2);    printf("Betaetigung des Tasters:");    set_cursor(13,28); printf("O");    set_cursor(10,49);    printf("%4d",zw);}/********************************************************************************//* Start des Hauptprogramms                                                     *//********************************************************************************/void main ()  {                          // Definition der verwendeten Variablen     signed int z,z_alt,t;    // Initialisierung der seriellen Schnittstelle        ser_init();				    // I/O-Ports parametrieren     // Beachten: nach einem Reset sind die I/O-Ports immer auf Eingang geschaltet !        // Parameter-Werte     z=0;    z_alt=-100;    t=0;    // Bildschirmmaske aufrufen    bs_mask();    // Endloschleife zur Erfassung der Impulse    while (1)	  {        while(KA==0)				// Warten auf Kanal A = 1		  {		    if (S==0)				// Abfrage des Tasters			  {				    set_cursor(13,28);				if (t==0)				  {					printf("X");					t=1;			      }				  else					{					  printf("O");					  t=0;				    }	 	          wait_10ms(5);	    // 500 Millisekunden Wartezeit			  }		  }					if (KB==1)					// Untersuchung von Kanal B		  {			z=z-1;					// links rum  			if (z==-129) z=127;		  }		  else		 	{			  z=z+1;				// rechts rum  			  if (z==128) z=-128;  	 		}			if (z!=z_alt)				// Neuen Zählwert ausgeben 		  {		    set_cursor(10,49);           printf("%4d",z);         			z_alt=z;		  }				while((KA!=0) || (KB!=0));	// Warten, bis beide Kanäle wieder = 0		 	  }    }