从单片机基础到程序框架(全集 2019pdf版).pdf - 第518页
} else i f(1==Su8Colu mnRecord) { vGu8KeySec =5; } else i f(2==Su8Colu mnRecord) { vGu8KeySec =6; } } } else if(1= =ROW_INPU T1&&1==ROW_I NPUT2&&0= =ROW_INPUT3) { Su16KeyCnt ++; if(Su16Key Cnt>=KEY_ SH…

Su16KeyCnt++;
if(Su16KeyCnt>=KEY_SHORT_TIME) //“短按”兼“滤波”的“稳定时间”
{
//注意,这里不能“自锁”。后面“长按”触发的时候才“自锁”。
Su8KeyShortFlag_S1=1; //S1 的“短按”标志有效,待松手时触发。
}
if(Su16KeyCnt>=KEY_LONG_TIME) //“长按”兼“滤波”的“稳定时间”
{
Su8KeyLock=1; //此时“长按”触发才“自锁”
Su8KeyShortFlag_S1=0; //既然此时“长按”有效,那么就要废除潜在的“短按”。
vGu8KeySec=21; //触发 S1 的“长按”
}
}
else if(0==ROW_INPUT1&&1==ROW_INPUT2&&1==ROW_INPUT3)
{
Su16KeyCnt++;
if(Su16KeyCnt>=KEY_SHORT_TIME)
{
Su8KeyLock=1;
//既然 S1 按键已经被上面几行代码单独扣出来,这里就直接从 S2 按键开始判断
if(1==Su8ColumnRecord)
{
vGu8KeySec=2;
}
else if(2==Su8ColumnRecord)
{
vGu8KeySec=3;
}
}
}
else if(1==ROW_INPUT1&&0==ROW_INPUT2&&1==ROW_INPUT3)
{
Su16KeyCnt++;
if(Su16KeyCnt>=KEY_SHORT_TIME)
{
Su8KeyLock=1;
if(0==Su8ColumnRecord)
{
vGu8KeySec=4;

}
else if(1==Su8ColumnRecord)
{
vGu8KeySec=5;
}
else if(2==Su8ColumnRecord)
{
vGu8KeySec=6;
}
}
}
else if(1==ROW_INPUT1&&1==ROW_INPUT2&&0==ROW_INPUT3)
{
Su16KeyCnt++;
if(Su16KeyCnt>=KEY_SHORT_TIME)
{
Su8KeyLock=1;
if(0==Su8ColumnRecord)
{
vGu8KeySec=7;
}
else if(1==Su8ColumnRecord)
{
vGu8KeySec=8;
}
else if(2==Su8ColumnRecord)
{
vGu8KeySec=9;
}
}
}
}
break;
}
}
void KeyTask(void)
{
if(0==vGu8KeySec)
{
return;

}
switch(vGu8KeySec)
{
case 1: //S1 按键的“短按”任务,更改 P1.4 所在的 LED 灯的显示状态
if(0==Gu8LedStatus_P1_4)
{
Gu8LedStatus_P1_4=1;
LedOpen_P1_4();
}
else
{
Gu8LedStatus_P1_4=0;
LedClose_P1_4();
}
vGu8KeySec=0;
break;
//以下 S1 按键的“长按”直接选择 case 21 的“21”,是为了不占用前排其它按键的编号。
case 21: //S1 按键的“长按”任务,蜂鸣器发出“嘀”一声
vGu8BeepTimerFlag=0;
vGu16BeepTimerCnt=KEY_VOICE_TIME; //蜂鸣器发出“嘀”一声
vGu8BeepTimerFlag=1;
vGu8KeySec=0;
break;
default:
vGu8KeySec=0;
break;
}
}
void T0_time() interrupt 1
{
VoiceScan();
KeyScan();
TH0=0xfc;
TL0=0x66;