📄 key.c
字号:
#include "SPCE061A.H"
#include "Key.h"
/*********************************************************************
*按键记录区结构
**********************************************************************/
typedef struct _Key{
unsigned char ucKeyValue; /*按键值*/
unsigned char ucKeyState; /*按键状态*/
}KEY_s;
/**********************************************************
*按键记录块,用于记录按键值,按键状态
***********************************************************/
static KEY_s stKeyMarkBlock;
/**********************************************************
*按键的位置映像值,对应按键阵列的实际代表值
**********************************************************/
static unsigned char ucKeyMap[KEY_ARRAY_W][KEY_ARRAY_H]={
{0x00,0x01,0x02,0x03},
{0x04,0x05,0x06,0x07},
{0x08,0x09,0x0a,0x0b}
};
/**********************************************************
*检测按键值时输入的值,对相应的位输入1,其它位不变
***********************************************************/
static unsigned int unTestInputW[KEY_ARRAY_W]={
0x01,0x02,0x04,0x08
};
/*********************************************************
*按键检测输出位,根据实际电路的IO规划,设置,置1的位是输出位
**********************************************************/
static unsigned int unTestOutputMask[KEY_ARRAY_H]={
0x10,0x20,0x40
};
/***********************************************************
*按键的IO端口初始化,按键记录块初始化
************************************************************/
static void vKeyInit(void){
unsigned int temp;
temp = KEY_IO_DIR & ~KEY_IO_REG_MASK;
temp |= KEY_IO_DIR_INITIAL_VALUE;
KEY_IO_DIR = temp;
temp = KEY_IO_ATTRIB & ~KEY_IO_REG_MASK;
temp |= KEY_IO_ATTRIB_INITIAL_VALUE;
KEY_IO_ATTRIB = temp;
temp = KEY_IO_DATA & ~KEY_IO_REG_MASK;
temp |= KEY_IO_DATA_INITIAL_VALUE;
KEY_IO_DATA = temp;
stKeyMarkBlock.ucKeyValue = KEY_VALUE_INVALIDATE;
stKeyMarkBlock.ucKeyState = KEY_STATE_INVALIDATE;
}
/***********************************************************
*按键扫描
*有按键值时,在按键记录块中,对按键值置相应的按键映像值,对按
*键状态标志置KEY_STATE_VALIDATE
*无按键时,不对按键记录块做任何事情
************************************************************/
void vKeyScan(void){
unsigned char i,j;
unsigned int temp;
vKeyInit();
for(i = 0; i < KEY_ARRAY_W; i++){
KEY_IO_DATA |= unTestInputW[KEY_ARRAY_W];
for(j = 0; j < KEY_ARRAY_H; j++){
temp = KEY_IO_DATA;
if(temp&unTestOutputMask[j]){/*是否有按键,相应输出位为1,有按键*/
stKeyMarkBlock.ucKeyValue = ucKeyMap[i][j];
stKeyMarkBlock.ucKeyState = KEY_STATE_VALIDATE;
return;
}
}
}
}
/***************************************************************
*获取按键值 ,合法时返回按键值,非法时返回KEY_VALUE_INVALIDATE
****************************************************************/
unsigned char ucGetKey(void){
if( KEY_STATE_VALIDATE == stKeyMarkBlock.ucKeyState){
return stKeyMarkBlock.ucKeyValue;
}
return KEY_VALUE_INVALIDATE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -