平凡

MSP430学习笔记(3)

0
阅读(1888)

MSP学习笔记(3)

预告中的一段视频,用来骗骗小孩子还是不错的,对于工程师来说,当然很快就能透过现象看到本质,外壳里面不过就是一个键控灯而已。

之所以选这么一个东西来练手,是因为我日益感受到做一个“有现象的东西”对于学习的激励作用。

七彩灯原理图

这里用到了一个七彩灯,也就是在一个5mm直径的发光管中封装了红、绿、蓝三色的一个发光二极管。

下面我们分步来完成。

1.分别点亮3个灯

硬件连接:R连接于P2.0,G连接于P2.1,B连接于P2.2,即P2.0~P2.2分别控制红、绿、蓝灯。

那么基于第一个例子,分别控制R、G、B亮或灭的代码如下:

P2&=0xfe; //点亮红灯

P2|=0x01; //关闭红灯

//////////////

P2&=0xfd; //点亮绿灯

P2|=0x02; //关闭绿灯

//////////////

P2&=0xfb; //点亮蓝灯

P2|=0x04; //关闭蓝灯

2.灯的渐亮渐灭

关于灯的渐亮和渐灭的原理,我已在博客里谈过多次,这里就不再重复了。先给段代码吧。这个就是基于博文1(http://blog.ednchina.com/czlyzhj/2108970/message.aspx)修改的。

#include <msp430x14x.h>

#include "BoardConfig.h"

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

void main(void)

{

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

BoardConfig(0xf0); //关闭数码管和电平转换,打开流水灯

CCTL0 = CCIE; //使能CCR0中断

CCR0 = 15; //设定周期****S (等会计算)

TACTL = TASSEL_1 + ID_0 + MC_1; //定时器A的时钟源选择ACLK,增计数模式

//注意前2行已修改。CCR0的值,ID_3变成了ID_0

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

P2OUT = 0x55;

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

LPM3; //CPU进入LPM3模式

}

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

函数名称:Timer_A

功 能:定时器A的中断服务函数

参 数:无

返回值 :无

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

uchar PwmTab[]={0,0,1,1,2,3,6,7,9,10,11,12,13,14,15,16,18,19,20,20} ;

#pragma vector = TIMERA0_VECTOR

__interrupt void Timer_A (void)

{

static uchar LedOn;

static uchar CountS,CountL; //CountS是小周期,最大计到20,CountL是大周期

static uchar iCount;

static uchar UpDown=0;

if(++CountS>=20) //小周期结束

{ CountS=0;

iCount++;

if(iCount==5)

{ iCount=0;

if(++CountL>=20) //大周期计数

{ UpDown=~UpDown; //大周期结束上升/下降切换

CountL=0;

}

if(UpDown)

LedOn=PwmTab[CountL];

else

LedOn=PwmTab[19-CountL];

}

}

if(CountS>LedOn)

P2OUT&=0xfe;

else

P2OUT|=0x01;

}

将这段代码写进芯片,可以见到接在P2.0上的灯渐亮渐灭了。