[STM32火锅(充电器)] 2009-05-03 22:03 我来说两句  

火锅下位机例程:KEY(项目编号:SF006-F3-010)

火锅的键盘,分为优先式,和扩展式,两种。
其中,UP,DOWN,LEFT,RIGHT,是属於优先式,也就是说,每一次在位扫描之前,都先判断对应的优先键(其实,这也是硬件的设计中所定义的)。

键盘原理图

键盘原理图

火锅的键盘,也是采用了消息机制的思路,为了以后整体改为时间调度的方式打下基础。

/*******************************************************************************
** 功能描述: 定义CKEY类                                                       **
*******************************************************************************/
class CKEY
{
public:
  void Init();
  void PressMessage();
  u8 GetData();

protected:
  u8 KeyIsDown;
  u8 KeyData;
  u8 NewData;
  u8 Scan_Index;
};
/*******************************************************************************
** 函数名称: CKEY::Init()                                                     **
** 功能描述: 初始化键盘驱动程序,并初始化IO口                                 **
** 输入参数: 无                                                               **
** 输出参数: 无                                                               **
*******************************************************************************/
void CKEY::Init()
{
    KeyIsDown = 0;
    NewData = 0;
    KeyData = 0;
    Scan_Index = 0;
    KEY_GPIO.Config(KEY1|KEY2|KEY3|KEY4,GPIO_MODE_IN_FLOATING,GPIO_SPEED_NULL);
}

/*******************************************************************************
** 函数名称: CKEY::PressMessage()                                             **
** 功能描述: 处理键盘调度信息                                                 **
** 输入参数: 无                                                               **
** 输出参数: 无                                                               **
*******************************************************************************/
void CKEY::PressMessage()
{
  volatile u16 Key_Pin1, Key_Pin2;
  u8  EventFlag;

  Key_Pin1 = Key_Bit_Scan[Scan_Index].Key_Pin1;
  Key_Pin2 = Key_Bit_Scan[Scan_Index].Key_Pin2;

  EventFlag = 0;

  if (KeyIsDown == 0)
  {
    if (KEY_GPIO.GetDataBit(Key_Pin1) == BTN_PRESS)
    {
      NewData = Key_Bit_Scan[Scan_Index].Key_Value1;
      KeyIsDown = 1;
    }
    else
    {
      KEY_GPIO.Config(Key_Pin2, GPIO_MODE_OUT_PP,GPIO_SPEED_10MHz);
      KEY_GPIO.SetDataBit(Key_Pin2, 0);

      if (KEY_GPIO.GetDataBit(Key_Pin1) == BTN_PRESS)
      {
        KEY_GPIO.SetDataBit(Key_Pin2, 1);

        if (KEY_GPIO.GetDataBit(Key_Pin1) == BTN_RELEASE)
        {
          NewData = Key_Bit_Scan[Scan_Index].Key_Value2;
          KeyIsDown = 1;
        }

        KEY_GPIO.SetDataBit(Key_Pin2, 0);
      }
      else
      {
        EventFlag = 1;
      }
    }
  }
  else
  {
    if (KEY_GPIO.GetDataBit(Key_Pin1) == BTN_RELEASE)
    {
      KeyData = NewData;
      KeyIsDown = 0;
      EventFlag = 1;
    }
  }

  if (EventFlag)
  {
    KEY_GPIO.SetDataBit(Key_Pin2, 1);
    KEY_GPIO.Config(Key_Pin2, GPIO_MODE_IN_FLOATING,GPIO_SPEED_NULL);
    Scan_Index++;
    if (Scan_Index >= MAX_KEY_SCAN) Scan_Index=0;
  }
}

/*******************************************************************************
** 函数名称: CKEY::GetData()                                                  **
** 功能描述: 读取键盘按键码                                                   **
** 输入参数: 无                                                               **
** 输出参数: 无                                                               **
** 返回参数: BYTE  : 键码,如果返回0,而无按键                                **
*******************************************************************************/
u8 CKEY::GetData()
{
  u8 Tmp = KeyData;
  KeyData = 0;
  return Tmp;
}