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

第一百零一节: 矩阵按键鼠标式的单击与双击。 【101.1 矩阵按键鼠标式的单击与双击。 】 上图 10 1.1.1 有源蜂鸣器 电路 上图 10 1.1.2 LED 电路

100%1 / 836
{
P3_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();
}
}
}
}
第一百零一节: 矩阵按键鼠标式的单击与双击。
【101.1 矩阵按键鼠标式的单击与双击。
上图 101.1.1 有源蜂鸣器电路
上图 101.1.2 LED 电路
上图 101.1.3 3*3 矩阵按键的电路
矩阵按键与前面章节独立按键的单击与双击的处理思路是一样的,本节讲矩阵按键的单击与双击,也算
是重温之前章节讲的内容
鼠标的左键可以触发单击,也可以触发双击双击的规则是这样的两次单击如果第 1 次单击与第
2 次单击的时间比较“短”时候,则这两次单击就构成双击。编写这个程序的最大亮点是如何控制好第 1
次单击与第 2 次单击的时间间隔。程序例程要实现的功能是:以 S1 键为例(1)单击改 LED 灯的显示
状态。单击一次 LED 从原来“灭”的状态变成“亮”的状态,或者从原来“亮”的状态变成“灭”的状态,
依次循环切换。2)双击则蜂鸣器发出“嘀”的一声。代码如下
#include "REG52.H"
#define KEY_VOICE_TIME 50
#define KEY_SHORT_TIME 20 //按键去抖动的“滤波”时间
#define KEY_INTERVAL_TIME 80 //连续两次单击之间的最大有效时间。因为是矩阵,80 不一定是 80ms
void T0_time();
void SystemInitial(void) ;
void Delay(unsigned long u32DelayTime) ;
void PeripheralInitial(void) ;
void BeepOpen(void);
void BeepClose(void);
void LedOpen(void);
void LedClose(void);
void VoiceScan(void);
void KeyScan(void);
void SingleKeyTask(void); //单击按键任务函数,放在主函数
void DoubleKeyTask(void); //双击按键任务函数,放在主函数
sbit P3_4=P3^4; //蜂鸣
sbit P1_4=P1^4; //LED
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;