Randy 发表于 2012-7-18 09:23:00

【大赛原创经验贴】用定时器A实现LED流水灯程序

学习msp430有一段时间了,刚开始自己是一点都不懂,什么寄存器之类的,压根就不知道是什么回事。虽然之前发了一个用定时器A实现LED灯闪烁程序,但是那只是一个非常简单的程序,对于初学者学习还行。我以前学过C51单片机,所以今天想通过MSP430f249实现LED流水灯闪烁。下面是我自己写的程序,同时也经过了我同学的帮助和修改。#include<msp430x24x.h>
#define uchar unsigned char
#define uint unsigned int
uint table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//uint table[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uint i=0,num=0;
void main(void)
{
WDTCTL=WDTPW+WDTHOLD;
P1DIR|=0Xff;
CCTL0=CCIE;
CCR0=1200;
TACTL=TASSEL_2+MC_2;
_EINT();
for(;;);
}
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA0(void)
{
i++;
if(i==6)
{
    i=0;
   P1OUT=table;
    // P1OUT^=table;
    num++;
}
if(num==8)
    num=0;
}
       我们刚开始想实现流水灯来回闪烁,上面的程序可以实现一位一位点亮,不能来回闪烁。在编写中我们开始没有将num,i 置0,只能用Uint型使程序工作。还有num=8,才能够置0,不是num=7置0,否则出现第8个灯不闪。后面加//的程序可以加到前一行,可以看到不同的效果。
后面我们修改了一次,采用了flag标志,可以实现流水灯来回闪烁。
#include<msp430x24x.h>
#define uchar unsigned char
#define uint unsigned int
uint table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uint i=0,num,flag;
void main(void)
{
WDTCTL=WDTPW+WDTHOLD;
P1DIR=0XFF;
CCTL0=CCIE;
CCR0=10;
TACTL=TASSEL_2+MC_2;
_EINT();
for(;;);
}
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA0(void)
{
if(flag==0)
{
    i++;
    for(num=0;num<10;num++);
    P1OUT=table[ i ];
    if(i==7)
    {
      flag=1;   
    }
}
else
{
    i--;
    for(num=0;num<10;num++);
    P1OUT=table[ i ];
    if(i==0)
    {
      flag=0;
    }
}
}

页: [1]
查看完整版本: 【大赛原创经验贴】用定时器A实现LED流水灯程序