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

第一百零五节: 矩阵按键按住不松手的连续均匀触发。 【105.1 按住不松手的连续均匀触发。 】 上图 10 5.1.1 有源蜂鸣器 电路 上图 10 5.1.2 LED 电路

100%1 / 836
}
void LedClose_P1_4(void)
{
P1_4=1;
}
void VoiceScan(void)
{
static unsigned char Su8Lock=0;
if(1==vGu8BeepTimerFlag&&vGu16BeepTimerCnt>0)
{
if(0==Su8Lock)
{
Su8Lock=1;
BeepOpen();
}
else
{
vGu16BeepTimerCnt--;
if(0==vGu16BeepTimerCnt)
{
Su8Lock=0;
BeepClose();
}
}
}
}
第一百零五节: 矩阵按键按住不松手的连续均匀触发。
【105.1 按住不松手的连续均匀触发。
上图 105.1.1 有源蜂鸣器电路
上图 105.1.2 LED 电路
上图 105.1.3 3*3 矩阵按键的电路
矩阵按键与前面章节独立按键的“按住不松手的连续均匀触发”的处理思路是一样的在电脑上删除某
退[Backspace]退
[Backspace]”不松手,就会“连续均匀”的触发“删除”的功能,自动逐个把整行文字删除清空,这就
“按住不松手的连续均匀触发”应用案例之一。除此之外,在很多需要人机交互的项目中都有这样的功能,
为了快速加减某个数值,按住某个按键不松手某个数值有节奏地快速往上加或者快速往下减。这种按住
不松手连续均匀触发”的按键识别,在程序上有“3 个时间”需要留意 1 个是按键单击的“滤波时间
2 个是按键“从单击进入连击的间隔时(此时间是“单击”“连击”分界线) 3 个是按键“连
击”的间隔时间
本节能如1)8 按键马灯 1 LED S1
按键,“亮的 LED”就“往左边跑一步”相反,每触发一次 S9 按键“亮的 LED”就“往右边跑一步”。如果
按住 S1 或者 S9 不松手就连续触发,“亮的 LED”就“连续跑”,一直跑到左边或者右边的尽头。2)按键每
“单击”一次 S1 或者 S9 蜂鸣器就鸣叫一次,但是,当按键“从单击进入连击”后,蜂鸣器就不鸣叫代码
如下:
#include "REG52.H"
#define KEY_VOICE_TIME 50
#define KEY_SHORT_TIME 20 //按键单击的“滤波”时间
#define KEY_ENTER_CONTINUITY_TIME 240 //按键“从单击进入连击”的间隔时间
#define KEY_CONTINUITY_TIME 64 //按键“连击”的间隔时间
#define BUS_P0 P0 //8 LED 灯一一对应单片机 P0 口总线
void T0_time();
void SystemInitial(void) ;
void Delay(unsigned long u32DelayTime) ;
void PeripheralInitial(void) ;
void BeepOpen(void);
void BeepClose(void);
void VoiceScan(void);
void KeyScan(void);
void KeyTask(void);
void DisplayTask(void); //显示的任务函数(LED 显示状态)
sbit P3_4=P3^4;
sbit ROW_INPUT1=P2^2; //第 1 行输入口。