void delay2(unsigned int milliseconds) ;
void I2C_1(void);
void I2C_0(void);
void I2C_START(void);
void I2C_STOP(void);
void I2C_ACK(void);
void I2C_NOACK(void);
unsigned char le_byte(void);
unsigned char le_sensor(void);


#include <stdio.h>
#include <msp430x14x.h>
//#include <io.h>
//#include <signal.h>

#include "AD7416.h"

//############################ DEFINES ##################################


#define I2CRD   I2C_1();
#define I2CWR   I2C_0();

#define SDA_0     P4OUT &= ~0X01;
#define SDA_1     P4OUT |= 0X01;
#define SDA_IN    P4IN;
#define SCL_0     P4OUT &= ~0X02;
#define SCL_1     P4OUT |= 0X02;

unsigned char aux2;

/*void delay2(unsigned int milliseconds)
{
    unsigned int n_1ms;
        while(milliseconds--)
    {
        n_1ms = 1235;
        while(n_1ms--);
    }
}
*/

void I2C_1(void)
{
        SCL_0;
        _NOP();_NOP();_NOP();
        SDA_1;
        _NOP();_NOP();_NOP();
        SCL_1;
        _NOP();_NOP();_NOP();
        _NOP();_NOP();_NOP();
        SCL_0;
        _NOP();_NOP();_NOP();
}

void I2C_0(void)
{
        SCL_0;
        _NOP();_NOP();_NOP();
        SDA_0;
        _NOP();_NOP();_NOP();
        SCL_1;
        _NOP();_NOP();_NOP();
        _NOP();_NOP();_NOP();
        SCL_0;
        _NOP();_NOP();_NOP();
}

void I2C_START(void)    //I2C START
{
        SCL_1;
        SDA_1;
        _NOP();_NOP();_NOP();
        SDA_0;
        _NOP();_NOP();_NOP();
        SCL_0;
        _NOP();_NOP();_NOP();
}

void I2C_STOP(void)     //I2C STOP
{
        SCL_0;
        SDA_0;
        SCL_1;
        _NOP();_NOP();_NOP();
        SDA_1;
        _NOP();_NOP();_NOP();
}

void I2C_ACK(void)
{
        unsigned char x;

        SCL_1;
        P4DIR &= ~0X01; //FAZ SDA COMO ENTRADA
        _NOP();_NOP();_NOP();
        x = (P4IN & 0x01);
        P4DIR |= 0X01; //FAZ SDA COMO SAIDA
        _NOP();_NOP();_NOP();
        SCL_0;
        _NOP();_NOP();_NOP();
}

void I2C_NOACK(void)
{
        SCL_0;
        _NOP();_NOP();_NOP();
        SDA_1;
        _NOP();_NOP();_NOP();
        SCL_1;
        _NOP();_NOP();_NOP();
        SCL_0;
        _NOP();_NOP();_NOP();
}

unsigned char le_byte(void)
{
        unsigned char i=0;

        I2C_START();
        I2C_1();
        I2C_0();
        I2C_0();
        I2C_1();
        I2C_0();        //A2
        I2C_0();        //A1
        I2C_1();        //A0
        I2CRD;
        I2C_ACK();

        P4DIR &= ~0X01; //FAZ SDA COMO ENTRADA

        for(i=0;i<8;i++)
        {
                SCL_1;
                aux2 <<= 1;
                aux2 |= (P4IN & 0x01);
                _NOP();_NOP();_NOP();
                SCL_0;
        }
        P4DIR |= 0X01; //FAZ SDA COMO SAIDA

        I2C_NOACK();
        I2C_STOP();

        return aux2;
}

unsigned char le_sensor(void)
{
        unsigned char temp=0,i=0,t[11];
        for(i=0;i<10;i++)
        {
                I2C_START();
                I2C_1();
                I2C_0();
                I2C_0();
                I2C_1();
                I2C_0();        //A2
                I2C_0();        //A1
                I2C_1();        //A0
                I2CWR;
                I2C_ACK();
                I2C_0();
                I2C_0();
                I2C_0();
                I2C_0();
                I2C_0();
                I2C_0();
                I2C_0();
                I2C_0();
                I2C_ACK();
                I2C_0();
                I2C_0();
                I2C_0();
                I2C_0();
                I2C_0();
                I2C_0();
                I2C_0();
                I2C_0();
                I2C_ACK();
                I2C_STOP();
                t[i]=le_byte();
        }
        temp=(t[0]+t[1]+t[2]+t[3]+t[4]+t[5]+t[6]+t[7]+t[8]+t[9])/10;
        delay2(500);
        return temp;
} 

