呼吸灯
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