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

📄 key.c

📁 PIC串口程序  可以帮助你编写串口程序  里面还有我自己做的协议 很方便
💻 C
字号:
#include "..\includes\includes.h"


bank1  TYPE_KEY_CTL  keyCtlBlock;
const   TYPE_KEY_REPEAT_CTL	 KEY_REPEAT_CTL[KEY_SUM_MAX]=
{
	{0,10,600},
	{1,15,500},
	{2,15,500},
	{3,15,500},
	{4,15,500}	
};	
	

INT16U keyPortInput(void)
{
	INT16U keyIn;
	keyIn=PORTA;
	keyIn=keyIn&PIN_KEY_EMPTY;
	return(keyIn);
}

INT8U readKeyInput(void)
{
	INT16U input;
	INT8U key;
	input =keyPortInput();
	if (input ==0x0026)
		key=0x01;
	else if (input ==0x0025)
		key=0x02;
	else if (input ==0x0023)
		key=0x03;
	else if (input ==0x0007)
		key=0x04;
	else if (input ==0x0027)
		key=0x00;
	else key=0xFF;
	return (key);
}


void saveKeyCtlTime(void)
{
	keyCtlBlock.sTime=loadSystemTime(TYPE_TIME_DHMS);
}

INT8U checkKeyRepeat(void)
{
   uint32  time;
   INT16U  tDelay,tRepeat;
   uint32  tStart;
   INT8U   rd=0;
   tDelay=(keyCtlBlock.pRepeatCtl)->tDelay;
	tRepeat=(keyCtlBlock.pRepeatCtl)->tRepeat;
	tStart=keyCtlBlock.sTime;
	time=loadSystemTime(TYPE_TIME_DHMS);
	if (keyCtlBlock.repeat==1)
	{	time=time-tStart-tDelay;
		if ((time%tRepeat)==0)
			rd=1;	}
	else 
	{	time=time-tStart;
		if (time>=tDelay)
		{	keyCtlBlock.repeat=1;}	
         }	
	return(rd);		
}



void userKeyScan(void)
{   extern const  TYPE_KEY_REPEAT_CTL				KEY_REPEAT_CTL[KEY_SUM_MAX];
    INT8U input;
	input=readKeyInput();
	if (input!=keyCtlBlock.input)
	{	keyCtlBlock.input=input;
		keyCtlBlock.iDelay=0;	}
	else if (keyCtlBlock.iDelay <5)	//去除按键抖动50ms
		keyCtlBlock.iDelay+=1;
	else 	
	{	if (keyCtlBlock.value ==keyCtlBlock.input)
		{	if (keyCtlBlock.input!=KEY_EMPTY)
			{	if (checkKeyRepeat())
				 keyCtlBlock.full=1;
					
			}
		}
		else 
		{	saveKeyCtlTime();
			keyCtlBlock.repeat=0;
			keyCtlBlock.full =1;
			keyCtlBlock.value =keyCtlBlock.input;
            keyCtlBlock.pRepeatCtl=&KEY_REPEAT_CTL[keyCtlBlock.value];
		}
	}
}	


INT8U checkKeyEvent(void)
{
 INT8U event;
	event =EVENT_NULL;
	if (keyCtlBlock.full==1)	//按键空表示弹起事件发生
	{	if (keyCtlBlock.value ==KEY_EMPTY)
		{	keyCtlBlock.full=0;
			event =EVENT_KEY_UP;	}
		else 
		{	if (keyCtlBlock.repeat==1)
				event =EVENT_KEY_REPEAT;	
			else 
			event =EVENT_KEY_DOWN;	}
	}		
	return(event);		
}

INT8U checkKeyCloseTime( INT16U t)
{ uint32 time;
	time=loadSystemTime(TYPE_TIME_DHMS);
	if (keyCtlBlock.repeat==1)
	{	if (time-keyCtlBlock.sTime>=t)
			return(1);	}
	return (0);		
}

INT8U readKeyBuff(void)
{	keyCtlBlock.full =0;
	return(keyCtlBlock.value);
}


void userKeyCtlInit(void)
{	keyCtlBlock.event=0;	//按键事件类型
	keyCtlBlock.nTime=0;
	keyCtlBlock.full=0;		//full=1表示有效按键等待读取
	keyCtlBlock.value=255;	//按键值
	keyCtlBlock.input=255;	//按键输入缓冲
	keyCtlBlock.iDelay=0;	//输入延迟,控制按键抖动的滤波参数
	keyCtlBlock.sTime=0;	//记录按键按下时间
	keyCtlBlock.repeat=0;	//按键重复功能激活
	keyCtlBlock.pRepeatCtl=(TYPE_KEY_REPEAT_CTL*)&KEY_REPEAT_CTL[0];
}

⌨️ 快捷键说明

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