21.09.2001

Beispielprogramm:

Braille Elemente ansteuern mit dem kitCON 541

Name des Programmes: Port 20

 

 

// #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 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

 

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

/* Interrupts   */

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

 

void ExternInterrupt1()

{

}

 

void Extern1 (void) interrupt 2 using 2

{

   ExternInterrupt1();

}

 

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

/* main program */

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

 

int a, b, t1, t2;

unsigned char dat, c;

 

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 ("Port20 (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

 

   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)

         {

#ifdef MONITOR

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

#endif

              if (t2==10)                   // ca. 30 Hz.

              {

            putchar(':');

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

            {

               dat = 255*(a&1);

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

               {

                  sto_data = dat&1;

                  dat >>= 1;

                  sri_clock = 1;

                  sri_clock = 0; 

               }

               sclk_strobe = 1;        // Strobe für Braille

               sclk_strobe = 0;

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

            }

                    putchar(')');

            putchar('\n');

              }

              if (t2==11)

              {

            putchar(':');

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

            {

               dat = 1;

                       dat <<= a&7;

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

               {

                  sto_data = dat&1;

                  dat >>= 1;

                  sri_clock = 1;

                  sri_clock = 0; 

               }

               sclk_strobe = 1;        // Strobe für Braille

               sclk_strobe = 0;

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

            }

                    putchar(')');

            putchar('\n');

              }

              if (t2==12)

              {

            putchar(':');

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

            {

               dat = 1;

                       dat <<= a&7;

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

               {

                  sto_data = dat&1;

                  dat >>= 1;

                  sri_clock = 1;

                  sri_clock = 0; 

               }

               sclk_strobe = 1;        // Strobe für Braille

               sclk_strobe = 0;

                       for (b=-32000; b<32000; b++);

            }

                    putchar(')');

            putchar('\n');

              }

              if (t2==13)

              {

            putchar(':');

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

            {

               dat = 1;

                       dat <<= a&7;

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

               {

                  sto_data = dat&1;

                  dat >>= 1;

                  sri_clock = 1;

                  sri_clock = 0; 

               }

               sclk_strobe = 1;        // Strobe für Braille

               sclk_strobe = 0;

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

            }

                    putchar(')');

            putchar('\n');

              }

              if (t2<8)

              {

            putchar(t2+48);

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

            {

               sto_data = (c==t2);

               sri_clock = 1;

               sri_clock = 0; 

            }

            sclk_strobe = 1;           // Strobe für Braille

            sclk_strobe = 0;

                    for (a=0; a<1000; a++) putchar('w');

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

            {

               sto_data = 0;

               sri_clock = 1;

               sri_clock = 0; 

            }

            sclk_strobe = 1;           // Strobe für Braille

            sclk_strobe = 0;

            putchar('\n');

              }

         }

         else

         {

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

              {

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

            c = dat>>4;                // High drucken

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

            c = dat&15;                // Low drucken

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

            putchar('\n');

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

            {

               sto_data = dat&1;

               dat >>= 1;

               sri_clock = 1;

               sri_clock = 0; 

            }

            sclk_strobe = 1;           // Strobe für Braille

            sclk_strobe = 0;

              }

      }

#ifdef MONITOR                         // nur zum Testen,

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

         else                

         {

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

              gesperrt = 1;

         }

#endif

   }

}