主要功能:双击按键,按键第二次按下时保持长按,灯在三秒钟时间内从最亮状态渐变到熄灭 松开按键后保持当前状态,如果中途松开按键,PWM保持当前亮度不变。
1、初始化操作
按键初始化
gpio_set_func(GPIO_PD4,AS_GPIO);
gpio_set_input_en(GPIO_PD4, 1); // 将按键引脚设置为输入模式
gpio_setup_up_down_resistor(GPIO_PD4,1); // 设置按键的上拉电阻
PWM初始化包括.h文件中的宏定义和主函数中的初始化调用
.h
#define GY_LED_D_PIN GPIO_PD2
#define GY_PWM_FUNC_D AS_PWM
#define GY_PWMID_D (GET_PWMID(GY_LED_D_PIN, GY_PWM_FUNC_D)) //定义引脚和pwm状态
#define GY_PWM_INV_D (GET_PWM_INVERT_VAL(GY_LED_D_PIN, GY_PWM_FUNC_D))
调用
pwm_set(GY_PWMID_D, PWM_MAX_TICK, GY_PWM_INV_D ? PWM_MAX_TICK - 0 : 0); //越来越小,亮度越来越亮
pwm_start(GY_PWMID_D);
gpio_set_func(GY_LED_D_PIN, GY_PWM_FUNC_D);//前面是ping脚,后面是功能
2、功能实现
我这里把判断双击按键执行的命令放在了主函数,将后续长按PWM控制熄灭另写了一个函数pwm_fade_out(),这样代码看着没那么乱。
主函数代码中添加了个标志位i,用来判断是否满足双击按下。
// 死循环检测按键长按
while (1)
{ wd_clear();
// 检测按键长按,如果按键长按则进行PWM变暗操作
if (gpio_read(GPIO_PD4) == 0)
{
sleep_ms(500);
i++;
if (i == 2)
{
i = 0;
pwm_fade_out();
}
}
}
pwm_fade_out()函数中,设计每次时间变化所需时间间隔,从而算出step每次降低的亮度值和循环次数loop_count,为了满足长按渐变熄灭在循环判断中增加按键按下判断,并且松开按键保持当前状态。
// 计算每次降低的亮度值
u32 step = 480;
u32 brightness = 0;
// 计算每次亮度变化需要的时间间隔
u32 interval_ms = 20;
// 计算变暗所需总时间
u32 fade_time_ms = 3000;
// 计算需要循环的次数
u32 loop_count = fade_time_ms / interval_ms;//150
// 进行逐渐变暗操作
for (u32 i = 0; i < loop_count && (gpio_read(GPIO_PD4) == 0); i++)
{
// 设置PWM占空比
pwm_set_cmp (GY_PWMID_D, brightness);
// 延时
sleep_ms(interval_ms);
// 降低亮度
if (brightness < 27000)
{
brightness += step;
}
else
{
brightness = 27000;
}
}
3、所有代码
static void pwm_fade_out(void)
{
// 初始化PWM
pwm_set(GY_PWMID_D, PWM_MAX_TICK, GY_PWM_INV_D ? PWM_MAX_TICK - 0 : 0); //越来越小,亮度越来越亮
pwm_start(GY_PWMID_D);
gpio_set_func(GY_LED_D_PIN, GY_PWM_FUNC_D);//前面是ping脚,后面是功能
//pwm_set_cmp (GY_PWMID_D, 0);
gpio_set_func(GPIO_PD4,AS_GPIO);
gpio_set_input_en(GPIO_PD4, 1); // 将按键引脚设置为输入模式
gpio_setup_up_down_resistor(GPIO_PD4,1); // 设置按键的上拉电阻
// 计算每次降低的亮度值
u32 step = 480;
u32 brightness = 0;
// 计算每次亮度变化需要的时间间隔
u32 interval_ms = 20;
// 计算变暗所需总时间
u32 fade_time_ms = 3000;
// 计算需要循环的次数
u32 loop_count = fade_time_ms / interval_ms;//150
// 进行逐渐变暗操作
for (u32 i = 0; i < loop_count && (gpio_read(GPIO_PD4) == 0); i++)
{
// 设置PWM占空比
pwm_set_cmp (GY_PWMID_D, brightness);
// 延时
sleep_ms(interval_ms);
// 降低亮度
if (brightness < 27000)
{
brightness += step;
}
else
{
brightness = 27000;
}
}
}
void test4()
{
gpio_set_func(GPIO_PD4,AS_GPIO);
gpio_set_input_en(GPIO_PD4, 1); // 将按键引脚设置为输入模式
gpio_setup_up_down_resistor(GPIO_PD4,1); // 设置按键的上拉电阻
u32 i = 0;
// 死循环检测按键长按
while (1)
{ wd_clear();
// 检测按键长按,如果按键长按则进行PWM变暗操作
if (gpio_read(GPIO_PD4) == 0)
{
sleep_ms(500);
i++;
if (i == 2)
{
i = 0;
pwm_fade_out();
}
}
}
}