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

📄 keypad.c

📁 《OSEK/VDX汽车电子嵌入式软件编程技术》中光盘的资料
💻 C
字号:
/************************************************
*
*	$Copyright    2001 Joseph J. Lemieux  ALL RIGHTS RESERVED. $
*
*	$Filename: C:\OSEKBook\src\CH07\src\keypad.c $
*
*	Description: Keypad Sample and Control Routines	
*
************************************************/
#ifndef KEYPADC
#define KEYPADC

/************************************************
*
*	Include files
*
************************************************/

#include "typedefs.h"
#include "os.h"
#include "keypad.h"
#include "hw.h"

DeclareTask(ProcessKeyPress);

/************************************************
*
*	Local macros
*
************************************************/

/************************************************
*
*	Local type definitions
*
************************************************/

/************************************************
*
*	Local Function Prototypes
*
************************************************/

/************************************************
*
*	Local Variables
*
************************************************/
/*
* Define buffer of keys pressed
*/
char keyBuffer[KEY_BUFFER_SIZE];
char * keyBufferStart=keyBuffer;
char * keyBufferEnd=keyBuffer;
/*
* Variables used to debounce keys
*/
UINT8 keyCount=0;
char lastKey = 0;

/************************************************
*
*	Global Variables
*
************************************************/

/************************************************
*
*	Local Constants
*
************************************************/

/************************************************
*
*	Functions
*
************************************************/
/************************************************
*
*   Task:         IOSampleKeypad
*
*   Description:  Samples the keypad and debounces
*                 any keypresses.
*
************************************************/
TASK(IOSampleKeypad)
{
static BOOLEAN keyState = FALSE;
char tempKey;
TaskStateType taskState;

   tempKey = HWGetValue(&KEYPAD);
   if(tempKey == lastKey){
      if(keyCount++ == KEY_DEBOUNCE_TIME){
         --keyCount;
         if(tempKey != 0){
            if(keyState ==  FALSE){
               *keyBufferEnd = tempKey;
               if((++keyBufferEnd) == keyBuffer + KEY_BUFFER_SIZE){
                  keyBufferEnd = keyBuffer;
               }
               keyState = TRUE;
            }
         }
         else{
            keyState = FALSE;
         }
      }
   }
   else{
      keyCount = 0;
      lastKey = tempKey;
   }
   if(keyBufferStart != keyBufferEnd){
         SetEvent(ProcessKeyPress,KEYPRESS);
   }
   TerminateTask();
}

/************************************************
*
*   Function:     GetKeyValue
*
*   Inputs:       none
*
*   Outputs:      none
*
*   Returns:      Character pressed.
*
*   Description:  This routine pulls the oldest character from
*                 the buffer of key presses from the keypad.
*
************************************************/
char GetKeyValue(void)
{
char keyValue = 0;
   if(keyBufferStart != keyBufferEnd){
      keyValue = *keyBufferStart;
      if((++keyBufferStart) == keyBuffer + KEY_BUFFER_SIZE){
         keyBufferStart = keyBuffer;
      }
   }
   return keyValue;
}

#endif /* KEYPADC */

⌨️ 快捷键说明

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