/*********************************************
Project :newPowerGlove 
Version : 
Date    : 08/17/2002
Author  : Kevin Mellott- VRImmersions.com
Company : 
Comments:  



Chip type           : ATmega163   
Clock frequency     : 4.000000 MHz
Memory model        : Small
Internal SRAM size  : 1024
External SRAM size  : 0
Data Stack size     : 256
*********************************************/

#include <mega163.h>
#include <delay.h> 


/*ADMUX Selection Register Bit Definitions*/
#define		REFS1		7
#define		REFS0		6
#define		ADLAR		5
#define		MUX4		4
#define		MUX3		3
#define		MUX2		2
#define		MUX1		1
#define		MUX0		0

/*ADC Control and Status Register-ADCSR*/
#define		ADEN		7
#define		ADSC		6
#define		ADFR		5
#define		ADIF		4
#define		ADIE		3
#define		ADPS2		2
#define		ADPS1		1
#define		ADPS0		0


/*MB1-MouseByte Register Bit def. */
#define  M1X 7
#define  M1Y 6
#define  LB  5
#define  RB  4
#define  Y7  3
#define  Y6  2
#define  X7  1
#define  X6  0
/*MB2*/
#define  M2X 7
#define  M2Y 6
#define  X5  5
#define  X4  4
#define  X3  3
#define  X2  2
#define  X1  1
#define  X0  0
/*MB3*/
#define  M3X 7
#define  M3Y 6
#define  Y5  5
#define  Y4  4
#define  Y3  3
#define  Y2  2
#define  Y1  1
#define  Y0  0 


/*PortC Registers*/
/*Data Direction Register DDRC*/
#define   DDC7  7
#define   DDC6  6
#define   DDC5  5
#define   DDC4  4 
#define   DDC3  3
#define   DDC2  2
#define   DDC1  1
#define   DDC0  0   
/*Data Register*/ 
#define   PORTC7  7
#define   PORTC6  6
#define   PORTC5  5
#define   PORTC4  4
#define   PORTC3  3
#define   PORTC2  2
#define   PORTC1  1
#define   PORTC0  0
 

/* Input Pins */
//Port C
#define   PINC7  7
#define   PINC6  6
#define   PINC5  5
#define   PINC4  4
#define   PINC3  3
#define   PINC2  2
#define   PINC1  1
#define   PINC0  0 


/*UART Control Register Bit Definitions */
#define		RXCIE		7
#define		TXCIE		6
#define		UDRIE		5	
#define		RXEN		4
#define		TXEN		3
#define		CHR9		2
#define		RXB8		1
#define		TXB8		0    

/*  UART Status Register Bit Definitions */
#define 	RXC		7
#define		TXC		6
#define		UDRE		5
#define		FE		4
#define		OR		3  

/* Analog Comparator */
#define		ACD		7





// Declare your global variables here
unsigned char d=1;
unsigned char HighByte;
unsigned char HeaderByte=0xF5;


/*Prtototypes*/
//UART
void InitUART( unsigned char baudrate );
void TransmitByte( unsigned char data );

  

/*UART Functions*/
void InitUART( unsigned char baudrate)
 {
 UBRR= baudrate;
 UCSRB=(1<<TXEN);
 }
 
 void TransmitByte(unsigned char data)
 {
  while ( !(UCSRA & (1<<UDRE)))
    ;
    UDR=data;
  }


void main(void)
{
 ACSR=(1<<ACD); /*Reduces Current draw by turning off Analog Comparator */
 ADCSR=((1<<ADEN)|(0<<ADFR)|(1<<ADPS2)|(0<<ADPS0)|(1<<ADPS1));      /*ADC Enable and prescaler settings*/
 ADMUX=((0<<REFS1)|(1<<REFS0)|(1<<ADLAR));   /*Set Mux Ref Voltage = Vcc(01=Vcc, 11=2.56V), and Left Adjusts*/
 

 //if (!PINC.2)
 //InitUART(206);   /*Sets BuadRate at 1200 for 4MHz crystal.  12=19200 51=4800  25=9600 103=2400 206=1200(may not be valid)*/
 //else               //Must be set to baud of 1200 for microsoft serial mouse emulation
 InitUART(12);
 


while (1)
      { 
      switch (d)
   { 
    
    case 1: TransmitByte(HeaderByte);/*transmitt a headerbyte before the data*/
            break;
       
    case 2: ADMUX.0=0;
            ADMUX.1=0;
            ADMUX.2=0;
            ADMUX.3=0;
            ADMUX.4=0;
    	    break;
  
    case 3: ADMUX.0=1;
            ADMUX.1=0;
            ADMUX.2=0;
            ADMUX.3=0;
            ADMUX.4=0;
    	    break;
       
    case 4: ADMUX.0=0;
            ADMUX.1=1;
            ADMUX.2=0;
            ADMUX.3=0;
            ADMUX.4=0;
    	    break;
       
    case 5: ADMUX.0=1;
            ADMUX.1=1;
            ADMUX.2=0;
            ADMUX.3=0;
            ADMUX.4=0;
     	    break;
       
    case 6: ADMUX.0=0;
            ADMUX.1=0;
            ADMUX.2=1;
            ADMUX.3=0;
            ADMUX.4=0;
    	    break; 
       
    case 7: ADMUX.0=1;
            ADMUX.1=0;
            ADMUX.2=1;
            ADMUX.3=0;
            ADMUX.4=0;
    	    break;
       
    case 8: ADMUX.0=0;
            ADMUX.1=1;
            ADMUX.2=1;
            ADMUX.3=0;
            ADMUX.4=0;
    	    break;
       
    case 9: ADMUX.0=1;
            ADMUX.1=1;
            ADMUX.2=1;
            ADMUX.3=0;
            ADMUX.4=0;
            break;
     } 
    
    ADCSR.6=1;    //This starts conversion    
    if (ADCSR.6=1)    /*wait until conversion is complete */   
        {  
            delay_us(250);   //max conversion time
	  }
     	   
   HighByte=ADCH;  
   if(d!=1) TransmitByte(HighByte); /*If this is not the header, then transmit*/
   if (++d>(9))  /*change to 9 if I need the last Case switch*/
       d=1;
        
   
 } 

  
}

