/*;******************************************************************************
;    MSP430F133 
;               Tasteneingabe steuert 2 Programmteile
;		nach Ausführung zurück zum Hauptprogramm 

;
;           MSP430F133
;        _________________
;     /|\|            XIN|- 32,768kHz 
;      | |               |
;      --|RST        XOUT|-
;        |               |
;        |          P1.0 |-- LED (12)
;	 |	    P1.5 |-- Taste 1 (17)
;	 |	    P1.6 |-- Taste 2 (18)
;	 |	
;
;      Wolfgang    März.2004
;******************************************************************************
*/

#include  <msp430x13x.h>

// Function prototypes

void delay(void);   // Software delay
void Init(void);
void AusgabeP4(void);
void delay2(void);
void AusgabeP4a(void);
void AusgabeP4b(void);


void main(void)
{ 
  Init();
 
  while(1)          // Repeat forever
  {
     AusgabeP4();
    }
}



void delay(void)
{
// Note: i is an unsigned integer. If not declared unsigned, 65000 in 16 bits
// becomes a negative number, and the loop is executed only once!

  unsigned int i;
  
  for (i = 65000; i > 0; i--);
}  
void delay2(void)
{
// Note: i is an unsigned integer. If not declared unsigned, 65000 in 16 bits
// becomes a negative number, and the loop is executed only once!

  unsigned int i;
  
  for (i = 20000; i > 0; i--);
}  
void Init(void)
{    WDTCTL = WDTPW + WDTHOLD;        // Stop watchdog timer
     P1DIR = 0x01;       // P1.0 output
     P1IE  = 0x60;       // an P1.5 P1.6 Interruptfreigabe 
     P1IES = 0x60;	 // auf H/L Flanke  an P1.5 und P1.6 festlegen 
     P4DIR = 0xFF;	 // P4 als Ausgang
     /* ADC12 Settings:     
     P6SEL = 0xF0;        // Pin P6 used by ADC module  Auswahl als peripheres Modul (Eingang)
     ADC12CTL0 &=~0x02;   // Disable conversion before changing
                          // the ADC12 settings!!!
                         //selection of reference and input 
                        
     ADC12MCTL0  = 0x00;    // Ref = AVss, AVcc; Input = A0
     ADC12MCTL1  = 0x01;    // Ref = AVss, AVcc; Input = A1
     ADC12MCTL2  = 0x02;    // Ref = AVss, AVcc; Input = A2
     ADC12MCTL3  = 0x03;    // Ref = AVss, AVcc; Input = A3          
     ADC12MCTL4  = 0x04;    // Ref = AVss, AVcc; Input = A4
     ADC12MCTL5  = 0x05;    // Ref = AVss, AVcc; Input = A5
     ADC12MCTL6  = 0x06;    // Ref = AVss, AVcc; Input = A6
     ADC12MCTL7  = 0x07;    // Ref = AVss, AVcc; Input = A7
     ADC12MCTL8  = 0x08;    // Ref = AVss, AVcc; Input = A8
     ADC12MCTL9  = 0x09;    // Ref = AVss, AVcc; Input = A9
     ADC12MCTL10 = 0x0A;    // Ref = AVss, AVcc; Input = A10  Temp.
     ADC12MCTL11 = 0x0B;    // Ref = AVss, AVcc; Input = A11  Vcc
     ADC12MCTL12 = 0x0C;    // Ref = AVss, AVcc; Input = A12
     ADC12MCTL13 = 0x0D;    // Ref = AVss, AVcc; Input = A13
     ADC12MCTL14 = 0x0E;    // Ref = AVss, AVcc; Input = A14
     ADC12MCTL15 = 0x8F;    // Ref = AVss, AVcc; Input = A15
                            // ADC12MCTL15 is end of sequence 
                            // (EOS bit is set!)

     ADC12CTL1 = 0xA202;    // mit A -> erster  Wert wird in ADC12MEM10 gespeichert
                            // ADC12SC bit triggers Sample&Hold         -- siehe S.31
                            // sample pulse is generated by Sampling Timer
                            // Clock Source: ADC12 internal oscillator
                            // Clock divider: 1
                            // conversion mode: one single sequence

     ADC12CTL0 = 0x00F0;    // Sample&Hold Time 0
                            // Sample&Hold Time 1
                            // Multiple Sample&Hold: only one sample is taken?
                            // interne REF ist EIN
                            // reference voltage is 2,5V
                            // ADC12 module is switched on 
                            // MSC ist EIN

     ADC12CTL0 |= 0x02; */    // enable conversion
}
void AusgabeP4b(void)
{
    int ZW,ZW2;
    	ZW2=0xCC;
	ZW= 0x22;
	P4OUT=ZW;
	P1OUT = BIT0;  // Set P1.0
	delay();
	//delay();
	P4OUT = ZW2; 
	P1OUT = ~BIT0; 
	delay();
	delay();
	delay();
	P1IFG&=BIT5;    //& setzt BIT5 auf 0
	P4OUT = P1IFG;	// nur Kontrolle wie PIFG aussieht
	_EINT();	// gibt Interrupt wieder frei
			}
void AusgabeP4a(void)
{
	int ZW,ZW2;
	ZW2=0x88;
	ZW= 0x33;
	P4OUT=ZW;
	P1OUT = BIT0;  // Set P1.0
	delay();
	P4OUT =ZW2; 
	P1OUT = ~BIT0;  
	delay();
	delay();
	delay();
	P1IFG&=BIT6 ;  
	P4OUT = P1IFG;
	_EINT();
	}
void AusgabeP4(void)
{
	
	int ZW,ZW2;
	_EINT();	// gibt Interrupt frei
	ZW2=0x11;
	ZW= 0x66;
	P4OUT=ZW2;
	P1OUT = BIT0;  // Set P1.0
	delay2();
	//delay();
	P4OUT =ZW; 
	P1OUT = ~BIT0;  	
	delay2();
	
	
	}
interrupt[PORT1_VECTOR] void Taste (void)
	{
	if ((P1IFG&BIT5) == BIT5) AusgabeP4a();	// prüft, ob Flag 5 gesetzt ist; & schneidet aus
	
	if ((P1IFG&BIT6) == BIT6) AusgabeP4b();
	}