#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); }