禾赛嵌入式工程师面试

面试的是机器人嵌入式岗位

1如果一个按键A,按键B,用ST32控制,你会如何设计从而识别哪个短按,长按,同时按,你会如何设计

为了识别按键的短按、长按和同时按的情况,可以通过STM32的GPIO(通用输入输出)和定时器来实现。基本思路是:

  1. 短按: 按键按下并立即释放,按下时间很短。
  2. 长按: 按键按下并持续一段时间不释放。
  3. 同时按: 按键A和B同时按下。

方案设计:

  1. 硬件连接:

    • 将按键A和按键B连接到STM32的GPIO输入引脚,最好使用外部中断或者轮询来检测按键状态变化。
    • 可以为每个按键设置一个上拉或下拉电阻,确保输入引脚在未按下时有明确的电平。
  2. 按键按下时间检测:

    • 使用定时器或延时函数来计算每个按键按下的时间。
    • 需要一个计时器来记录每个按键的按下时间。一旦按键被按下,启动计时器,按键释放时停止计时器,判断按下的时间长短。
  3. 状态判断:

    • 通过状态机来区分不同的按键行为(短按、长按、同时按下等)。
  4. 按键扫描逻辑:

    • 每个按键按下时开始计时,设定一个阈值时间(比如500毫秒)来区分短按和长按。
    • 如果按键按下时间小于阈值时间,则认为是短按;如果大于阈值时间,则认为是长按。
    • 检查是否有两个按键同时按下,可以通过读取两个按键的状态来判断。

具体实现步骤:

1. 按键检测:

使用STM32的外部中断或轮询来检测按键状态变化。

// 假设使用外部中断来检测按键变化
void EXTIx_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_LineX) != RESET)
    {
        if (GPIO_ReadInputDataBit(GPIOX, GPIO_PinA) == RESET)  // 按键A被按下
        {
            // 记录按下时间
            StartTimerForKeyA();
        }
        else
        {
            // 记录按键A释放时间
            StopTimerForKeyA();
        }

        if (GPIO_ReadInputDataBit(GPIOX, GPIO_PinB) == RESET)  // 按键B被按下
        {
            // 记录按下时间
            StartTimerForKeyB();
        }
        else
        {
            // 记录按键B释放时间
            StopTimerForKeyB();
        }

        EXTI_ClearITPendingBit(EXTI_LineX);
    }
}
2. 定时器逻辑:

假设定时器的中断处理函数记录按键按下的持续时间。

volatile uint32_t keyA_press_time = 0;
volatile uint32_t keyB_press_time = 0;

void TimerInterruptHandler(void)
{
    if (keyA_isPressed) {
        keyA_press_time++;
    }

    if (keyB_isPressed) {
        keyB_press_time++;
    }
}
3. 判定短按、长按:

根据按下的时间来判断按键的类型:

void HandleKeyPress(void)
{
    // 按键A判断
    if (keyA_press_time > LONG_PRESS_THRESHOLD) {
        // 长按A
        HandleLongPressA();
    } else if (keyA_press_time > 0) {
        // 短按A
        HandleShortPressA();
    }

    // 按键B判断
    if (keyB_press_time > LONG_PRESS_THRESHOLD) {
        // 长按B
        HandleLongPressB();
    } else if (keyB_press_time > 0) {
        // 短按B
        HandleShortPressB();
    }

    // 同时按下判断
    if (keyA_isPressed &&

你可能感兴趣的:(禾赛嵌入式工程师面试)