2026-03-20 21:16:58 +08:00
|
|
|
|
#include "../main/SystemInclude.h"
|
|
|
|
|
|
|
|
|
|
|
|
// ȫ<>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ʣ<EFBFBD>
|
|
|
|
|
|
Device_StateTypeDef g_device_state = DEVICE_STATE_OFF; // <20><>ʼ״̬<D7B4><CCAC><EFBFBD>ػ<EFBFBD>
|
|
|
|
|
|
uint32_t g_key_press_time = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۼ<EFBFBD>ʱ<EFBFBD>䣨<EFBFBD><E4A3A8>λ<EFBFBD><CEBB>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>
|
|
|
|
|
|
uint8_t g_key_last_state = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>״̬<D7B4><CCAC>0=δ<><CEB4><EFBFBD>£<EFBFBD>1=<3D><><EFBFBD>£<EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
extern bool g_SystemStartupComplete;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>±<EFBFBD>־λ
|
|
|
|
|
|
volatile uint8_t key_press_flag = 0;
|
|
|
|
|
|
|
|
|
|
|
|
// 1 = <20><>ʱ<EFBFBD><CAB1>ʱ<EFBFBD>䵽<EFBFBD><E4B5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ػ<EFBFBD><D8BB><EFBFBD>0 = <20>ػ<DEB9><D8BB><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
volatile uint8_t g_auto_shutdown_flag = 0;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>ų<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>PA0<41><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룩<EFBFBD><EBA3A9>PA1<41><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
void Key_Power_Init(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
GPIO_InitTypeDef GPIO_InitStruct;
|
|
|
|
|
|
|
|
|
|
|
|
// PA0<41><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>루<EFBFBD><EBA3A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⣩
|
|
|
|
|
|
GPIO_InitStruct.Pin = KEY1_PIN;
|
|
|
|
|
|
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
|
|
|
|
|
GPIO_InitStruct.Current = GPIO_CURRENT_2mA;
|
|
|
|
|
|
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
|
|
|
|
|
|
GPIO_InitStruct.SchmittTrigger = ENABLE;
|
|
|
|
|
|
GPIO_InitStruct.Alternate = GPIOx_AF_GPIO; // // AFΪ<46><CEAA>ͨIO
|
|
|
|
|
|
LHL_GPIO_Init(KEY1_PORT, &GPIO_InitStruct);
|
|
|
|
|
|
|
|
|
|
|
|
// PA1<41><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>ƣ<EFBFBD>
|
|
|
|
|
|
GPIO_InitStruct.Pin = POWER_CTRL_PIN;
|
|
|
|
|
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
|
|
|
|
|
GPIO_InitStruct.Current = GPIO_CURRENT_2mA;
|
|
|
|
|
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
|
|
|
|
|
GPIO_InitStruct.SchmittTrigger = ENABLE;
|
|
|
|
|
|
GPIO_InitStruct.Alternate = GPIOx_AF_GPIO; // // AFΪ<46><CEAA>ͨIO
|
|
|
|
|
|
LHL_GPIO_Init(POWER_CTRL_PORT, &GPIO_InitStruct);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ʼ״̬<D7B4><CCAC><EFBFBD>ػ<EFBFBD><D8BB><EFBFBD>PA1<41><31><EFBFBD>ͣ<EFBFBD><CDA3>ر<EFBFBD><D8B1>ⲿ<EFBFBD><E2B2BF>Դ<EFBFBD><D4B4>
|
|
|
|
|
|
LHL_GPIO_WritePin(POWER_CTRL_PORT, POWER_CTRL_PIN, GPIO_PIN_RESET);
|
|
|
|
|
|
g_device_state = DEVICE_STATE_OFF;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>λ<EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
GPIO_InitStruct.Pin = UnitKEY_PIN;
|
|
|
|
|
|
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
|
|
|
|
|
GPIO_InitStruct.Current = GPIO_CURRENT_2mA;
|
|
|
|
|
|
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
|
|
|
|
|
GPIO_InitStruct.SchmittTrigger = ENABLE;
|
|
|
|
|
|
GPIO_InitStruct.Alternate = GPIOx_AF_GPIO; // // AFΪ<46><CEAA>ͨIO
|
|
|
|
|
|
LHL_GPIO_Init(UnitKEY_PORT, &GPIO_InitStruct);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
static void Device_Start(void) {
|
|
|
|
|
|
LHL_GPIO_WritePin(POWER_CTRL_PORT, POWER_CTRL_PIN,GPIO_PIN_SET); // PA1<41><31><EFBFBD>ߡ<EFBFBD><DFA1>ⲿ<EFBFBD><E2B2BF>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>
|
|
|
|
|
|
delay_ms(100); // <20>ȴ<EFBFBD><C8B4><EFBFBD>Դ<EFBFBD>ȶ<EFBFBD>
|
|
|
|
|
|
g_device_state = DEVICE_STATE_ON;
|
|
|
|
|
|
g_key_press_time = 0; // <20><><EFBFBD>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD>ʱ
|
|
|
|
|
|
|
|
|
|
|
|
g_auto_shutdown_flag = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20>豸<EFBFBD>ػ<EFBFBD><D8BB><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
static void Device_Shutdown(void) {
|
2026-03-20 21:19:04 +08:00
|
|
|
|
CLR_LED_PIN();
|
2026-03-20 21:16:58 +08:00
|
|
|
|
LHL_GPIO_WritePin(POWER_CTRL_PORT, POWER_CTRL_PIN,GPIO_PIN_RESET); // PA1<41><31><EFBFBD>͡<EFBFBD><CDA1>ⲿ<EFBFBD><E2B2BF>Դ<EFBFBD>ر<EFBFBD>
|
|
|
|
|
|
delay_ms(100); // <20>ȴ<EFBFBD><C8B4><EFBFBD>Դ<EFBFBD><D4B4>ȫ<EFBFBD>ر<EFBFBD>
|
|
|
|
|
|
g_device_state = DEVICE_STATE_OFF;
|
|
|
|
|
|
g_key_press_time = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>־λ<D6BE><CEBB><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
static bool g_key_long_pressed_flag = false;
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
static uint16_t g_key_debounce_count = 0;
|
|
|
|
|
|
|
|
|
|
|
|
void Key_Scan_Task(void) {
|
|
|
|
|
|
// 1. <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>״̬
|
|
|
|
|
|
uint8_t key_current_state = LHL_GPIO_ReadPin(KEY1_PORT, KEY1_PIN);
|
|
|
|
|
|
|
|
|
|
|
|
// 2. <20><EFBFBD><F2B5A5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>״̬<D7B4><CCAC><EFBFBD>ϴ<EFBFBD>һ<EFBFBD><D2BB>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (key_current_state == g_key_last_state) {
|
|
|
|
|
|
if (g_key_debounce_count < 65535) g_key_debounce_count++;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
g_key_debounce_count = 0;
|
|
|
|
|
|
g_key_last_state = key_current_state; // <20><><EFBFBD><EFBFBD>״̬<D7B4>Ա<EFBFBD><D4B1><EFBFBD>һ<EFBFBD>αȽ<CEB1>
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 3. ֻ<><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ﵽ<EFBFBD><EFB5BD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>5<EFBFBD>Σ<EFBFBD><CEA3><EFBFBD>50ms<6D><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ״̬<D7B4><CCAC>Ч
|
|
|
|
|
|
if (g_key_debounce_count < 2) {
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><E8B1B8><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD>״̬<D7B4><CCAC><EFBFBD>Ҽ<EFBFBD><D2BC><EFBFBD>Զ<EFBFBD><D4B6>ػ<EFBFBD><D8BB><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD> 1
|
|
|
|
|
|
if (g_device_state == DEVICE_STATE_ON) {
|
|
|
|
|
|
if (g_auto_shutdown_flag == 1) {
|
|
|
|
|
|
Device_Shutdown(); // ִ<>йػ<D0B9>
|
|
|
|
|
|
g_auto_shutdown_flag = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־λ<D6BE><CEBB><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9>ѭ<EFBFBD><D1AD><EFBFBD>ػ<EFBFBD>
|
|
|
|
|
|
// ע<>⣺<EFBFBD><E2A3BA><EFBFBD>ﲻ<EFBFBD><EFB2BB>Ҫ break<61><6B><EFBFBD><EFBFBD>Ϊ<EFBFBD>ػ<EFBFBD><D8BB><EFBFBD>״̬<D7B4><CCAC>Ϊ OFF<46><46><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> switch <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4> ON <20>ķ<EFBFBD>֧
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
// 4. ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
switch (g_device_state) {
|
|
|
|
|
|
case DEVICE_STATE_OFF:
|
|
|
|
|
|
if (key_current_state == 1) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (!g_key_long_pressed_flag) {
|
|
|
|
|
|
g_key_press_time++;
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD> (40 * 10ms = 400ms)
|
|
|
|
|
|
if (g_key_press_time >= (KEY_PRESS_TIME_LONG / KEY_SCAN_INTERVAL)) {
|
|
|
|
|
|
Device_Start(); // ִ<>п<EFBFBD><D0BF><EFBFBD>
|
|
|
|
|
|
g_key_long_pressed_flag = true; // <20><><EFBFBD>dz<EFBFBD><C7B3><EFBFBD><EFBFBD>Ѵ<EFBFBD><D1B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD>ظ<EFBFBD>ִ<EFBFBD><D6B4>
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ɿ<EFBFBD>
|
|
|
|
|
|
g_key_press_time = 0;
|
|
|
|
|
|
g_key_long_pressed_flag = false; // <20><><EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD>־
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case DEVICE_STATE_ON:
|
|
|
|
|
|
if (key_current_state == 1) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (!g_key_long_pressed_flag) {
|
|
|
|
|
|
g_key_press_time++;
|
|
|
|
|
|
if (g_key_press_time >= (KEY_PRESS_TIME_LONG / KEY_SCAN_INTERVAL)) {
|
|
|
|
|
|
Device_Shutdown(); // ִ<>йػ<D0B9>
|
|
|
|
|
|
g_key_long_pressed_flag = true; // <20><><EFBFBD>dz<EFBFBD><C7B3><EFBFBD><EFBFBD>Ѵ<EFBFBD><D1B4><EFBFBD>
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ɿ<EFBFBD>
|
|
|
|
|
|
g_key_press_time = 0;
|
|
|
|
|
|
g_key_long_pressed_flag = false; // <20><><EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD>־
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD>豸״̬
|
|
|
|
|
|
Device_StateTypeDef Get_Device_State(void) {
|
|
|
|
|
|
return g_device_state;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Unit_key(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
static uint8_t key_state = 0; // 0: <20>ͷ<EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, 1: <20><>ȷ<EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD>
|
|
|
|
|
|
static uint16_t key_count = 0;
|
|
|
|
|
|
uint8_t key_level = LHL_GPIO_ReadPin(UnitKEY_PORT,UnitKEY_PIN);
|
|
|
|
|
|
switch (key_state)
|
|
|
|
|
|
{
|
|
|
|
|
|
case 0:
|
|
|
|
|
|
if (key_level == 0) {
|
|
|
|
|
|
key_count++;
|
|
|
|
|
|
if (key_count >= 3) {
|
|
|
|
|
|
key_state = 1;
|
|
|
|
|
|
key_press_flag = 1;// <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD>а<EFBFBD><D0B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
key_count=0;
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
key_count = 0; // ֻҪû<D2AA><C3BB><EFBFBD>£<EFBFBD><C2A3><EFBFBD>һֱ<D2BB><D6B1><EFBFBD><EFBFBD>
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case 1:
|
|
|
|
|
|
if (key_level == 1) {// <20><><EFBFBD><EFBFBD>ɿ<EFBFBD>
|
|
|
|
|
|
key_state = 0;
|
|
|
|
|
|
key_count = 0;// <20><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><D7BC><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|