从单片机基础到程序框架(全集 2019pdf版).pdf - 第492页
else i f(0==Su8KeyL ock) { if(0==RO W_INPUT1&&1 ==ROW_INPU T2&&1==ROW_ INPUT3) { Su16KeyCnt ++; if(Su16Key Cnt>=KEY_ SHORT_TIME) { Su8KeyLo ck=1; if(0==Su 8ColumnReco rd) { vGu8Single KeySec=1; //单击任务,…

if(0==Su8ColumnRecord)
{
COLUMN_OUTPUT1=0;
COLUMN_OUTPUT2=1;
COLUMN_OUTPUT3=1;
}
else if(1==Su8ColumnRecord)
{
COLUMN_OUTPUT1=1;
COLUMN_OUTPUT2=0;
COLUMN_OUTPUT3=1;
}
else
{
COLUMN_OUTPUT1=1;
COLUMN_OUTPUT2=1;
COLUMN_OUTPUT3=0;
}
Su16KeyCnt=0;
Su8KeyStep++;
break;
case 2: //等待列输出稳定,但不是去抖动延时
Su16KeyCnt++;
if(Su16KeyCnt>=2)
{
Su16KeyCnt=0;
Su8KeyStep++;
}
break;
case 3:
if(1==ROW_INPUT1&&1==ROW_INPUT2&&1==ROW_INPUT3)
{
Su8KeyStep=1;
Su8KeyLock=0;
Su16KeyCnt=0;
Su8ColumnRecord++;
if(Su8ColumnRecord>=3)
{
Su8ColumnRecord=0;
}
}

else if(0==Su8KeyLock)
{
if(0==ROW_INPUT1&&1==ROW_INPUT2&&1==ROW_INPUT3)
{
Su16KeyCnt++;
if(Su16KeyCnt>=KEY_SHORT_TIME)
{
Su8KeyLock=1;
if(0==Su8ColumnRecord)
{
vGu8SingleKeySec=1; //单击任务,触发 1 号键 对应 S1 键
//“马上更新输出列的信号状态”
COLUMN_OUTPUT1=1;
COLUMN_OUTPUT2=0; //列 2 也输出 0,非常关键的代码!
COLUMN_OUTPUT3=1;
Su16KeyCnt=0; //去抖动延时清零,为下一步计时做准备
Su8KeyStep++; //切换到下一步步骤
}
else if(1==Su8ColumnRecord)
{
vGu8SingleKeySec=2;
}
else if(2==Su8ColumnRecord)
{
vGu8SingleKeySec=3;
}
}
}
else if(1==ROW_INPUT1&&0==ROW_INPUT2&&1==ROW_INPUT3)
{
Su16KeyCnt++;
if(Su16KeyCnt>=KEY_SHORT_TIME)
{
Su8KeyLock=1;
if(0==Su8ColumnRecord)
{
vGu8SingleKeySec=4;
}
else if(1==Su8ColumnRecord)

{
vGu8SingleKeySec=5;
}
else if(2==Su8ColumnRecord)
{
vGu8SingleKeySec=6;
}
}
}
else if(1==ROW_INPUT1&&1==ROW_INPUT2&&0==ROW_INPUT3)
{
Su16KeyCnt++;
if(Su16KeyCnt>=KEY_SHORT_TIME)
{
Su8KeyLock=1;
if(0==Su8ColumnRecord)
{
vGu8SingleKeySec=7;
}
else if(1==Su8ColumnRecord)
{
vGu8SingleKeySec=8;
}
else if(2==Su8ColumnRecord)
{
vGu8SingleKeySec=9;
}
}
}
}
break;
case 4: //等待列输出稳定,但不是去抖动延时
Su16KeyCnt++;
if(Su16KeyCnt>=2)
{
Su16KeyCnt=0;
Su8KeyLock=0; //关键语句!自锁清零,为下一步自锁组合按键做准备
Su8KeyStep++;
}
break;
case 5: //判断 S2 按键
if(1==ROW_INPUT1&&1==ROW_INPUT2&&1==ROW_INPUT3) //S2 按键没有被按下