typedef struct
{
uint8_t pin; // 硬件引脚
uint32_t tick; // 消抖计时
uint8_t lastSta; // 上一次电平
uint8_t pressFlag; // 按下边沿标志:1=本次检测到按下
} Key_t;
typedef enum
{
LED_ALL_OFF,
LED_SYNC_SLOW,
LED_SYNC_FAST,
LED_ALL_ON
} LedMode_t;
#define DEBOUNCE_MS 20
#define LED1_PIN PC13
#define LED2_PIN PC14
// 实例化4个按键对象
Key_t key1 = {PB11, 0, HIGH, 0};
Key_t key2 = {PB10, 0, HIGH, 0};
Key_t key3 = {PB1, 0, HIGH, 0};
Key_t key4 = {PB0, 0, HIGH, 0};
LedMode_t currentLedMode = LED_ALL_OFF;
// 底层:读取按键电平,传结构体指针
uint8_t Key_Read(Key_t *pKey)
{
return digitalRead(pKey->pin);
}
// 中层:按键消抖扫描,指针传参
void Key_Scan(Key_t *pKey, uint32_t sysTick)
{
uint8_t nowLevel = Key_Read(pKey);
pKey->pressFlag = 0;
if (nowLevel != pKey->lastSta)
{
pKey->tick = sysTick;
}
else
{
if ((sysTick - pKey->tick) > DEBOUNCE_MS)
{
// 下降沿检测:内部上拉,按下变低
if ((pKey->lastSta == HIGH) && (nowLevel == LOW))
{
pKey->pressFlag = 1;
}
}
}
pKey->lastSta = nowLevel;
}
// 上层:按键事件处理,切换模式,指针传参
void Key_HandleEvent(Key_t *pKey)
{
if (pKey->pressFlag == 1)
{
if (pKey == &key1)
{
currentLedMode = LED_SYNC_SLOW;
}
else if (pKey == &key2)
{
currentLedMode = LED_SYNC_FAST;
}
else if (pKey == &key3)
{
currentLedMode = LED_ALL_ON;
}
else if (pKey == &key4)
{
currentLedMode = LED_ALL_OFF;
}
}
}
// 双LED运行逻辑
void Led_Run(LedMode_t mode, uint32_t sysTick)
{
static uint32_t lastTime = 0;
uint32_t delta = sysTick - lastTime;
switch (mode)
{
case LED_ALL_OFF:
digitalWrite(LED1_PIN, HIGH);
digitalWrite(LED2_PIN, HIGH);
break;
case LED_SYNC_SLOW:
if (delta >= 500)
{
digitalWrite(LED1_PIN, !digitalRead(LED1_PIN));
digitalWrite(LED2_PIN, !digitalRead(LED2_PIN));
lastTime = sysTick;
}
break;
case LED_SYNC_FAST:
if (delta >= 100)
{
digitalWrite(LED1_PIN, !digitalRead(LED1_PIN));
digitalWrite(LED2_PIN, !digitalRead(LED2_PIN));
lastTime = sysTick;
}
break;
case LED_ALL_ON:
digitalWrite(LED1_PIN, LOW);
digitalWrite(LED2_PIN, LOW);
break;
default:
break;
}
}
void setup()
{
pinMode(LED1_PIN, OUTPUT);
pinMode(LED2_PIN, OUTPUT);
// 按键内部上拉
pinMode(key1.pin, INPUT_PULLUP);
pinMode(key2.pin, INPUT_PULLUP);
pinMode(key3.pin, INPUT_PULLUP);
pinMode(key4.pin, INPUT_PULLUP);
digitalWrite(LED1_PIN, HIGH);
digitalWrite(LED2_PIN, HIGH);
}
void loop()
{
uint32_t t = millis();
Key_Scan(&key1, t);
Key_HandleEvent(&key1);
Key_Scan(&key2, t);
Key_HandleEvent(&key2);
Key_Scan(&key3, t);
Key_HandleEvent(&key3);
Key_Scan(&key4, t);
Key_HandleEvent(&key4);
Led_Run(currentLedMode, t);
}
Loading
stm32-bluepill
stm32-bluepill