泰凌微8258按键控制小灯PWM渐变熄灭

主要功能:双击按键,按键第二次按下时保持长按,灯在三秒钟时间内从最亮状态渐变到熄灭 松开按键后保持当前状态,如果中途松开按键,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();
			}
		}
	}
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值