#include <msp430x16x.h>
#include <stdio.h>

unsigned int i = 0;

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog
  P3SEL |= 0x0a;                            // Assign I2C pins to module
  U0CTL |= I2C + SYNC;                      // Switch USART0 to I2C mode (Reccommended I2C init procedure)
  U0CTL &= ~I2CEN;                          // Disable the I2C module (Recommended I2C init procedure)
  
  //Now configure I2C Module with I2CEN  = 0
  
  I2CTCTL |= I2CSSEL_1;                     // ACLK
  I2CSCLH = 0x00;                           // High period of SCL
  I2CSCLL = 0x00;                           // Low period of SCL
  I2CNDAT = 0x08;                           // Send 8 bytes (byte = 8 bits) 
  I2CSA = 0x0068;                           // Slave address is 0x68
  
  //Now enable I2C Module

  U0CTL |= I2CEN;                           // Enable I2C using a 7-bit address
  I2CIE = TXRDYIE;                          // I2C transmit ready interrupt enable
  
  //Now set time
                          
  U0CTL |= MST;                             // Master mode
  I2CTCTL |= I2CTRX + I2CSTT + I2CSTP;      // Transmit, ST, SP (clears MST)
//  I2CDRB |= 0x00;                           // Register address (seconds)
//  I2CDRB |= 0x01;                           // Set for one second
  
  //Now continuously read seconds
  
  while (1)
  {   
      U0CTL |= MST;                           // Master mode
      I2CTCTL |= I2CTRX + I2CSTT;             // Transmit, ST
      I2CDRB = 0x00;                          // Reset register pointer to read seconds first
      I2CTCTL |= I2CSTT + I2CSTP;             // Receive, Restart, SP (clears MST)
  }
}

// Transmit register empty interrupt vector handler
#pragma vector=I2CIV_TXRDY
__interrupt void SET_TIME (void)
{
  switch( i )
  {
  case 0:
    I2CDRB |= 0x00;                           // Start register pointer at 0x00
    i++;
    break;
  case 1:
    I2CDRB |= 0x00;                           // Set seconds
    i++;
    break;
  case 2:
    I2CDRB |= 0x00;                           // Set minutes
    i++;
    break;
  case 3:
    I2CDRB |= 0x00;                           // Set hours
    i++;
    break;
  case 4:
    I2CDRB |= 0x00;                           // Set day
    i++;
    break;
  case 5:
    I2CDRB |= 0x00;                           // Set date
    i++;
    break;
  case 6:
    I2CDRB |= 0x00;                           // Set month
    i++;
    break;
  case 7:
    I2CDRB |= 0x00;                           // Set year
    i++;
    break;
  }
}