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

第一百零四节: 矩阵按键“一键两用”的短按与长按。 【104.1 “一键两用”的短按与长按。 】 上图 10 4.1.1 有源蜂鸣器 电路 上图 10 4.1.2 LED 电路

100%1 / 836
{
vGu16BeepTimerCnt--;
if(0==vGu16BeepTimerCnt)
{
Su8Lock=0;
BeepClose();
}
}
}
}
第一百零四节: 矩阵按键“一键两用”的短按与长按。
【104.1 “一键两用”的短按与长按。
上图 104.1.1 有源蜂鸣器电路
上图 104.1.2 LED 电路
上图 104.1.3 3*3 矩阵按键的电路
矩阵按键与前面章节独立按键的“短按与长按”的处理思路是一样的,本节讲矩阵按键的“短按与长按”
也算是重温之前章节讲的内容。“短按与长按”的原理是依赖“按键按下的时间长度”来区分识别。“短按”
是指从按下的“下降沿”到松手的“上升沿”时间,按”是指从按下的下降沿”到一直按住不松手
“低电平持续时间”。本节的例程功能如下:(1)S1 每“短按”一次,LED 要么从“灭”变成“亮”,要么从
“亮”变成“灭”,在两种状态之间切换。(2)S1 每“长按”一次,蜂鸣器发出“嘀”的一声。代码如下
#include "REG52.H"
#define KEY_VOICE_TIME 50
#define KEY_SHORT_TIME 20 //按键的“短按”兼“滤波”的“稳定时间”
#define KEY_LONG_TIME 400 //按键的“长按”兼“滤波”的“稳定时间”
void T0_time();
void SystemInitial(void) ;
void Delay(unsigned long u32DelayTime) ;
void PeripheralInitial(void) ;
void BeepOpen(void);
void BeepClose(void);
void LedOpen_P1_4(void);
void LedClose_P1_4(void);
void VoiceScan(void);
void KeyScan(void);
void KeyTask(void);
sbit P3_4=P3^4;
sbit P1_4=P1^4;
sbit ROW_INPUT1=P2^2; //第 1 行输入口。
sbit ROW_INPUT2=P2^1; //第 2 行输入口。
sbit ROW_INPUT3=P2^0; //第 3 行输入口。
sbit COLUMN_OUTPUT1=P2^5; //第 1 列输出口。
sbit COLUMN_OUTPUT2=P2^4; //第 2 列输出口。
sbit COLUMN_OUTPUT3=P2^3; //第 3 列输出口。
volatile unsigned char vGu8BeepTimerFlag=0;
volatile unsigned int vGu16BeepTimerCnt=0;
unsigned char Gu8LedStatus_P1_4=0;