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

📄 key.c

📁 凌阳61单片机做的酒精控制器源码 凌阳61单片机做的酒精控制器源码 凌阳61单片机做的酒精控制器源码 凌阳61单片机做的酒精控制器源码
💻 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 + -