21.09.2001

Beispielprogramm:

Mausdaten lesen mit dem kitCON 541

Name des Programmes: Port 15

 

 

// #define MONITOR

#include <stdio.h>                     /* standard I/O .h-file                         */

 

#include <reg51.h>                     /* special function register declarations       */

                                       /* for the intended 8051 derivative             */

 

#define CLRSCR  26                     /* Bildschirmlöschen - nur auf kitCON           */

 

#ifdef MONITOR                       

int gesperrt;

#else                                  /* PUTCHAR.C und GETKEY.C hier integriert       */

extern SerInit(void);

 

#include <absacc.h>

#define XON  0x11

#define XOFF 0x13

char putchar (char c)

{

 if (XBYTE[0xFD05] & 0x01)

   {

    if (XBYTE[0xFD00] == XOFF)

      {

       do

         {

          while (!(XBYTE[0xFD05] & 0x01));

         } while (XBYTE[0xFD00] != XON);

       }

     else XBYTE[0xFD05] |= 0x01;       // RI-Bit wird beim auslesen des Empf.-

                                       // puffers autom. geloescht.

                                       // => man. neusetzen, falls kein XOFF

  }

 while (!(XBYTE[0xFD05] & 0x40));

 return( XBYTE[0xFD00] = c );

}

 

char _getkey ()

  {

   char c;

   do

     {

      while(!(XBYTE[0xFD05] & 0x01));

      c = XBYTE[0xFD00];

     }while ((c == XON) || (c == XOFF));

   return (c);

  }

#endif                                 /* Ende PUTCHAR.C, GETKEY.C                     */

 

 

sbit mouse_data = P3 ^ 0;              // data für Maus

sbit mouse_clock = P3 ^ 3;             // clock für Maus

 

unsigned int mouse;                    // Speicher für Mausdaten (0...10 Bit)

int mousepos = 0;                      // 0...10 Leseposition innerhalb Mausdaten

int mouse_x;                           // Mausposition

bit direction_x;                       // 0-rechts, 1-links                   

int mouse_y;                           // Mausposition

bit direction_y;                       // 0-oben, 1-unten

signed char block = -1;                // -1-inaktiv, 0, 1, 2 jeweiliger Block

 

 

/****************/

/* Interrupts   */

/****************/

 

unsigned char c;

unsigned char daten;

int a, b;

bit start, p, parity, stop;

 

void ExternInterrupt1()

{

   mouse <<= 1;

   mouse |= mouse_data;

   if (++mousepos == 11)

   {

      mouse_clock=0;                   // Maus kann nichts senden

      stop = mouse&1;                  // Stopbit lesen

      mouse >>= 1;

         parity = mouse&1;                // Paritätsbit lesen

      p = 0;

      for (c=0; c<8; c++)              // daten-Byte lesen

      {

         mouse >>= 1;

         daten <<= 1;

         daten |= mouse&1;

            if (mouse&1) p = ~p;

      }

      mouse >>= 1;

      start = mouse&1;                 // Startbit lesen

      if (start) putchar('[');

      if (block == -1)

         {

            c = daten>>4;                 // High drucken

         if (c<10) putchar(c+48); else putchar(c+55);

         c = daten&15;                 // Low drucken

         if (c<10) putchar(c+48); else putchar(c+55);

         }

      if (p==parity) putchar('P');

      if (!stop) putchar(']');

         switch (block)

         {

            case 0:

            {

                 if (daten == 0xFA)         // 0xFA ist OK Antwort (z.B. auf 0xEB)

            {

               putchar('F');

               putchar('A');

            }

            else        

                    {

               if (daten&192) putchar('o');

                  direction_x = (daten&16)>>4;

                  direction_y = (daten&32)>>5;

                       if (daten&1) putchar('l');

                       if (daten&2) putchar('r');

                       if (daten&4) putchar('m');

                       block = 1;

                    }

                    break;

            }

            case 1:

            {         

               if (direction_x) mouse_x -= (256-daten); else mouse_x +=daten;

               printf("x:%d", mouse_x);

                    block = 2;

                    break;

            }

         case 2:

            {

               if (direction_y) mouse_y -= (256-daten); else mouse_y +=daten;

               printf("y:%d", mouse_y);

                    block = 0;

                    break;

            }

         }

         putchar('\n');

      mouse_clock=1;                   // Maus kann wieder senden

         for (c=0; c<20; c++);            // 40us für MouseSystem

      mousepos = 0;

         mouse = 0;                      

      IE1 = 0;                         // auch für MouseSystem

   }

}

 

void Extern1 (void) interrupt 2 using 2

{

   ExternInterrupt1();

}

 

/****************/

/* main program */

/****************/

 

int t1, t2, dat;

 

