从单片机基础到程序框架(全集 2019pdf版).pdf - 第507页

COLUMN_OUT PUT2=0; //列 2 输出 0,下 一步监控 S 2,非常关键 的代码! COLUMN_OUT PUT3=1; Su8KeySt ep++; / /切换到下一个 步骤,监控 S2 是否率先已经松开 } else i f(0==Su8KeyL ock) { if(0==RO W_INPUT1&&1 ==ROW_INPU T2&&1==ROW_ INPUT3) // S1 按键被按…

100%1 / 836
break;
case 7: //监控 S1 按键是否率先已经松
if(1==ROW_INPUT1&&1==ROW_INPUT2&&1==ROW_INPUT3)
{
Su16KeyCnt=0;
Su8KeyLock=0;
Su8KeyStep=1; //如果 S1 按键已经松开,返回到第一个运行步骤重新开始扫描
Su8ColumnRecord++;
if(Su8ColumnRecord>=3)
{
Su8ColumnRecord=0;
}
}
else
{
//“马上更新输出列的信号状态”
COLUMN_OUTPUT1=1;
COLUMN_OUTPUT2=0; //列 2 输出 0,下一步监控 S2,非常关键的代码!
COLUMN_OUTPUT3=1;
Su8KeyStep=4; //如果 S1 按键没有松开,继续返回判断 S2 是否已按下
}
break;
/*--------------“S2 后面所在的步骤里”------------------*/
case 8: //等待列输出稳定,但不是去抖动延时
Su16KeyCnt++;
if(Su16KeyCnt>=2)
{
Su16KeyCnt=0;
Su8KeyLock=0; //关键语句!自锁清零,为下一步自锁组合按键做准备
Su8KeyStep++;
}
break;
case 9: //判断 S1 按键
if(1==ROW_INPUT1&&1==ROW_INPUT2&&1==ROW_INPUT3) //S1 按键没有被按下
{
Su8KeyLock=0;
Su16KeyCnt=0;
//“马上更新输出列的信号状态”
COLUMN_OUTPUT1=1;
COLUMN_OUTPUT2=0; //列 2 输出 0,下一步监控 S2,非常关键的代码!
COLUMN_OUTPUT3=1;
Su8KeyStep++; //切换到下一个步骤,监控 S2 是否率先已经松开
}
else if(0==Su8KeyLock)
{
if(0==ROW_INPUT1&&1==ROW_INPUT2&&1==ROW_INPUT3) //S1 按键被按下
{
Su16KeyCnt++;
if(Su16KeyCnt>=KEY_SHORT_TIME)
{
Su8KeyLock=1; //组合按键的自锁
vGu8DoubleKeySec=1; //触发组合按键(S1+S2)
}
}
}
break;
case 10: //等待列输出稳定,但不是去抖动延时
Su16KeyCnt++;
if(Su16KeyCnt>=2)
{
Su16KeyCnt=0;
Su8KeyLock=0; //关键语句!自锁清零,为下一步自锁组合按键做准备
Su8KeyStep++;
}
break;
case 11: //监控 S2 按键是否率先已经松开
if(1==ROW_INPUT1&&1==ROW_INPUT2&&1==ROW_INPUT3)
{
Su16KeyCnt=0;
Su8KeyLock=0;
Su8KeyStep=1; //如果 S2 按键已经松开,返回到第一个运行步骤重新开始扫描
Su8ColumnRecord++;
if(Su8ColumnRecord>=3)
{
Su8ColumnRecord=0;
}
}
else
{
//“马上更新输出列的信号状态”
COLUMN_OUTPUT1=0; //列 1 输出 0,下一步监控 S1,非常关键的代码!
COLUMN_OUTPUT2=1;
COLUMN_OUTPUT3=1;
Su8KeyStep=8; //如果 S2 按键没有松开,继续返回判断 S1 是否已按下
}
break;
}
}
void SingleKeyTask(void)
{
if(0==vGu8SingleKeySec)
{
return;
}
switch(vGu8SingleKeySec)
{
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();
}
vGu8SingleKeySec=0;
break;
case 2: //S2 键的单击任务,更改 P1.5 所在的 LED 灯的显示状态
if(0==Gu8LedStatus_P1_5)