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

* “大众按键” 区分开来, 才能相互清晰 互不干扰 。本节的“特殊 技能按键” 是 S1 和 S9。 * 如果觉得本 节的讲解不够 详细具体, 请先 阅读一下 前面章节 “独立 按键按住不松 手的先加速后 匀速触发 ” 。 */ void KeySc an(void) //此函 数放在定时中 断里每 1 ms 扫描一次 { static unsig ned char Su8KeyL ock=0; static unsig ned in…

100%1 / 836
{
if(1==Gu8DisplayUpdate) //需要刷新一次显示
{
Gu8DisplayUpdate=0; //及时清零,避免主函数“不断去执行显示代码”而影响程序效率
if(Gu16SetData<100)
{
BUS_P0=~(1<<0); //第 0 个灯亮
}
else if(Gu16SetData<200)
{
BUS_P0=~(1<<1); //第 1 个灯亮
}
else if(Gu16SetData<300)
{
BUS_P0=~(1<<2); //第 2 个灯亮
}
else if(Gu16SetData<400)
{
BUS_P0=~(1<<3); //第 3 个灯亮
}
else if(Gu16SetData<500)
{
BUS_P0=~(1<<4); //第 4 个灯亮
}
else if(Gu16SetData<600)
{
BUS_P0=~(1<<5); //第 5 个灯亮
}
else if(Gu16SetData<700)
{
BUS_P0=~(1<<6); //第 6 个灯亮
}
else
{
BUS_P0=~(1<<7); //第 7 个灯亮
}
}
}
/* 注释二:
* 本节破题的关键:
* 矩阵按键涉及的按键数量很多,但是实际项目上一般只需要少数个别按键具备这种
* “单击”与“先加速后均匀触发”的特殊技能,因此,在代码上,必须把这类“特殊技能按键”
* “大众按键”区分开来,才能相互清晰互不干扰。本节的“特殊技能按键” S1 S9。
* 如果觉得本节的讲解不够详细具体,请先阅读一下前面章节“独立按键按住不松手的先加速后匀速触发
*/
void KeyScan(void) //此函数放在定时中断里每 1ms 扫描一次
{
static unsigned char Su8KeyLock=0;
static unsigned int Su16KeyCnt=0;
static unsigned char Su8KeyStep=1;
static unsigned int Su16KeyContinuityTime=KEY_CONTINUITY_INITIAL_TIME; //动态时间阀值
static unsigned char Su8ColumnRecord=0;
switch(Su8KeyStep)
{
case 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; //返回步骤 1 继续扫描
Su8KeyLock=0;
Su16KeyCnt=0;
Su16KeyContinuityTime=KEY_CONTINUITY_INITIAL_TIME; //动态时间阀值。重装初始值。
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)
{
vGu8KeySec=1; //触发一次单击
Su16KeyCnt=0; //计时器清零,为即将来临的计时做准备
Su8KeyStep=4; //跳到 S1 按键的专属区,脱离大众按键
}
else if(1==Su8ColumnRecord)
{
vGu8KeySec=2;
}
else if(2==Su8ColumnRecord)
{
vGu8KeySec=3;
}
}
}
else if(1==ROW_INPUT1&&0==ROW_INPUT2&&1==ROW_INPUT3)