07.05.2001

Beispielprogramm:

Sensware 1.0 auf dem kitCON 541

Name des Programmes: Port 38

 

Funktion des Programms

Leistung des Programmes

 

 

 

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

/* SENSWARE 1.0                           (C) 2001 Klaus Rieger                        */

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

 

// #define MONITOR

#define PACKE

#define BRAILLES 4                     // Anzahl der Braille-Elemente

 

#ifdef PACKE

#define CODELAENGE 200                 // maximale Codelänge 200 (nur gerade Zahlen!)

unsigned char Code[CODELAENGE/2];      // Tastenfeld gepackt     

#else

#define CODELAENGE 100                 // maximale Codelänge 100

unsigned char Code[CODELAENGE];        // Tastenfeld gepackt  

#endif

 

#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 sclk_strobe = P1 ^ 2;             // Strobe für Braille

sbit sto_data = P1 ^ 4;                // Data für Braille

sbit sri_clock = P1 ^ 3;               // Clock für Braille

 

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

/* Functions    */

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

 

void braille (unsigned char dat)       // gibt dat auf ein Braille aus

{

   unsigned char c;

   c = dat>>4;                         // High drucken

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

   c = dat&15;                         // Low drucken

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

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

   {

      sto_data = dat&1;

      dat >>= 1;

      sri_clock = 1;

      sri_clock = 0;

   }

}

 

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

/* Interrupts   */

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

 

void ExternInterrupt1()

{

}

 

void Extern1 (void) interrupt 2 using 2

{

   ExternInterrupt1();

}

 

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

/* main program */

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

 

unsigned char dat, c;

int a, e, store, codelaenge, cod;

int x = 0, y = 0;                      // Mausposition

int xx, yy;                            // Breite/Höhe der Matrix

 

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 ("Port38 (C)2000 Klaus Rieger\n"); /* Print "(C)..."                         */ 

#else

   SerInit();                          /* init serial port                             */

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

   putchar(CLRSCR);

#endif

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

   sclk_strobe = 0;                    // Strobe für Braille

   sto_data = 0;                       // Data für Braille

   sri_clock = 0;                      // Clock für Braille

 

   putchar('1');                       // Versionsnummer

   putchar('0');

   braille(0);

   braille(0);

   braille(29);

   braille(61);

   braille(29);

   sclk_strobe = 1;                    // Strobe für Braille

   sclk_strobe = 0;

 

   a = getkey();

   if ((47<a)&&(a<58)) xx = 16*(a-48);

   if ((96<a)&&(a<103)) xx = 16*(a-87);

   a = getkey();

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

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

   a = getkey();

   if ((47<a)&&(a<58)) yy = 16*(a-48);

   if ((96<a)&&(a<103)) yy = 16*(a-87);

   a = getkey();

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

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

     a = getkey();                                        

//   if ((47<a)&&(a<58)) codelaenge = 4096*(a-48);         wegen Speichermangel

//   if ((96<a)&&(a<103)) codelaenge = 4096*(a-87);        auf 0...250 begrenzt!

     a = getkey();

//   if ((47<a)&&(a<58)) codelaenge += 256*(a-48);         fürs erweitern nächste 2 Zeilen:

//   if ((96<a)&&(a<103)) codelaenge += 256*(a-87);        = -> +=

   a = getkey();

   if ((47<a)&&(a<58)) codelaenge = 16*(a-48);

   if ((96<a)&&(a<103)) codelaenge = 16*(a-87);

   a = getkey();

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

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

   if ((0<=codelaenge)&&(codelaenge<=CODELAENGE))

   {

      for (e=0; e<codelaenge; e++)

      {

         a = getkey();

#ifdef PACKE

              if (e&1)

              {

            if ((47<a)&&(a<58)) Code[e/2] |= a-48;

               if ((96<a)&&(a<103)) Code[e/2] |= a-87;

              }

              else

              {

                 if ((47<a)&&(a<58)) Code[e/2] = (a-48)<<4;

               if ((96<a)&&(a<103)) Code[e/2] = (a-87)<<4;

              }

#else

         if ((47<a)&&(a<58)) Code[e] = a-48;

            if ((96<a)&&(a<103)) Code[e] = a-87;

#endif

      }

         putchar('!');                    // OK

   }

   else

   {

      codelaenge = 0;

      putchar('?');                    // Fehler

   }

   while (1)

   {

         for (e=0; e<BRAILLES; e++)       // alle Braille-Elemente durchgehen

      {

            dat = 0;

         store = 2*e-2*BRAILLES+2;

            for (a=0; a<codelaenge; a++)  // alle gesetzen Bytes durchgehen

            {

#ifdef PACKE

                 if (a&1) cod = Code[a/2]&0xF; else cod = Code[a/2]>>4;

#else

            cod = Code[a];

#endif

               if (cod == 15)

               {

                  store += 15;     

                 }

                 else

                 {

               store += cod;

                  if (x+y*xx == store) dat |= 2;         // Bit 1

                  if (x+1+y*xx == store) dat |= 1;       // Bit 0

                  if (x+(y+1)*xx == store) dat |= 0x20;  // Bit 5

                  if (x+1+(y+1)*xx == store) dat |= 4;   // Bit 2

                  if (x+(y+2)*xx == store) dat |= 0x40;  // Bit 6

                  if (x+1+(y+2)*xx == store) dat |= 8;   // Bit 3

                  if (x+(y+3)*xx == store) dat |= 0x80;  // Bit 7

                  if (x+1+(y+3)*xx == store) dat |= 0x10;// Bit 4 

                       store++;

                 } 

         }

#ifdef MONITOR

         printf("%0X ", (int)dat);

#else

            braille(dat);

#endif

      }

         sclk_strobe = 1;                    // Strobe für Braille

      sclk_strobe = 0;

      putchar('\n');

         a = getkey();

         if (a == '6') x++;

         if (a == '4') x--;

         if (a == '8') y++;

         if (a == '2') y--;

         if (x<0) x=0;

         if (xx-2*BRAILLES<x) x=xx-2*BRAILLES;

      if (y<0) y=0;

         if (yy-4<y) y=yy-4;

         putchar('\n');

#ifdef MONITOR                         // nur zum Testen,

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

         else                

         {

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

              gesperrt = 1;

         }

#endif

  }

}