从单片机基础到程序框架(全集 2019pdf版).pdf - 第462页
case 4: //按键 扫描输出第二 列低电平 COLUMN_O UTPUT1=1; COLUMN_O UTPUT2=0; COLUMN_O UTPUT3=1; Su16KeyC nt=0; //延时 计数器清零 Su8KeySt ep++; //切换 到下一个运行 步骤 break; case 5: //延时等待 2 ms 后(等此 3 列输 出同步稳定 ) 。不是按键 的去抖动延时 。 Su16KeyC nt++; if(Su16…

case 3:
if(1==ROW_INPUT1&&1==ROW_INPUT2&&1==ROW_INPUT3)
{
Su8KeyStep++; //如果没有按键按下,切换到下一个运行步骤
Su8KeyLock=0; //按键自锁标志清零
Su16KeyCnt=0; //按键去抖动延时计数器清零,此行非常巧妙
}
else if(0==Su8KeyLock) //有按键按下,且是第一次触发
{
if(0==ROW_INPUT1&&1==ROW_INPUT2&&1==ROW_INPUT3)
{
Su16KeyCnt++; //去抖动延时计数器
if(Su16KeyCnt>=KEY_SHORT_TIME)
{
Su16KeyCnt=0;
Su8KeyLock=1;//自锁置 1,避免一直触发,只有松开按键,此标志位才会被清零
vGu8KeySec=1; //触发 1 号键 对应 S1 键
}
}
else if(1==ROW_INPUT1&&0==ROW_INPUT2&&1==ROW_INPUT3)
{
Su16KeyCnt++; //去抖动延时计数器
if(Su16KeyCnt>=KEY_SHORT_TIME)
{
Su16KeyCnt=0;
Su8KeyLock=1;//自锁置 1,避免一直触发,只有松开按键,此标志位才会被清零
vGu8KeySec=2; //触发 2 号键 对应 S2 键
}
}
else if(1==ROW_INPUT1&&1==ROW_INPUT2&&0==ROW_INPUT3)
{
Su16KeyCnt++; //去抖动延时计数器
if(Su16KeyCnt>=KEY_SHORT_TIME)
{
Su16KeyCnt=0;
Su8KeyLock=1;//自锁置 1,避免一直触发,只有松开按键,此标志位才会被清零
vGu8KeySec=3; //触发 3 号键 对应 S3 键
}
}
}
break;

case 4: //按键扫描输出第二列低电平
COLUMN_OUTPUT1=1;
COLUMN_OUTPUT2=0;
COLUMN_OUTPUT3=1;
Su16KeyCnt=0; //延时计数器清零
Su8KeyStep++; //切换到下一个运行步骤
break;
case 5: //延时等待 2ms 后(等此 3 列输出同步稳定)。不是按键的去抖动延时。
Su16KeyCnt++;
if(Su16KeyCnt>=2)
{
Su16KeyCnt=0;
Su8KeyStep++; //切换到下一个运行步骤
}
break;
case 6:
if(1==ROW_INPUT1&&1==ROW_INPUT2&&1==ROW_INPUT3)
{
Su8KeyStep++; //如果没有按键按下,切换到下一个运行步骤
Su8KeyLock=0; //按键自锁标志清零
Su16KeyCnt=0; //按键去抖动延时计数器清零,此行非常巧妙
}
else if(0==Su8KeyLock) //有按键按下,且是第一次触发
{
if(0==ROW_INPUT1&&1==ROW_INPUT2&&1==ROW_INPUT3)
{
Su16KeyCnt++; //去抖动延时计数器
if(Su16KeyCnt>=KEY_SHORT_TIME)
{
Su16KeyCnt=0;
Su8KeyLock=1;//自锁置 1,避免一直触发,只有松开按键,此标志位才会被清零
vGu8KeySec=4; //触发 4 号键 对应 S4 键
}
}
else if(1==ROW_INPUT1&&0==ROW_INPUT2&&1==ROW_INPUT3)
{
Su16KeyCnt++; //去抖动延时计数器
if(Su16KeyCnt>=KEY_SHORT_TIME)
{
Su16KeyCnt=0;

Su8KeyLock=1;//自锁置 1,避免一直触发,只有松开按键,此标志位才会被清零
vGu8KeySec=5; //触发 5 号键 对应 S5 键
}
}
else if(1==ROW_INPUT1&&1==ROW_INPUT2&&0==ROW_INPUT3)
{
Su16KeyCnt++; //去抖动延时计数器
if(Su16KeyCnt>=KEY_SHORT_TIME)
{
Su16KeyCnt=0;
Su8KeyLock=1;//自锁置 1,避免一直触发,只有松开按键,此标志位才会被清零
vGu8KeySec=6; //触发 6 号键 对应 S6 键
}
}
}
break;
case 7: //按键扫描输出第三列低电平
COLUMN_OUTPUT1=1;
COLUMN_OUTPUT2=1;
COLUMN_OUTPUT3=0;
Su16KeyCnt=0; //延时计数器清零
Su8KeyStep++; //切换到下一个运行步骤
break;
case 8: //延时等待 2ms 后(等此 3 列输出同步稳定)。不是按键的去抖动延时。
Su16KeyCnt++;
if(Su16KeyCnt>=2)
{
Su16KeyCnt=0;
Su8KeyStep++; //切换到下一个运行步骤
}
break;
case 9:
if(1==ROW_INPUT1&&1==ROW_INPUT2&&1==ROW_INPUT3)
{
Su8KeyStep=1; //如果没有按键按下,返回到第一步,重新开始扫描!!!!!!
Su8KeyLock=0; //按键自锁标志清零
Su16KeyCnt=0; //按键去抖动延时计数器清零,此行非常巧妙
}
else if(0==Su8KeyLock) //有按键按下,且是第一次触发
{