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

📄 key.c

📁 单片机上的贪吃蛇。12864显示。含详细资料
💻 C
字号:
#include "REG52.H"
#include "Key.h"
#define OS_LONG_KEY_EN 1//如果应用中需要处理长按键动作,则定义为1,否则定义为0(如果应用中不需要处理长按动作,则建议定义为0,以节省代码空间)

/***********************************************
功能说明:按键驱动扫描
入口参数:无
出口参数:扫描一次键盘以获得按键句柄
注:交OSReadKey()函数调用
需要根据实际硬件的键盘接口修改
***********************************************/
unsigned char OSScanKey(void)
{
	unsigned char Temp;
	unsigned char i;
	P2=0xff;
	Temp=P1;
	for(i=0;i<8;i++)
	{
		if((Temp&(1<<i))==0)
			break;
	}
	if(i<8)
		return i+1;
	else
		return	0;
}

/**********************************************
功能说明:读取按键动作
入口参数:无
出口参数:返回按键动作
注:没有按键动作,则返回0,1号按键动作,返回1-4
2号按键动作,返回5-8,如此类推
返回1、5、..:确认短按按下
返回2、6、..:确认长按按下
返回3、7、..:确认短按松开
返回4、8、..:确认长按松开
***********************************************/
unsigned char OSReadKey(void)
{
	static unsigned char KeyEventCnt=0;
	static unsigned char KeySampleCnt=0;
	static unsigned char KeyBuffer=0;
#define SHORT_ON_DITHERING_COUNTER 3//定义短按按下去抖时间
#define SHORT_OFF_DITHERING_COUNTER 3//定义短按松开去抖时间,一般与短按按下去抖时间相同

#if OS_LONG_KEY_EN>0
	static unsigned int LongKeySampleCnt=0;
	#define LONG_ON_DITHERING_COUNTER 250//定义长按按下确认需要的时间,如果是每1MS调用一次OSReadKey(),则1000意味着这个时间为1S
	#define LONG_OFF_DITHERING_COUNTER 3//定义长按松开去抖时间,一般和短按去抖时间相同
#endif
	unsigned char KeyTemp;
	KeyTemp=OSScanKey();
	switch(KeyEventCnt)
	{
		case 0:
			if(KeyTemp!=0)
			{
				KeySampleCnt=0;
				KeyBuffer=KeyTemp;
				KeyEventCnt=1;     
			}
			return 0;//no key on,return 0
			break;
		
		#if OS_LONG_KEY_EN>0	
		case 1:
			if(KeyTemp!=KeyBuffer)
			{
				KeyEventCnt=0;
				return 0;//is dithering,return 0
			}
			else
			{
				if(++KeySampleCnt>SHORT_ON_DITHERING_COUNTER)
				{
					KeySampleCnt=0;
					KeyEventCnt=2;
					LongKeySampleCnt=0;
					return ((KeyBuffer-1)<<2)+1;//sure that key on,return (KeyBuffer-1)<<2+1
				}
				else
					return 0;//not sure that key on,return 0                 
			}
			break;
				
		case 2:
			if(++LongKeySampleCnt>LONG_ON_DITHERING_COUNTER)
			{
				KeySampleCnt=0;
				KeyEventCnt=3;
				return ((KeyBuffer-1)<<2)+2; //sure that key long on,return (KeyBuffer-1)<<2+2
			}
			else
			{
				if(KeyTemp!=KeyBuffer)
				{
					if(++KeySampleCnt>SHORT_OFF_DITHERING_COUNTER)
					{
						KeyEventCnt=0;
						return ((KeyBuffer-1)<<2)+3;//after short on to off,(KeyBuffer-1)<<2+3
					}
					else
						return 0;
				}
				else
				{
					KeySampleCnt=0;
					return 0;
				}
			}
			break;
		
		case 3:
			if(KeyTemp!=KeyBuffer)
			{
				if(++KeySampleCnt>LONG_OFF_DITHERING_COUNTER)
				{
					KeyEventCnt=0;
					return ((KeyBuffer-1)<<2)+4;  //after long key on turn to off,(KeyBuffer-1)<<2+4
				}
				else
					return 0;
			}
			else
			{
				KeySampleCnt=0;
				return 0;
			}
			break;
		
		#else
		case 1:
			if(KeyTemp!=KeyBuffer)
			{
				KeyEventCnt=0;
				return 0;//is dithering,return 0
			}
			else
			{
				if(++KeySampleCnt>=SHORT_ON_DITHERING_COUNTER)
				{
					KeySampleCnt=0;
					KeyEventCnt=2;
					return ((KeyBuffer-1)<<2)+1;//sure that key on,return (KeyBuffer-1)<<2+1
				}
				else
					return 0;//not sure that key on,return 0                 
			}
			break;
				
		case 2:
			if(KeyTemp!=KeyBuffer)
			{
				if(++KeySampleCnt>=SHORT_OFF_DITHERING_COUNTER)
				{
					KeyEventCnt=0;
					return ((KeyBuffer-1)<<2)+3;//after short on to off,(KeyBuffer-1)<<2+3
				}
				else
					return 0;
			}
			else
			{
				KeySampleCnt=0;
				return 0;
			}
			break;
		#endif

		default:break;
	}
	return 0;
}
/***************************************************************/

⌨️ 快捷键说明

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