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

发布: 2009-4-13 14:18 | 作者: aleyn | 来源: StmFans思蜕盟 OPELC 自由电子联盟

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

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


Key_1.jpg



/*******************************************************************************
** 功能描述: 定义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;
}
binglin (2009-4-13 16:48:43)
村长牛,用C++来造火锅
dragon045 (2009-4-13 19:42:34)
火锅开始点火
catwill (2009-4-13 19:57:41)
期待村长大作!
实际上,我也早想步入C++行列了,不过
弯路走了很对,还徘徊在C上,
不,
是还徘徊在C51上。
bjtuwei (2009-4-14 00:00:47)
呵呵,学习了,村长火锅边开讲C++
jcx0324 (2009-4-23 15:54:49)
看来要很努力了