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

{}

}

}