#include  "msp430g2211.h"

#define     RING1                 BIT0
#define     RING2                 BIT4
#define     RING3                 BIT6
#define     RING_DIR              P1DIR
#define     RING_OUT              P1OUT
 
#define     BUTTON                BIT3
#define     BUTTON_OUT            P1OUT
#define     BUTTON_DIR            P1DIR
#define     BUTTON_IN             P1IN
#define     BUTTON_IE             P1IE
#define     BUTTON_IES            P1IES
#define     BUTTON_IFG            P1IFG
#define     BUTTON_REN            P1REN

#define     RESETB                BIT7
#define     RESETB_OUT            P1OUT
#define     RESETB_DIR            P1DIR
#define     RESETB_IN             P1IN
#define     RESETB_IE             P1IE
#define     RESETB_IES            P1IES
#define     RESETB_IFG            P1IFG
#define     RESETB_REN            P1REN

#define     TIMER_PWM_MODE        0
#define     TIMER_PWM_PERIOD      2000  
#define     TIMER_PWM_OFFSET      20

#define     SBUTTON 			  1
#define     RBUTTON               2

/* Tastenspeicher */
int ActRing;
int PressedButton;

void InitializeClocks(void);
void InitializeRing(void);
void InitializeButton(void);
int ChangeRing(int);


void main(void)
{
	WDTCTL = WDTPW + WDTHOLD;
	InitializeClocks();
	InitializeRing();
	InitializeButton();
    
    ActRing = RING1;
    
    __enable_interrupt();
    
    while(1)
    {
    	switch (PressedButton) {
			case SBUTTON:
				RING_OUT = ActRing;
				PressedButton = 0;
				break;
			case RBUTTON:
				RING_OUT = 0;
				PressedButton = 0;
				break;
			default:
				BUTTON_IE |= BUTTON;
				RESETB_IE |= RESETB;
		    	ActRing = ChangeRing(ActRing);
				break;
		}
		__enable_interrupt();
    } 
}

int ChangeRing(int actRing)
{
    	switch (actRing) {
		case RING1:
			actRing = RING2;
			break;
		case RING2:
			actRing = RING3;
			break;
		case RING3:
			actRing = RING1;
			break;
		default:
			break;
	}
	return actRing;
}

void InitializeClocks(void)
{

  BCSCTL1 = CALBC1_1MHZ;                    // Set range
  DCOCTL = CALDCO_1MHZ;
  BCSCTL2 &= ~(DIVS_3);                     // SMCLK = DCO / 8 = 1MHz  
}

void InitializeRing(void)
{
  RING_DIR |= RING1 + RING2 + RING3;                          
  RING_OUT &= ~(RING1 + RING2 + RING3);  
}

void InitializeButton(void)
{
  BUTTON_DIR &= ~BUTTON;
  BUTTON_OUT |= BUTTON;
  BUTTON_REN |= BUTTON;
  BUTTON_IES |= BUTTON;
  BUTTON_IFG &= ~BUTTON;
  BUTTON_IE |= BUTTON;

  RESETB_DIR &= ~RESETB;
  RESETB_OUT |= RESETB;
  RESETB_REN |= RESETB;
  RESETB_IES |= RESETB;
  RESETB_IFG &= ~RESETB;
  RESETB_IE |= RESETB;
}

#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{   
	if ((P1IFG & BUTTON) == BUTTON)
	{
		BUTTON_IFG = 0;  
		BUTTON_IE &= ~BUTTON;       
		PressedButton = SBUTTON;
	}
	if ((P1IFG & RESETB) == RESETB)
	{
		RESETB_IFG = 0;  
		RESETB_IE &= ~RESETB;       
		PressedButton = RBUTTON;
	}
    P1IFG = 0x00;
}

