给你看看我的实际工程中的做法:
获取按键键值uint8 KeyGet(void)
{
return (GetADC_8(5)+8)/16;//AD按键
}
uint8 KeyGet(void) //独立按键
{
uint8 i;
i=VOID_KEY;
if(p10_pin==0) //呼叫键
i|=1;
if(p37_pin==0) //系统卡设置键
{
p37_pin=1;
DELAY_uS(5);
if(p37_pin==0)
i|=2;
p37_pin=0;
}
return i;
}
和按键处理有关的几个定义
#define VOID_KEY 0 //无键键值
//和按键时间有关的常数(mS)
#define DLY_XD 40 //消抖
#define DLY_NO_KEY 120 //无键
#define DLY_RPT_START 1000 //重发首键
#define DLY_RPT 200 //重发间隔
#define DLY_LONG 10000 //长按
按键执行程序.keyvalue++;是为了去除编译警告用的,
void Key_Down_short(uint8 keyvalue) //短按
{keyvalue++;
}
void Key_Down_long_rpt(uint8 keyvalue) //长按连发
{keyvalue++;
}
void Key_Down_long(uint8 keyvalue) //长按20S
{//keyvalue++;
if(keyvalue==8)//监视键当老化键
{
}
}
void Key_Up_long(uint8 keyvalue) //长按抬起
{keyvalue++;
}
void Key_Up_short(uint8 keyvalue) //短按抬起
{//keyvalue++;
uint8 i;
switch (keyvalue)
{
case 2://电控锁 1 开锁(电控锁)键
{
}break;
case 4://电磁锁/摄像头 2 开锁(电磁锁)键
{//对讲时,开锁作用。开关3#mkj
}break;
case 6://菜单 3 铃声选择键
{
}break;
case 8://监视/-
{
}break;
case 10://5 对讲/户户通键
{//
}break;
case 1://hht 6 铃声音量键
{//
}break;
default:
{
}break;
}
}
|