/*****************************************************************************//*                                                                           *//*                        Tastatur am Analog-Eingang AIN-7                   *//*                        ================================                   *//*                                                                           *//*    Name:	        ana_tast.c                                               *//*    Funktion:	    Betrieb einer Tastatur am Analog-Eingang AIN-7           *//*    Autor:        v.Bg. / Gr.                                              *//*    Stand:        15.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/*****************************************************************************//*** 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");         // Bildschirm löschen}/********************************************************************************//*** 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++);   }  }/*****************************************************************************//*** Einlesen eines A/D-Wandler-Kanals ***************************************/unsigned int adc_in (unsigned int knr){   unsigned int mw;      // Kanal einstellen   	switch (knr)	    	{               case '0':   CS3=0; CS2=0; CS1=0; CS0=0;                           break;               case '1':   CS3=0; CS2=0; CS1=0; CS0=1;                           break;               case '2':   CS3=0; CS2=0; CS1=1; CS0=0;                           break;               case '3':   CS3=0; CS2=0; CS1=1; CS0=1;                           break;  	               case '4':   CS3=0; CS2=1; CS1=0; CS0=0;                           break;               case '5':   CS3=0; CS2=1; CS1=0; CS0=1;                           break;                 case '6':   CS3=0; CS2=1; CS1=1; CS0=0;                           break;               case '7':   CS3=0; CS2=1; CS1=1; CS0=1;                           break;               case '8':   CS3=1; CS2=0; CS1=0; CS0=0;                           break;           }           // Start der Wandlung: Single Conversion           SCONV=1;                      // Warten auf ´NOT Busy´ ==> BUSY-Bit = 0, dann fertig           while (ADCCON3!=0);           // Ergebnis einlesen und auswerten           mw=(ADCDATAH & 0x0f)*256+ADCDATAL;     // Meßwert bestimmen                      // Rückgabewert           return(mw);}/*****************************************************************************//*****************************************************************************//*****************************************************************************//*****************************************************************************//* Start des Hauptprogramms                                                  *//*****************************************************************************/void main(void)  {                         // Variablen für das Hauptprogramm   unsigned int wert;		// 12 Bit Wandlungsergebnis   // Initialisieurng der ser. Schnittstelle   ser_init();      // Bildschirm löschen   clear_screen();   // Titel-Meldung   printf("Tastatur am Analog-Eingang AIN-7:\n\n\n");   // Einstellung des ADC´s:   /*  ADCCON1:    - ADC - Normal Mode                   - ADC-Clock-Divider: 2                   - ADC-Track-and-Hold-Time: 2                   - T2-Conversion-Bit: disable                   - External Trigger: disable                   ===>                            */   ADCCON1=0x54;   	// Endlos-Schleife	while(1)	    {           // Erst eine 'Blind-Wandlung': Single Conversion           wert=adc_in('7');                                 // Start der Haupt-Wandlung: Single Conversion           wert=adc_in('7');           // Vergleich: Meßwert <---> gedrückte Taste                                  if (wert >= 3937 ) printf("-");	// Wurde Taste betätigt? Nein, dann "-" ausgeben!	          else 							// Wenn ja, Textausgabe Taste x!   		    {	    	      if (wert < 185 ) printf("\n   Taste 0! ");		          else if (wert < 605 ) printf("\n   Taste 1! ");		          else if (wert < 1000) printf("\n   Taste 2! ");   		      	  else if (wert < 1427) printf("\n   Taste 3! ");                  else if (wert < 1847) printf("\n   Taste 4! ");		          else if (wert < 2263) printf("\n   Taste 5! ");		          else if (wert < 2692) printf("\n   Taste 6! ");   		          else if (wert < 3103) printf("\n   Taste 7! ");	    	      else if (wert < 3511) printf("\n   Taste 8! ");		          else if (wert < 3937) printf("\n   Taste 9! ");                 printf("  # %i #\n",wert);			    }	        wait_10ms(3);     }}