我想配置我的按钮并配置LED闪烁速度,这样当我第一次按下按钮时,LED闪烁得更慢。当我再次按下时,LED指示灯仍然缓慢闪烁,当我第三次按下时,LED指示灯闪烁最慢。
毕竟当我第四次按下按钮时我想关闭LED(即直到我按下按钮才闪烁)。我以为我可以用mod运算符(a % 3 == 0
???)
这是我更新后的代码:
unsigned int rate = 1000000;
int NUM_STATES = 4 ;
unsigned int counter=1;
for(;;)
{
if( buttonPressed() )
{
rate += 2000000;
counter++;
}
if(counter % 4 == 0)
{
rate = 0;
}
flashSequence(rate);
}
}
int buttonPressed(void)
{
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0))
return 1;
else
return 0;
}
void flashSequence (int rating)
{
if (rating == 0)
GPIO_ResetBits(GPIOD,
GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
else
{
/* PD12 to be toggled */
GPIO_SetBits(GPIOD, GPIO_Pin_12);
/* Insert delay */
Delay(rating);
/* PD13 to be toggled */
GPIO_SetBits(GPIOD, GPIO_Pin_13);
/* Insert delay */
Delay(rating);
/* PD14 to be toggled */
GPIO_SetBits(GPIOD, GPIO_Pin_14);
/* Insert delay */
Delay(rating);
/* PD15 to be toggled */
GPIO_SetBits(GPIOD, GPIO_Pin_15);
/* Insert delay */
Delay(rating);
GPIO_ResetBits(GPIOD,
GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
Delay(rating);
}
}
答案 0 :(得分:0)
counter % 3
将产生0,1或2,但您已描述了四种状态,因此需要counter % 4
。实际上你没有在第一次按下之前描述状态,所以也许有5个。
如果状态数不是2的幂,则当计数器回绕时,使用模 n 将导致不连续。使用unsigned int
计数器,这可能不是一个实际限制,但它至少是一个潜在的错误。
您发布的代码片段不起作用,因为(在其他问题中)counter
未在循环中修改,因此它永远不会退出,并且永远不会更改闪存速率。
您需要以下形式的内容:
int rate = 0 ; // Off
#define NUM_STATES = 4 ; (0 to 3)
for(;;)
{
if( buttonPressed() )
{
rate++ ;
rate %= NUM_STATES ;
}
flashSequence( rate ) ;
}
flashSequence()
是一个以与rate
成比例的速率闪烁的函数,零(0)是" OFF"的特殊情况。
答案 1 :(得分:0)
我担心解释有点太多,但LED闪烁模式和按键读数应该在定时器中断时完成,并且不会阻止正常的程序流程。
想象一下这种情况,如果在按键后你需要闪烁LED但是程序需要正常执行。
您可以查看我的代码:
LED - https://www.diymat.co.uk/arm-blinking-led-driver/
PS我的页面处于永久建设状态:)。