21.09.2001
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
}
}