具体要求:长按按键3秒时所有灯闪烁,再次长按按键3秒所有灯停止闪烁,返回到闪烁之前的状态 。(我只做了一个灯其他灯灯同理)
1、初始化引脚
gpio_set_func(GPIO_PC4, AS_GPIO); // 将小灯引脚设置为GPIO模式
gpio_set_output_en(GPIO_PC4, 1); // 设置小灯为输出模式
gpio_set_input_en(GPIO_PC4,0);
gpio_write(GPIO_PC4, 1); //写入高电平,默认熄灭
gpio_set_func(GPIO_PD3,AS_GPIO);
gpio_set_input_en(GPIO_PD3, 1); // 将按键引脚设置为输入模式
gpio_setup_up_down_resistor(GPIO_PD3,1); // 设置按键的上拉电阻
2、这里用到定时器和标志位
定时器用来判断长按三秒时间的到达,定义一个开始时间start_tick用来接收按键按下的开始时间clock_time(),通过clock_time_exceed()函数来判断时间是否到达。
start_tick = clock_time(); // clock_time()返回 System Timer tick 值。
clock_time_exceed(start_tick, 3 * 1000 * 1000)
标志位默认为1小灯灭led_status=1,为了后续判断更加准确,因为题目里明确说明点亮闪烁后再次长按熄灭,所以第二次长按的判断应该嵌套在第一次点亮判断的里面。
u8 led_status = 1; //1默认为小灯灭
if (gpio_read(GPIO_PD3)==0 && led_status)//按键第一次按下
if (gpio_read(GPIO_PD3)==0 && !led_status)//按键第二次按下
3、全部代码
void test3(void)// 长按三秒开灯,再次长按三秒关灯
{
u8 led_status = 1; //1默认为小灯灭
gpio_set_func(GPIO_PC4, AS_GPIO); // 将小灯引脚设置为GPIO模式
gpio_set_output_en(GPIO_PC4, 1); // 设置小灯为输出模式
gpio_set_input_en(GPIO_PC4,0);
gpio_write(GPIO_PC4, 1);
gpio_set_func(GPIO_PD3,AS_GPIO);
gpio_set_input_en(GPIO_PD3, 1); // 将按键引脚设置为输入模式
gpio_setup_up_down_resistor(GPIO_PD3,1); // 设置按键的上拉电阻
while (1)
{
wd_clear();
u8 i = 1;
u32 start_tick = 0;
u32 current_tick = 0;
if (gpio_read(GPIO_PD3)==0 && led_status)
{
start_tick = clock_time(); // clock_time()返回 System Timer tick 值。
while (i)
{
wd_clear();
if( gpio_read(GPIO_PD3)==0 && clock_time_exceed(start_tick, 3 * 1000 * 1000))
{
while (i)
{
wd_clear();
led_status = 0;
gpio_write(GPIO_PC4,0);
sleep_ms(500);
gpio_write(GPIO_PC4,1);
sleep_ms(500);
if (gpio_read(GPIO_PD3)==0 && !led_status)
{
current_tick = clock_time(); // clock_time()返回 System Timer tick 值。
while (i)
{
wd_clear();
gpio_write(GPIO_PC4,0);
sleep_ms(500);
gpio_write(GPIO_PC4,1);
sleep_ms(500);
if (gpio_read(GPIO_PD3)==0 && clock_time_exceed(current_tick, 3 * 1000 * 1000))
{
led_status = 1;
gpio_write(GPIO_PC4,1);
i = 0;
sleep_ms(900);//这里延时是去除按键抖动,放在这里的原因是小灯熄灭的现象需要立刻出现
}
}
}
}
}
}
}
}
}
如有不对的地方欢迎指正~