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