#include <msp430.h>
//#include <delay.c>

int main(void)
{
  WDTCTL = WDTPW | WDTHOLD;      // Stop WDT

  // Configure GPIO
  P1OUT = BIT1;                  // Pull-up resistor on P1.1
  P1REN = BIT1;                  // Select pull-up mode for P1.1
  P1DIR = 0xFF ^ BIT1;           // P1.2  output & P1.1 input
  P1SEL0 |= BIT2;                // P1.2  options select

  P4OUT = BIT5;                             // Pull-up resistor on P4.5
  P4REN = BIT5;                             // Select pull-up mode for P4.5
  P4DIR = 0xFF ^ BIT5;                      // Set all but P4.5 to output direction

  PM5CTL0 &= ~LOCKLPM5;     // Disable the GPIO power-on default high-impedance mode to activate port settings

  CSCTL0_H = CSKEY >> 8;                    // Unlock CS registers
  CSCTL1 = DCOFSEL_6;                       // DCO = 8MHz
  CSCTL2 = SELA__VLOCLK | SELS__DCOCLK | SELM__DCOCLK;// Set ACLK = VLO; SMCLK = DCO/8
  CSCTL3 = DIVA__8 | DIVS__8 | DIVM__8;     // Set dividers
  CSCTL0_H = 0;

  TA1CCR0 = 2500;           // PWM Period
  TA1CCTL1 = OUTMOD_7;      // CCR1 reset/set
  TA1CCR1 = 400;            // CCR1 PWM duty cycle

  TA1CTL = TASSEL__SMCLK | MC__UP | TACLR;  // SMCLK, up mode, clear TAR

  while (1)                                 // Test P1.4
  {
    if (P1IN & BIT1)
      P1OUT |= BIT0;                        // if P1.4 set, set P1.0
    else
    {
        if (TA1CCR1 <2500)
          TA1CCR1 = TA1CCR1 + 20;
          __delay_cycles(1000);
          while(!(P1IN & BIT1));
    }
    if (P4IN & BIT5)
      P1OUT |= BIT0;                        // if P1.4 set, set P1.0
    else
    {
        if (TA1CCR1 > 0)
          TA1CCR1 = TA1CCR1 - 20;
          __delay_cycles(1000);
          while(!(P4IN & BIT5));
    }
  }
}