07.05.2001
Name des
Programmes: Port 38
/***************************************************************************************/
/* 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
}
}