📄 key.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 + -