呼吸灯


void Breathe_LED(void);


// 定时器4中断(1ms)
#pragma vector = TIM4_UIF_vector
__interrupt void TIM4_OVF_IRQHandler(void)
{

if( ++sG_CurTime.ms>=1000 )
{
sG_CurTime.ms = 0;

sG_CurTime.secFlag = 0xFF;

sG_CurTime.second++;

if (sG_CurTime.second >= 60)
{
sG_CurTime.second -= 60;
}
}
Breathe_LED();

TIM4_SR1 = 0xFE; 
}

void Breathe_LED(void) 
{

static u16 X = 1000;    
u8 cnt = 8;

// 对3取余:结果只能是0 1 2 
if((sG_CurTime.second %3) != 0)
{
if( (sG_CurTime.second % 3 ) & 0x1 == 1)   // Z和0x00000001与,是1,也就是说Z的最低位是1,当前是奇数秒。
{

X--;              // PWM值递减

TIM3_CCR1H = ((X/cnt) & 0xFF00 )>>8; 

TIM3_CCR1L = (X/cnt) & 0xFF;
// 小技巧:把这里的PWM递减值,分为1000/8 = 125个档位区间.这里X=1000与X= 999,最终对应板子输出的PWM值是一样的


TIM2_CCR1H = ((X/cnt) & 0xFF00 )>>8;
TIM2_CCR1L = (X/cnt) & 0xFF;

TIM2_CCR2H = ((X/cnt) & 0xFF00 )>>8;
TIM2_CCR2L = (X/cnt) & 0xFF;

}
else if( (sG_CurTime.second % 3 ) & 0x1 == 0) // 只要Z是偶数,都满足Z&0x00000001 =0。但是这里还有一个前提条件,Z不是3的整数倍。
{
TIM3_CCR1H = 0x00;
TIM3_CCR1L = 0x00;

TIM2_CCR1H = 0x00;
TIM2_CCR1L = 0x00;

TIM2_CCR2H = 0x00;
TIM2_CCR2L = 0x00;
}

}
else{  // Z是3的整数倍,跳到这里。

TIM3_CCR1H = ( (sG_CurTime.ms/cnt) & 0xFF00)>>8;
TIM3_CCR1L = (sG_CurTime.ms/cnt) & 0xFF;

TIM2_CCR1H = ( (sG_CurTime.ms/cnt) & 0xFF00)>>8;
TIM2_CCR1L = (sG_CurTime.ms/cnt) & 0xFF;

TIM2_CCR2H = ( (sG_CurTime.ms/cnt) & 0xFF00)>>8;
TIM2_CCR2L = (sG_CurTime.ms/cnt) & 0xFF;
X = 1000; // 在奇数秒内 重复执行了 这里的代码,执行1000遍。 待会使用状态机, 脱离 奇数秒, 执行一遍即可。
}

}

这里实现的一个逻辑功能可以归纳为:

对于一个整数Z,可以用一个整数Y对Z取余(余数为0是一种状态),得到0到Y-1, 然后可以在0到Y-1之间按照偶数奇数来进行区分(Z对Y的余数不为0,再把Z细分为奇数和偶数)。这样就可以得到三种状态。

Wireless_Sysnc_Spicke    _XXX_BDWY_YYY

相关