|
600黑币
各位大神你们好,
我是一枚新手,现在遇到一个问题。实在是不好意思,确实是时间不多了不够我来慢慢看自己做。所以才在论坛上咨询各位大神。确实很羞愧做一个伸手党。
问题如下:
总电路是车辆系统上的灯光总电路,SC1是闪光灯(Blinker)的电路。使用的是MSP430G2553IPW20。
需要实现如下要求:闪光灯(Blinker)在给了信号后依次闪烁,如奥迪闪光灯一样,从车头中间依次向两边亮起。闪过的灯光保持不灭,直到最后一个灯亮起。然后所有灯灭。如此循环。P1.0是闪光灯的信号输入口,P2.0/2.1/2.2/2.3/2.4/2.5/2.6/2.7则是灯泡串的输出端。
只需要闪光灯部分的代码,跪谢各位大佬。
我在网络上搜到一个代码但是不知道如何使用。也放在这里了。
#include <msp430g2553.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,增计数模式
P2DIR = 0xff; //设置P2口方向为输出
P2OUT = 0xff;
_EINT(); //使能全局中断
LPM0; //CPU进入LPM0模式
}
#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 == 40) //循环5次就改变flag改变流动方向
{
i = 0;
j = 0;
flag++;
if(flag == 4) flag = 0;
switch(speed)
{
case 0:
TACTL &=~ (ID0 + ID1);
TACTL |= ID_3;
break;
case 1:
TACTL &=~ (ID0 + ID1);
TACTL |= ID_2;
break;
case 2:
TACTL &=~ (ID0 + ID1);
TACTL |= ID_1;
break;
case 3:
TACTL &=~ (ID0 + ID1);
TACTL |= ID_0;
break;
default:
break;
}
if(flag != 3) speed++;
if(speed == 4) speed = 0;
}
}
|
|