MSP学习笔记(3)
预告中的一段视频,用来骗骗小孩子还是不错的,对于工程师来说,当然很快就能透过现象看到本质,外壳里面不过就是一个键控灯而已。
之所以选这么一个东西来练手,是因为我日益感受到做一个“有现象的东西”对于学习的激励作用。
七彩灯原理图
这里用到了一个七彩灯,也就是在一个5mm直径的发光管中封装了红、绿、蓝三色的一个发光二极管。
下面我们分步来完成。
硬件连接: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; //关闭蓝灯
关于灯的渐亮和渐灭的原理,我已在博客里谈过多次,这里就不再重复了。先给段代码吧。这个就是基于博文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上的灯渐亮渐灭了。
zd.cai_402214705 2011-8-1 18:30
用户311125 2011-7-30 23:51