⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c_button.c

📁 乐高机器人的源码,开发平台是IAR_for_AVR.
💻 C
字号:
//
// Date init       14.12.2004
//
// Revision date   $Date:: 16-05-06 9:58                                     $
//
// Filename        $Workfile:: c_button.c                                    $
//
// Version         $Revision:: 16                                            $
//
// Archive         $Archive:: /LMS2006/Sys01/Main/Firmware/Source/c_button.c $
//
// Platform        C
//

#include  "stdconst.h"
#include  "modules.h"
#include  "c_button.h"
#include  "c_button.iom"
#include  "c_button.h"
#include  "d_button.h"

#define   BTN_PRESCALER      2

enum
{
  LONG_TIME     = (2000/BTN_PRESCALER)
};

static    IOMAPBUTTON   IOMapButton;
static    VARSBUTTON    VarsButton;
static    UBYTE         BtnCnt;

const     HEADER        cButton =
{
  0x00040001L,
  "Button",
  cButtonInit,
  cButtonCtrl,
  cButtonExit,
  (void *)&IOMapButton,
  (void *)&VarsButton,
  (UWORD)sizeof(IOMapButton),
  (UWORD)sizeof(VarsButton),
  0x0000                      //Code size - not used so far
};


void      cButtonInit(void* pHeader)
{
  UBYTE   Tmp;

  for (Tmp = 0; Tmp < NO_OF_BTNS; Tmp++)
  {
    IOMapButton.State[Tmp]                = 0;
    IOMapButton.BtnCnt[Tmp].PressedCnt    = 0;
    IOMapButton.BtnCnt[Tmp].LongPressCnt  = 0;
    IOMapButton.BtnCnt[Tmp].ShortRelCnt   = 0;
    IOMapButton.BtnCnt[Tmp].LongRelCnt    = 0;
    VarsButton.Cnt[Tmp]                   = 0;
  }
  VarsButton.OldState = 0;
  BtnCnt              = 0;
  dButtonInit(BTN_PRESCALER);
}

void      cButtonCtrl(void)
{
  UBYTE ButtonState, Tmp, ButtonNo;

  for (Tmp = 0; Tmp < NO_OF_BTNS; Tmp++)
  {
    IOMapButton.State[Tmp] &= ~PRESSED_EV;
  }
  if (++BtnCnt >= BTN_PRESCALER)
  {
    BtnCnt = 0;
    dButtonRead(&ButtonState);

    ButtonNo = 0x01;
    for (Tmp = 0; Tmp < NO_OF_BTNS; Tmp++)
    {
      if (ButtonState & ButtonNo)
      {
        if (LONG_TIME >= (VarsButton.Cnt[Tmp]))
        {
          (VarsButton.Cnt[Tmp])++;
        }
        IOMapButton.State[Tmp] = PRESSED_STATE;
        if (!((VarsButton.OldState) & ButtonNo))
        {

          /* Button just pressed */
          (IOMapButton.State[Tmp]) |= PRESSED_EV;
          (IOMapButton.BtnCnt[Tmp].PressedCnt)++;
          VarsButton.Cnt[Tmp]     = 0;
        }
        else
        {
          if (LONG_TIME == VarsButton.Cnt[Tmp])
          {
            IOMapButton.State[Tmp] |= LONG_PRESSED_EV;
            (IOMapButton.BtnCnt[Tmp].LongPressCnt)++;
          }
        }
      }
      else
      {
        IOMapButton.State[Tmp] = 0x00;
        if ((VarsButton.OldState) & ButtonNo)
        {
          if (VarsButton.Cnt[Tmp] > LONG_TIME)
          {
            IOMapButton.State[Tmp] = LONG_RELEASED_EV;
            (IOMapButton.BtnCnt[Tmp].LongRelCnt)++;

          }
          else
          {
            IOMapButton.State[Tmp] = SHORT_RELEASED_EV;
            (IOMapButton.BtnCnt[Tmp].ShortRelCnt)++;
          }
        }
      }
      ButtonNo <<= 1;
      IOMapButton.BtnCnt[Tmp].RelCnt = ((IOMapButton.BtnCnt[Tmp].ShortRelCnt) + (IOMapButton.BtnCnt[Tmp].LongRelCnt));
    }
    VarsButton.OldState = ButtonState;    
  }
}

void      cButtonExit(void)
{
  dButtonExit();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -