Files
CHJ/user/Device/key_power.c

178 lines
5.9 KiB
C
Raw Normal View History

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) {
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;
}
}
2026-03-20 21:19:53 +08:00