#define KEY_GLOBAL 1
#include "Key.h"
static uchar keyValueBuff; //读取键值的缓冲区
static uchar keyValueOld; //前一次的键值
static uchar keyValueTemp; //键值中间交换变量
static uint stillTimes; //键按下保持次数
static uint stillTimesMax;
static uchar get_data_1_count(uchar number);
static void read_all_key(uchar *buff);
/*******************************************
*函数名称:key_init(void)
*函数功能:初始化按键扫描
*函数入口:无
*函数出口:无
*******************************************/
void key_init(void)
{
keyValueBuff = 0x00;
keyValueOld = 0x00;
keyValueTemp = 0x00;
stillTimes = 0;
stillTimesMax = FIRST_TIMES;
}
/******************************************************
*函数名称:read_all_key(uchar *buff)
*函数功能:扫描按键下的键,将按下的键的位置存入变量buff
*函数入口:buff
*函数出口:无
*******************************************************/
void read_all_key(uchar *buff)
{
if(IN_PRESS_ONE==KEY_FORCE_VALUE) //检测按下的键
READ_KEY(1,KEY_ONE,*buff);
else
READ_KEY(0,KEY_ONE,*buff);
if(IN_PRESS_TWO==KEY_FORCE_VALUE)
READ_KEY(1,KEY_TWO,*buff);
else
READ_KEY(0,KEY_TWO,*buff);
if(IN_PRESS_THREE==KEY_FORCE_VALUE)
READ_KEY(1,KEY_THREE,*buff);
else
READ_KEY(0,KEY_THREE,*buff);
if(IN_PRESS_FOUR==KEY_FORCE_VALUE)
READ_KEY(1,KEY_FOUR,*buff);
else
READ_KEY(0,KEY_FOUR,*buff);
if(IN_PRESS_FIVE==KEY_FORCE_VALUE)
READ_KEY(1,KEY_FIVE,*buff);
else
READ_KEY(0,KEY_FIVE,*buff);
if(IN_PRESS_SIX==KEY_FORCE_VALUE)
READ_KEY(1,KEY_SIX,*buff);
else
READ_KEY(0,KEY_SIX,*buff);
if(IN_PRESS_SEVEN==KEY_FORCE_VALUE)
READ_KEY(1,KEY_SEVEN,*buff);
else
READ_KEY(0,KEY_SEVEN,*buff);
}
/******************************************************
*函数名称:get_key_value(void)
*函数功能:读取键值
*函数入口:无
*函数出口:返回按下的有效键值
*******************************************************/
uchar get_key_value(void)
{
keyValueBuff = 0x00;
read_all_key(&keyValueBuff);
keyValueTemp = keyValueBuff;
delay_us(KEY_DELAY_TIME);
read_all_key(&keyValueBuff);
/* 两次读到的键盘值相同 则为有效键盘值 */
if( keyValueTemp == keyValueBuff )
{
if(keyValueTemp == 0)
{
keyValueOld = 0;
stillTimes = 0;
stillTimesMax = FIRST_TIMES;
return 0;
}
else if(keyValueOld != keyValueTemp)
{
stillTimes = 0;
keyValueOld = keyValueTemp;
#if CAN_MORE_PRESS
return keyValueTemp;
#else
if( 1 == get_data_1_count(keyValueTemp) )
{
return keyValueTemp;
}
else
{
return 0;
}
#endif
}
else if(keyValueOld == keyValueTemp)
{
#if CAN_MORE_PRESS == 0
if( 1 != get_data_1_count(keyValueTemp) )
{
stillTimes = 0;
return 0;
}
#endif
#if CAN_REPEAT
stillTimes ++;
if(stillTimes > stillTimesMax)
{
stillTimes = 0;
#if REPEAT_MODE
if(FIRST_TIMES == stillTimesMax)
{
stillTimesMax = OTHER_TIMES;
}
#endif
return keyValueTemp;
}
#else
stillTimes = 0;
return 0;
#endif
}
}
else
{
stillTimes = 0;
return 0;
}
return 0;
}
/**********************************************************
*函数名称:get_data_1_count(uchar number)
*函数功能:计算uchar类型变量中1的数量,用于检测是否多键按下
*函数入口:number,需要检测1数量的变量
*函数出口:返回变量bumber中1的数量
***********************************************************/
uchar get_data_1_count(uchar number)
{
register uchar i,j = 0;
for(i = 0; i < 8; i ++)
{
if( (number&_BV(i)) )
{
j ++;
}
}
return j;
}
/**********************************************************
*函数名称:delay_us(uint us)
*函数功能:毫秒级延时
*函数入口:延时计数变量us
*函数出口:无
***********************************************************/
void delay_us(uint us)
{
uchar delayi;
while(--us)
{
for(delayi=0;delayi<10;delayi++);
}
}
大富大贵7
- 粉丝: 390
- 资源: 8868
最新资源
- 基于Vue实现的移动端手机商城项目 电商购物网站 成品源码 共20+页.zip
- 音效文件(Goc Chess)
- CLShanYanSDKDataList.sqlite
- mmexport1732965153341.mp4
- 音效文件(Goc Chess)
- SPot-the-Difference Self-Supervised Pre-training for Anomaly Detection and Segmentation
- 计算机视觉大作业-卫星云层图像的理解与识别python源码+实验报告(高分项目)
- 8266 MSYS2 压缩包文件
- 缺陷检测Anomaly Detection DDAD模型
- 计算机视觉课程设计-基于Chinese-CLIP的图文检索系统Python实现源码+文档说明
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