69 lines
2.0 KiB
C
69 lines
2.0 KiB
C
#include "button.h"
|
|
|
|
uint32 button_press_time = 0; // 按钮按下时间计数
|
|
static volatile button_status_enum button_status = BUTTON_NO_PRESS; // 按钮LED状态
|
|
|
|
void button_init()
|
|
{
|
|
gpio_mode(BUTTON_LED_R, GPO_PP);
|
|
gpio_mode(BUTTON_LED_G, GPO_PP);
|
|
gpio_mode(BUTTON_LED_O, GPO_PP);
|
|
gpio_set_level(BUTTON_LED_R, 0);
|
|
gpio_set_level(BUTTON_LED_G, 0);
|
|
gpio_set_level(BUTTON_LED_O, 0);
|
|
|
|
gpio_pull_set(BUTTON_NO_PIN, PULLUP); // 设置按钮引脚
|
|
gpio_pull_set(BUTTON_NC_PIN, PULLUP); // 设置按钮引脚
|
|
gpio_mode(BUTTON_NO_PIN, GPIO); // 设置按钮引脚为输入模式
|
|
gpio_mode(BUTTON_NC_PIN, GPIO); // 设置按钮引脚为输入模式
|
|
// PINIPH |= 0x01;
|
|
// PINIPL |= 0x01;
|
|
// P0IM0 &= 0x3F;
|
|
// P0IM1 &= 0x3F;
|
|
// P0INTE |= 0xC0;
|
|
}
|
|
|
|
void button_1ms_callback()
|
|
{
|
|
if(gpio_get_level(BUTTON_NO_PIN) == 0)
|
|
{
|
|
button_press_time ++;
|
|
if(button_press_time >= 10000) // 防止溢出
|
|
{
|
|
button_press_time = 10000; // 限制最大值
|
|
}
|
|
}
|
|
else if(gpio_get_level(BUTTON_NC_PIN) == 0)
|
|
{
|
|
button_press_time = 0;
|
|
button_status = BUTTON_NO_PRESS; // 按钮未按下
|
|
}
|
|
if(button_press_time >= BUTTON_LONG_PRESS_TIME)
|
|
{
|
|
button_status = BUTTON_LONG_PRESS; // 设置按钮状态为长按
|
|
}
|
|
else if(button_press_time >= BUTTON_SHORT_PRESS_TIME && button_status != BUTTON_SHORT_PRESS_HANDLED)
|
|
{
|
|
button_status = BUTTON_SHORT_PRESS; // 设置按钮状态为短按
|
|
}
|
|
}
|
|
|
|
button_status_enum button_get_status()
|
|
{
|
|
if(button_status == BUTTON_SHORT_PRESS)
|
|
{
|
|
button_status = BUTTON_SHORT_PRESS_HANDLED; // 短按已处理
|
|
return BUTTON_SHORT_PRESS;
|
|
}
|
|
else
|
|
{
|
|
return button_status;
|
|
}
|
|
}
|
|
|
|
void button_led_set(button_led_enum led)
|
|
{
|
|
gpio_set_level(BUTTON_LED_R, led == BUTTON_LED_R);
|
|
gpio_set_level(BUTTON_LED_G, led == BUTTON_LED_G);
|
|
gpio_set_level(BUTTON_LED_O, led == BUTTON_LED_O);
|
|
} |