#include "f2407_c.h" /* Defines register names and addresses */
#include "funlib.h" /* Defines global variables and prototypes for
function library */
#include <math.h> /* Enables the DSP to do certain math functions */
#include <time.h>
/* define symbolic constants */
#define LP 300 /*long pasue time in seconds*/
#define SP 150 /*short pause time in s*/
#define start 0 /*start bit always 0*/
#define stop 1 /*stop bit always 1*/
void main(void)
{
/* initialized local variables */
static int pointer=0;
static int next=0;
static int step=0;
static double t=0;
static int letter=0;
static int RightI=1; /*finger variables RI=right index, RM=right midlle, etc...*/
static int RightM=1;
static int RightR=1;
static int RightP=1;
static int LeftI=1;
static int LeftM=1;
static int LeftR=1;
static int LeftP=1;
static int D1=0; /*data bits D1=first D2=secon, etc...*/
static int D2=0;
static int D3=0;
static int D4=0;
static int D5=0;
static int D6=0;
static int D7=0;
static int D8=0;
static int parity=0;
static int signal=0; /* makes sure make code only sent 1 time*/
static int track=0;
/* initialize basic registers and functions of DSP */
initGen();
/* initialize pins as digital i/o and set their directions */
initIO(IOPC, 0, INPUT);
initIO(IOPC, 1, INPUT);
initIO(IOPC, 2, INPUT);
initIO(IOPC, 3, INPUT);
initIO(IOPC, 7, OUTPUT); /*data */
initIO(IOPC, 5, OUTPUT); /*clock */
initIO(IOPC, 6, OUTPUT); /*light*/
setIO(IOPC, 4, 1);
setIO(IOPC, 5, 1);
*GPTCONA = 0x0000; /* disable ADC start from timer, disable timer compare output */
*GPTCONB = 0x0000;
*T3CON=(0x1040|(2<8));
*T3PR=0xFFFF;
while(1)
{
if (pointer!=0)
{
setIO(IOPC,6, 0);
}
if (pointer==0)
{
setIO(IOPC,6,1);
}
RightI=getIO(IOPC,0);
RightM=getIO(IOPC,1);
RightR=getIO(IOPC,2);
RightP=getIO(IOPC,3);
LeftI=getIO(IOPB,0);
LeftM=getIO(IOPB,1);
LeftR=getIO(IOPB,2);
LeftP=getIO(IOPB,3);
if (pointer==0)
{
if (RightI==0)
{
pointer=1;
}
if (RightM==0)
{
pointer=2;
}
if (RightR==0)
{
pointer=3;
}
if (RightP==0)
{
pointer=4;
}
if (LeftR==0)
{
pointer=5;
}
if (LeftM==0)
{
pointer=6;
}
if (LeftR==0)
{
pointer=7;
}
if (LeftP==0)
{
pointer=8;
}
}
*T3CNT=0x0000;
t=*T3CNT;
while (*T3CNT-t<=6000) /*pause to prevent double hit*/
{}
if (pointer!=0 & (step==0 & next==0))
{
if (((RightI==1 & RightM==1) & (RightR==1 & RightP==1)) & ((LeftI==1 & LeftM==1)
& (LeftR==1 & LeftP==1)))
{
next=1;
}
}
*T3CNT=0x0000;
t=*T3CNT;
while (*T3CNT-t<=6000) /*pause to prevent double hit*/
{}
if (next==1)
{
if(pointer==1)
{
if(RightI==0)
{ /*"a"*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=0;
D2=0;
D3=1;
D4=1;
D5=1;
D6=0;
D7=0;
D8=0;
parity=0; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
if(RightM==0)
{ /*"b"*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=0;
D2=1;
D3=0;
D4=0;
D5=1;
D6=1;
D7=0;
D8=0;
parity=0; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
if(RightR==0)
{ /*"c"*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=1;
D2=0;
D3=0;
D4=0;
D5=0;
D6=1;
D7=0;
D8=0;
parity=1; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
if(RightP==0)
{ /*"d"*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=1;
D2=1;
D3=0;
D4=0;
D5=0;
D6=1;
D7=0;
D8=0;
parity=0; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
}
if (pointer==2)
{
if(RightI==0)
{ /*"e"*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=0;
D2=0;
D3=1;
D4=0;
D5=0;
D6=1;
D7=0;
D8=0;
parity=1; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
if(RightM==0)
{ /*"f"*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=1;
D2=1;
D3=0;
D4=1;
D5=0;
D6=1;
D7=0;
D8=0;
parity=1; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
if(RightR==0)
{ /*"g"*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=0;
D2=0;
D3=1;
D4=0;
D5=1;
D6=1;
D7=0;
D8=0;
parity=0; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
if(RightP==0)
{ /*"h"*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=1;
D2=1;
D3=0;
D4=0;
D5=1;
D6=1;
D7=0;
D8=0;
parity=1; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
}
if (pointer==3)
{
if(RightI==0)
{ /*"i"*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=1;
D2=1;
D3=0;
D4=0;
D5=0;
D6=0;
D7=1;
D8=0;
parity=0; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
if(RightM==0)
{ /*"j"*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=1;
D2=1;
D3=0;
D4=1;
D5=1;
D6=1;
D7=0;
D8=0;
parity=0; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
if(RightR==0)
{ /*"k"*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=0;
D2=1;
D3=0;
D4=0;
D5=0;
D6=0;
D7=1;
D8=0;
parity=1; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
if(RightP==0)
{ /*"l"*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=1;
D2=1;
D3=0;
D4=1;
D5=0;
D6=0;
D7=1;
D8=0;
parity=1; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
}
if (pointer==4)
{
if(RightI==0)
{ /*"m"*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=0;
D2=1;
D3=0;
D4=1;
D5=1;
D6=1;
D7=0;
D8=0;
parity=1; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
if(RightM==0)
{ /*"n"*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=1;
D2=0;
D3=0;
D4=0;
D5=1;
D6=1;
D7=0;
D8=0;
parity=0; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
if(RightR==0)
{ /*"o"*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=0;
D2=0;
D3=1;
D4=0;
D5=0;
D6=0;
D7=1;
D8=0;
parity=1; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
if(RightP==0)
{ /*"p"*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=1;
D2=0;
D3=1;
D4=1;
D5=0;
D6=0;
D7=1;
D8=0;
parity=1; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
}
if(pointer==5)
{
if(RightI==0)
{ /*"q"*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=1;
D2=0;
D3=1;
D4=0;
D5=1;
D6=0;
D7=0;
D8=0;
parity=0; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
if(RightM==0)
{ /*"r"*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=1;
D2=0;
D3=1;
D4=1;
D5=0;
D6=1;
D7=0;
D8=0;
parity=1; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
if(RightR==0)
{ /*"s"*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=1;
D2=1;
D3=0;
D4=1;
D5=1;
D6=0;
D7=0;
D8=0;
parity=1; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
if(RightP==0)
{ /*"t"*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=0;
D2=0;
D3=1;
D4=1;
D5=0;
D6=1;
D7=0;
D8=0;
parity=0; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
}
if (pointer==6)
{
if(RightI==0)
{ /*"u"*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=0;
D2=0;
D3=1;
D4=1;
D5=1;
D6=1;
D7=0;
D8=0;
parity=1; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
if(RightM==0)
{ /*"v"*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=0;
D2=1;
D3=0;
D4=1;
D5=0;
D6=1;
D7=0;
D8=0;
parity=0; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
if(RightR==0)
{ /*"w"*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=1;
D2=0;
D3=1;
D4=1;
D5=1;
D6=0;
D7=0;
D8=0;
parity=1; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
if(RightP==0)
{ /*"x"*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=0;
D2=1;
D3=0;
D4=0;
D5=0;
D6=1;
D7=0;
D8=0;
parity=1; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
}
if (pointer==7)
{
if(RightI==0)
{ /*"y"*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=1;
D2=0;
D3=1;
D4=0;
D5=1;
D6=1;
D7=0;
D8=0;
parity=1; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
if(RightM==0)
{ /*"z"*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=0;
D2=1;
D3=0;
D4=1;
D5=1;
D6=0;
D7=0;
D8=0;
parity=0; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
if(RightR==0)
{ /*"space"*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=1;
D2=0;
D3=0;
D4=1;
D5=0;
D6=1;
D7=0;
D8=0;
parity=0; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
if(RightP==0)
{ /*"backspace"*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=0;
D2=1;
D3=1;
D4=0;
D5=0;
D6=1;
D7=1;
D8=0;
parity=1; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
}
if (pointer==8)
{
if(RightI==0)
{ /*"caps"*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=0;
D2=0;
D3=0;
D4=1;
D5=1;
D6=0;
D7=1;
D8=0;
parity=0; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
if(RightM==0)
{ /*"."*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=1;
D2=0;
D3=0;
D4=1;
D5=0;
D6=0;
D7=1;
D8=0;
parity=0; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
if(RightR==0)
{ /*","*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=1;
D2=0;
D3=0;
D4=0;
D5=0;
D6=0;
D7=1;
D8=0;
parity=1; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
if(RightP==0)
{ /*"tab"*/
next=0;
step=1;
signal=1;
letter=1; /* sets letter variable to 1 b/c letter entered*/
D1=1;
D2=0;
D3=1;
D4=1;
D5=0;
D6=0;
D7=0;
D8=0;
parity=0; /*1 if even number of 1's in D1-D8, 0 if odd*/
}
}
}
if ((D1==1 | D2==1 | D3==1 | D4==1 | D5==1 | D6==1 | D7==1 | D8==1) & signal==1)
{
signal=0;
setIO(IOPC,5,1); /* initializes clock as high*/
setIO(IOPC,7, start); /* start bit remember 1 and 0 switched */
*T3CNT=0x0000;
t=*T3CNT;
while (*T3CNT-t<=LP) /*50 micro b/c clock must be high for at least 50 in
order to recieve info*/
{}
setIO(IOPC,5,0);
t=*T3CNT;
while (*T3CNT-t<=LP)
{}
setIO(IOPC,5,1);
t=*T3CNT;
while (*T3CNT-t<=SP)
{}
setIO(IOPC, 7, D1); /* first data bit */
t=*T3CNT;
while (*T3CNT-t<=SP)
{}
setIO(IOPC,5,0);
t=*T3CNT;
while (*T3CNT-t<=LP)
{}
setIO(IOPC,5,1);
t=*T3CNT;
while (*T3CNT-t<=SP)
{}
setIO(IOPC, 7, D2); /* second data bit */
t=*T3CNT;
while (*T3CNT-t<=SP)
{}
setIO(IOPC,5,0);
t=*T3CNT;
while (*T3CNT-t<=LP)
{}
setIO(IOPC,5,1);
t=*T3CNT;
while (*T3CNT-t<=SP)
{}
setIO(IOPC, 7, D3); /* third data bit */
t=*T3CNT;
while (*T3CNT-t<=SP)
{}
setIO(IOPC,5,0);
t=*T3CNT;
while (*T3CNT-t<=LP)
{}
setIO(IOPC,5,1);
t=*T3CNT;
while (*T3CNT-t<=SP)
{}
setIO(IOPC, 7, D4); /* fourth data bit */
t=*T3CNT;
while (*T3CNT-t<=SP)
{}
setIO(IOPC,5,0);
t=*T3CNT;
while (*T3CNT-t<=LP)
{}
setIO(IOPC,5,1);
t=*T3CNT;
while (*T3CNT-t<=SP)
{}
setIO(IOPC, 7, D5); /* fifth data bit */
t=*T3CNT;
while (*T3CNT-t<=SP)
{}
setIO(IOPC,5,0);
t=*T3CNT;
while (*T3CNT-t<=LP)
{}
setIO(IOPC,5,1);
t=*T3CNT;
while (*T3CNT-t<=SP)
{}
setIO(IOPC, 7, D6); /* sixth data bit */
t=*T3CNT;
while (*T3CNT-t<=SP)
{}
setIO(IOPC,5,0);
t=*T3CNT;
while (*T3CNT-t<=LP)
{}
setIO(IOPC,5,1);
t=*T3CNT;
while (*T3CNT-t<=SP)
{}
setIO(IOPC, 7, D7); /* seventh data bit */
t=*T3CNT;
while (*T3CNT-t<=SP)
{}
setIO(IOPC,5,0);
t=*T3CNT;
while (*T3CNT-t<=LP)
{}
setIO(IOPC,5,1);
t=*T3CNT;
while (*T3CNT-t<=SP)
{}
setIO(IOPC, 7, D8); /* eighth data bit */
t=*T3CNT;
while (*T3CNT-t<=SP)
{}
setIO(IOPC,5,0);
t=*T3CNT;
while (*T3CNT-t<=LP)
{}
setIO(IOPC,5,1);
t=*T3CNT;
while (*T3CNT-t<=SP)
{}
setIO(IOPC, 7, parity); /* parity data bit */
t=*T3CNT;
while (*T3CNT-t<=SP)
{}
setIO(IOPC,5,0);
t=*T3CNT;
while (*T3CNT-t<=LP)
{}
setIO(IOPC,5,1);
t=*T3CNT;
while (*T3CNT-t<=SP)
{}
setIO(IOPC, 7, stop); /* stop data bit */
t=*T3CNT;
while (*T3CNT-t<=SP)
{}
setIO(IOPC,5,0);
t=*T3CNT;
while (*T3CNT-t<=2100)
{}
setIO(IOPC,5,1);
}
*T3CNT=0x0000;
t=*T3CNT;
while (*T3CNT-t<=6000) /*pause to prevent double hit*/
{}
if (letter==1 & next==0 & step==1)
{
if (((RightI==1 & RightM==1) & (RightR==1 & RightP==1)) & ((LeftI==1 & LeftM==1)
& (LeftR==1 & LeftP==1)))
{
letter=0;
pointer=0;
step=0;
}
}
*T3CNT=0x0000;
t=*T3CNT;
while (*T3CNT-t<=6000) /*pause to prevent double hit*/
{}
}
}
