MSP430学习笔记2-跑马灯程序,熟悉定时器寄存器的配置
扫描二维码
随时随地手机看文章
这个例子主要还是熟悉有关定时器A的寄存器配置以及IAR的配置方式。
/***********************************************
程序功能:实现流水灯以三种流动方式和四种流动速度
的不同组合而进行点亮"流动"
------------------------------------------------
拨码开关设置:将LED位拨至ON,其余拨至OFF
测试说明:观察流水灯流动顺序和速度的变化
************************************************/
#include
typedefunsignedintuint;
uinti=0,j=0,dir=0;
uintflag=0,speed=0;//flag--灯光流动方式,speed--灯光流动速度
/****************主函数****************/
voidmain(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的中断服务函数,在这里通过标志
控制流水灯的流动方向和流动速度
参数:无
返回值:无
********************************************/
#pragmavector=TIMERA0_VECTOR
__interruptvoidTimer_A(void)
{
if(flag==0)
{
P2OUT=~(0x80>>(i++));//灯的点亮顺序D8->D1
}
elseif(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)
{
i=0;
j=0;
flag++;
if(flag==4)flag=0;
switch(speed)//根据speed的值来选择相应的速度,速度的选择主要通过改变分频来实现
{
case0:
TACTL&=~(ID0+ID1);//这个地方其实没必要,意思是清零TACTL的78两位
//ID1的值是0x0080ID2的值是0x0040通过计算就可以得出
TACTL|=ID_3;//改为八分频
break;
case1:
TACTL&=~(ID0+ID1);
TACTL|=ID_2;
break;
case2:
TACTL&=~(ID0+ID1);
TACTL|=ID_1;
break;
case3:
TACTL&=~(ID0+ID1);
TACTL|=ID_0;
break;
default:
break;
}
if(flag!=3)speed++;
if(speed==4)speed=0;
}
}