void main (void)

{

 

#ifdef MONITOR

/*------------------------------------------------

Setup the serial port for 1200 baud at 16MHz.

------------------------------------------------*/

   SCON  = 0x50;                          /* SCON: mode 1, 8-bit UART, enable rcvr        */

   TMOD |= 0x20;                       /* TMOD: timer 1, mode 2, 8-bit reload          */

   TH1   = 221;                        /* TH1:  reload value for 1200 baud @ 16MHz     */

   TR1   = 1;                          /* TR1:  timer 1 run                            */

   TI    = 1;                          /* TI:   set TI to send first char of UART      */

   printf ("Port14 (C)2000 Klaus Rieger\n"); /* Print "(C)..."                         */

#else

   SerInit();                          /* init serial port                             */

   putchar(' ');                       /* send dummy-Byte                              */

   putchar(CLRSCR);

#endif

 

   EA = 1;                             // 0-Interrupts aus, 1-an

   EX1 = 1;                            // externer Interrupt 1 erlauben

   IT1 = 1;                            // 0-LO triggert, 1-edge triggert

 

   mouse_clock = 1;

   mouse_data = 1;

 

   while (1)

   { 

#ifdef MONITOR

      if ((t1==-1)&&(t2==-1));

         else

         {

#endif

      t1 = t2 = -1;

      dat = 0;

         a = getkey();

      if ((47<a)&&(a<58)) t1 = a-48;

         if ((96<a)&&(a<103)) t1 = a-87;

         if (a == 27) dat = 1;

#ifdef MONITOR

         if ((t1==-1)&&(!dat)) printf("\nERROR a=%d ", a);

#endif

         a = getkey();

      if ((47<a)&&(a<58)) t2 = a-48;

         if ((96<a)&&(a<103)) t2 = a-87;

#ifdef MONITOR

         if (t2==-1) printf("\nERROR a=%d ", a);

         }

#endif

         if (dat)

         {

         EA = 0;

#ifdef MONITOR

         printf("\n*%d: ", t2);

#endif

            if (t2==0)

              {

                 if (mousepos==10) putchar('S');

                 else putchar(mousepos+48);

                    putchar('\n');

              }

              if (t2==1)

              {

            mouse_clock = 0;

                    mouse_data = 0;

            for (a=0; a<250; a++);     // 1 ms (exakt)

                  mouse_data = 1;

                 mouse_clock = 1;

              }    

         if (t2==2)

              {

                 putchar(':');

            for (c=0; c<20; c++)       // 0,6 s

               for (a=0; a<10000; a++); 

                    putchar(')');

                    putchar('\n');

              }

         if (t2==3)                    // Koordinaten an/rücksetzen

              {

                 putchar('K');

            block = 0;

                    mouse_x = 0;

                    mouse_y = 0;

                    putchar('\n');

              }

         if (t2==4)                    // Koordinaten aus

              {

                 putchar('A');

            block = -1;

                    putchar('\n');

              }

              IE1 = 0;

         EA = 1;

         }

         else

         {

            if ((t1!=-1)&&(t2!=-1))

              {

            EA = 0;

               dat = t1*16+t2;            // Computer sendet

#ifdef MONITOR

               printf("\n%d: ", dat);

#endif

            mouse_clock = 0;

            for (c=0; c<62; c++);      // 125u

               mouse_data = 0;

            for (c=0; c<125; c++);     // 250u

            mouse_clock = 1;

            parity = 1;

            for (b=0; b<8; b++)

               {

               while (mouse_clock) {};

               for (c=0; c<5; c++); 

                    mouse_data = dat&1;     // Daten senden

                    if (dat&1) parity = ~parity;

#ifdef MONITOR

                    if (mouse_data) putchar('1'); else putchar('0');

                       if (parity) putchar('p');

#endif

                    dat >>= 1;

               while (mouse_clock==0) {};

                  }

            while (mouse_clock) {};

            for (c=0; c<5; c++); 

                 mouse_data = parity;       // Paritätsbit

#ifdef MONITOR

                 if (parity) printf("(p1)"); else printf("(p0)");

#endif

            while (mouse_clock==0) {};

            while (mouse_clock) {};

            for (c=0; c<5; c++); 

                 mouse_data = 1;            // Stopbit

            while (mouse_clock==0) {};

                 while (mouse_clock) {};

                 while (mouse_data==0) {};

                    IE1 = 0;

            EA = 1;

              }

      }

#ifdef MONITOR                         // nur zum Testen,

      if (P3&8) gesperrt = 0;          //  sonst ruft Extern1 ExternInterrupt1 auf

         else                

         {

            if (!(gesperrt&&IT1)) ExternInterrupt1();

              gesperrt = 1;

         }

#endif

   }

}