一  /*利用WDT的定时器模式控制led小灯L1以1s的间隔时间闪灭*/
#include "io430.h"
int main( void )
{
  // Stop watchdog timer to prevent time out reset
  //WDTCTL = WDTPW + WDTHOLD;
   
    P6DIR |= BIT2;P6OUT |= BIT2;      //关电平转换,P6.2连接了开发板上
                                      //的电平转换芯片的使能端,与实际功能无关
    WDTCTL=WDT_ADLY_1000;//设置看门狗ACLK定时器1000ms定时
    IE1|=WDTIE;//开看门狗定时器中断
    P2DIR|=BIT0;
    P2OUT|=BIT0;
    __enable_interrupt();//_EINT();//开总中断
   
    while(1)
    {
        LPM0;//进入低功耗模式一,CPUOFF
    }
   
  return 0;
}
#pragma vector = WDT_VECTOR
__interrupt void watchdog_timer()
{
    P2OUT=~P2OUT;
}
二 /*定时器A增计数模式下,ALK=32768HZ,MCLK=SMCLK=DCOCLK=800KHZ
利用定时器溢出中断TAIE实现小灯L1每0.5秒闪灭一次,时钟选择ALK,8分频
注意:TTAIE指TAR计数器溢出,从65535 到0的变化,由 TAIFG 引起的,
TAIFG 一般进 TIMERA1_VECTOR中断向量;
*/
#include "io430.h"
int main( void )
{
  // Stop watchdog timer to prevent time out reset
    WDTCTL = WDTPW + WDTHOLD;
    P2DIR|=BIT0;
    P2OUT|=BIT0;
    __enable_interrupt();
    TACTL=TASSEL_1+MC_1+ID_3+TAIE;//选择ACK,增计数模式,
                                  //8分频,使能定时器中断
    CCR0=4095;
    //CCIE
    while(1)
    {
        LPM0;
    }
    430分能上什么大学
  return 0;
}
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A()
{
    switch(TAIV)
    {
    case 2:break;
    case 4:break;
    case 10:P2OUT=~P2OUT;break;
    }
}
三 /*定时器A增计数模式下,ALK=32768HZ,MCLK=SMCLK=DCOCLK=800KHZ
实现小灯L1每0.5秒闪灭一次,时钟选择SMCLK,使用CCIE中断。
注意:CCIE指捕获到相应信号(捕获模式下) ;定时时间到(比较模式下),
由CCIFG引起的。CCIFG的话要看用的是哪个定时器,如果是CCR0的话就进TIMERA0_VECTOR,
如果是CR1,CCR2……则进TIMERA1_VECTOR*/
#include "io430.h"
int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  P2DIR|=BIT0;
  P2OUT|=BIT0;
  __enable_interrupt();//使能中断
  TACTL=TASSEL_2+TACLR+MC_1+ID_3;//时钟选择SMCLK,计数器清零,增计数模式,8分频
  CCTL0=CCIE;//CCR0中断允许
  CCR0=50000;
  while(1)
  {
    LPM0;
  }
 
  return 0;
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A()
{
      P2OUT=~P2OUT;
}
四 /*使用CCR0定时中断。CCR0的值是可以改变的,当CCR0增加到0ffffh后自动把它清为0.
实验效果为:
灯先闪的越来越慢,后突然变得很快,再慢慢变慢。
CCR0的值越大定时越长,当CCR0超过65535时会自动清理,使得定时时间很短。
而通过高低电平的实时改变也可以用来做相应管脚的PWM输出*/
#include "io430.h"
int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  P2DIR|=BIT0;
  P2OUT|=BIT0;
  __enable_interrupt();
  TACTL=TASSEL_2+TACLR+MC_1+ID_3;//时钟选择SMCLK,计数器清零,增计数模式,8分频
  CCTL0=CCIE;
  CCR0=50000;
  while(1)
  {
    LPM0;
  }
  return 0;
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A()
{
    P2OUT=~P2OUT;
    CCR0+=1000;
}
五/*定时器连续计数模式举例:
1、在需要65536个时钟周期的定时器应用场合常用连续计数模式。
定时器从当前值计数到0FFFFH后又从0开始计数。当定时器
从0FFFFH到0时设置标志位TAIFG。
2、连续计数模式下,也可以通过改变TACCRx的值,产生独立的
时间间隔,例如,可以在相应的比较寄存器TACCRx上加上一个时间差,
不断地增加TACCRx的值,使定时器每到一定的时间间隔都能与TACCRx的值
相等,从而使中断标志位置位,申请中断。
以下代码验证了上面两种情况*/
#include "io430.h"
int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  P2DIR=BIT0+BIT1;
  P2OUT=BIT0+BIT1;
  TACTL=TASSEL_1+TACLR+MC_2+TAIE;//ACK,连续计数模式
  CCTL0=CCIE;
  CCR0=32768/4;
  __enable_interrupt();
  while(1)
  {
    LPM0;
  }
  return 0;
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Time_A()
{
    P2OUT^=BIT0;
    CCR0+=32768/4;
}
#pragma vector=TIMERA1_VECTOR
__interrupt void Time_a()
{
    switch(TAIV)
    {
    case 2:break;
    case 4:break;
    case 10:P2OUT^=BIT1;break;
    }
}
六 /*任务要求
利用定时器A产生4路周期信号,周期分别是4s,2s,1s和0.25s,四路周期
信号分别从P2.0--P2.3口输出。*/
#include "io430.h"
int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  P2DIR=BIT0+BIT1+BIT2+BIT3;
  P2OUT=BIT0+BIT1+BIT2+BIT3;
  TACTL=TASSEL_1+MC_2+TAIE;//ACK,连续计数模式,定时器溢出中断
  CCTL0=CCIE;
  CCTL1=CCIE;
  CCTL2=CCIE;
  CCR0=32768/8;
  CCR1=32768/2;
  CCR2=32768;
  __enable_interrupt();
  while(1)
  {
    LPM0;
  }
  return 0;
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A0()
{
    P2OUT^=BIT3;
    CCR0+=32768/8;
}
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1()
{
    switch(TAIV)
    {
    case 2:
      CCR1+=32768/2;
      P2OUT^=BIT2;
      break;
    case 4:
      CCR2+=32768;
      P2OUT^=BIT1;
      break;
    case 10:
      P2OUT^=BIT0;
      break;
    }
}
七 四乘四按键
#include "io430.h"
#define uchar unsigned char
#define unit unsigned int
void delay(unit time)
{unit i;
while(time--)
for(i=100;i>0;i-1);
}
uchar keyscan(void)
{
  uchar KeyNum;
  P1OUT=0X0F;
  if((P1IN&0X0F)!=0X0F)
  {
    delay(100);
    if((P1IN&0X0F)!=0X0F)
    {
      P1OUT=0XE0;                        //判断哪列被拉低
      if((P1IN&0X0F)==0X0E)           //判断哪行被拉低
        KeyNum= 0;   
      if((P1IN&0X0F)==0X0d)
        KeyNum= 1;
      if((P1IN&0X0F)==0X0b)
        KeyNum= 2;
      if((P1IN&0X0F)==0X07)
        KeyNum= 3;
 
      P1OUT=0XD0;
      if((P1IN&0X0F)==0X0E)
        KeyNum= 4;
      if((P1IN&0X0F)==0X0d)
        KeyNum= 5;
      if((P1IN&0X0F)==0X0b)
        KeyNum= 6;
      if((P1IN&0X0F)==0X07)
        KeyNum= 7;
       
      P1OUT=0XB0;
      if((P1IN&0X0F)==0X0E)
        KeyNum= 8;
      if((P1IN&0X0F)==0X0d)
        KeyNum= 9;
      if((P1IN&0X0F)==0X0b)
        KeyNum= 10;
      if((P1IN&0X0F)==0X07)
        KeyNum= 11;
   
      P1OUT=0X70;
      if((P1IN&0X0F)==0X0E)
        KeyNum= 12;
      if((P1IN&0X0F)==0X0d)
        KeyNum= 13;
      if((P1IN&0X0F)==0X0b)
        KeyNum= 14;
      if((P1IN&0X0F)==0X07)
        KeyNum= 15;
    }
    else
    {
      KeyNum=KeyNum;
    }
  }
  return KeyNum;
}

int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
 P2SEL=0X00;
 P2DIR=0XFF;
 P1SEL=0X00;
 P1DIR=0XF0;
 while(1)
 {
   P2OUT=keyscan();
 }