天天看点

MSP430学习笔记2-跑马灯程序,熟悉定时器寄存器的配置。

这个例子主要还是熟悉有关定时器A的寄存器配置以及IAR的配置方式。

/*********************************************** 

程序功能:实现流水灯以三种流动方式和四种流动速度 

          的不同组合而进行点亮"流动" 

------------------------------------------------ 

拨码开关设置:将LED位拨至ON,其余拨至OFF 

测试说明:观察流水灯流动顺序和速度的变化 

************************************************/  

#include  <msp430x14x.h>  

typedef unsigned int  uint;  

uint i = 0,j = 0,dir = 0;  

uint flag = 0,speed = 0;  //flag--灯光流动方式,speed--灯光流动速度  

/****************主函数****************/  

void main(void)  

{  

    /*下面六行程序关闭所有的IO口*/  

    P1DIR = 0XFF;P1OUT = 0XFF;  

    P2DIR = 0XFF;P2OUT = 0XFF;  

    P3DIR = 0XFF;P3OUT = 0XFF;  

    P4DIR = 0XFF;P4OUT = 0XFF;  

    P5DIR = 0XFF;P5OUT = 0XFF;  

    P6DIR = 0XFF;P6OUT = 0XFF;  

    WDTCTL = WDTPW + WDTHOLD;       //关闭看门狗  

    P6DIR |= BIT2;P6OUT |= BIT2;    //关闭电平转换  

    P5OUT &= ~BIT7;  

    CCTL0 = CCIE;                   //使能CCR0中断  

    CCR0 = 50000;  

    TACTL = TASSEL_2 + ID_3 + MC_1; //定时器A的时钟源选择SMCLK,8分频增计数模式  

    P2DIR = 0xff;                   //设置P2口方向为输出  

    P2OUT = 0xff;  

    _EINT();                        //使能全局中断  

    LPM0;                           //CPU进入LPM0模式各时钟全部工作  

}  

/******************************************* 

函数名称:Timer_A  

功    能:定时器A的中断服务函数,在这里通过标志 

          控制流水灯的流动方向和流动速度 

参    数:无 

返回值  :无 

********************************************/  

#pragma vector = TIMERA0_VECTOR  

__interrupt void Timer_A (void)  

{    

    if(flag == 0)  

    {  

        P2OUT = ~(0x80>>(i++));    //灯的点亮顺序D8 -> D1  

    }  

    else if(flag == 1)  

        P2OUT = ~(0x01<<(i++));    //灯的点亮顺序D1 -> D8  

    else   

        if(dir)                  //灯的点亮顺序  D8 -> D1,D1 -> D8,循环绕圈                          

        {  

            P2OUT = ~(0x80>>(i++));  

        }  

        else  

            P2OUT = ~(0x01<<(i++));  

    if(i == 8)   

        i = 0;  

        dir = ~dir;  

    j++;  

    if(j == 10)   

        j = 0;  

        flag++;  

        if(flag == 4) flag = 0;  

        switch(speed)//根据speed的值来选择相应的速度,速度的选择主要通过改变分频来实现  

        case 0:  

            TACTL &=~ (ID0 + ID1);//这个地方其实没必要,意思是清零TACTL的78两位  

            //ID1的值是0x0080   ID2的值是0x0040通过计算就可以得出  

            TACTL |= ID_3;//改为八分频  

            break;  

        case 1:  

            TACTL &=~ (ID0 + ID1);  

            TACTL |= ID_2;  

        case 2:  

            TACTL |= ID_1;  

        case 3:  

            TACTL |= ID_0;  

        default:  

        if(flag != 3)   speed++;  

        if(speed == 4) speed = 0;  

    }   

本文转自emouse博客园博客,原文链接:http://www.cnblogs.com/emouse/archive/2010/07/20/2198224.html,如需转载请自行联系原作者

继续阅读