#include "REG52.H"
const_voice_short 40の#define
の#define const_key_time1 20で
の#define const_key_time2 20で
200は@ const_interval_time1の#define二つの連続キーの違いとの間の効果的な時間
、この時間を超過した場合に#define const_interval_time2 200 //、それは無効と見なされます
の#define const_key_time1 20で
の#define const_key_time2 20で
200は@ const_interval_time1の#define二つの連続キーの違いとの間の効果的な時間
、この時間を超過した場合に#define const_interval_time2 200 //、それは無効と見なされます
空initial_myself();
空initial_peripheral();
空delay_long(unsigned int型uiDelayLong)。
空T0_time();
key_scanのボイド();
空key_service();
空initial_peripheral();
空delay_long(unsigned int型uiDelayLong)。
空T0_time();
key_scanのボイド();
空key_service();
SBIT key_sr1 = P0 ^ 0。
SBIT key_sr2 = P0 ^ 1。
SBIT key_gnd_dr = P0 ^ 4。
SBIT beep_dr = P1 ^ 5。
SBIT key_sr2 = P0 ^ 1。
SBIT key_gnd_dr = P0 ^ 4。
SBIT beep_dr = P1 ^ 5。
unsigned char型ucKeySec = 0。
INT = 0 uiKeyTimeCnt1符号なし;
unsigned char型ucKeyLock1 = 0;
unsigned char型ucKeyTouchCnt1 = 0; //回の数は、ボタンが記録押される
unsigned int型uiKeyIntervalCnt1 = 0; //キーインターバルタイムカウンタ
unsigned char型ucKeyLock1 = 0;
unsigned char型ucKeyTouchCnt1 = 0; //回の数は、ボタンが記録押される
unsigned int型uiKeyIntervalCnt1 = 0; //キーインターバルタイムカウンタ
unsigned int型uiKeyTimeCnt2 = 0;
unsigned char型ucKeyLock2 = 0。
unsigned char型ucKeyTouchCnt2 = 0。
unsigned int型uiKeyIntervalCnt2 = 0;
unsigned char型ucKeyLock2 = 0。
unsigned char型ucKeyTouchCnt2 = 0。
unsigned int型uiKeyIntervalCnt2 = 0;
unsigned int型uiVoiceCnt = 0;
ボイドメイン()
{
initial_myself()。
delay_long(100)。
initial_peripheral();
一方、(1)
{
key_service()。
}
}
{
initial_myself()。
delay_long(100)。
initial_peripheral();
一方、(1)
{
key_service()。
}
}
void key_scan()
{
if(key_sr1==1)
{
ucKeyLock1=0;
uiKeyTimeCnt1=0;
if(ucKeyTouchCnt1>0) //之前已经有按键触发过一次了,再来一次就构成了双击
{
uiKeyIntervalCnt1++; //按键间隔的时间计数器累加
if(uiKeyIntervalCnt1>const_interval_time1) //超过最大允许的间隔时间
{
uiKeyIntervalCnt1=0; //时间计数器清零
ucKeyTouchCnt1=0; //清零按键按下去的次数
}
}
}
else if(ucKeyLock1==0) //有按键按下,且是第一次被按下
{
uiKeyTimeCnt1++;
if(uiKeyTimeCnt1>const_key_time1)
{
uiKeyTimeCnt1=0;
ucKeyLock1=1; //自锁按键置位,避免一直触发
uiKeyIntervalCnt1=0; //按键有效间隔的时间计数器清零
ucKeyTouchCnt1++;
if(ucKeyTouchCnt1>1) //连续被按了两次以上
{
ucKeyTouchCnt1=0; //统计按键次数清零
ucKeySec=1; //触发1号按键
}
}
}
if(key_sr2==1)
{
ucKeyLock2=0;
uiKeyTimeCnt2=0;
if(ucKeyTouchCnt2>0) //之前已经有按键触发过一次了,再来一次就构成了双击
{
uiKeyIntervalCnt2++; //按键间隔的时间计数器累加
if(uiKeyIntervalCnt2>const_interval_time2) //超过最大允许的间隔时间
{
uiKeyIntervalCnt2=0; //时间计数器清零
ucKeyTouchCnt2=0; //清零按键按下去的次数
}
}
}
else if(ucKeyLock2==0) //有按键按下,且是第一次被按下
{
uiKeyTimeCnt2++;
if(uiKeyTimeCnt2>const_key_time2)
{
uiKeyTimeCnt2=0;
ucKeyLock2=1; //自锁按键置位,避免一直触发
uiKeyIntervalCnt2=0; //按键有效间隔的时间计数器清零
ucKeyTouchCnt2++;
if(ucKeyTouchCnt2>1) //连续被按了两次以上!!!这很关键!!!
{
ucKeyTouchCnt2=0; //统计按键次数清零
ucKeySec=1; //触发1号按键
}
}
}
}
{
if(key_sr1==1)
{
ucKeyLock1=0;
uiKeyTimeCnt1=0;
if(ucKeyTouchCnt1>0) //之前已经有按键触发过一次了,再来一次就构成了双击
{
uiKeyIntervalCnt1++; //按键间隔的时间计数器累加
if(uiKeyIntervalCnt1>const_interval_time1) //超过最大允许的间隔时间
{
uiKeyIntervalCnt1=0; //时间计数器清零
ucKeyTouchCnt1=0; //清零按键按下去的次数
}
}
}
else if(ucKeyLock1==0) //有按键按下,且是第一次被按下
{
uiKeyTimeCnt1++;
if(uiKeyTimeCnt1>const_key_time1)
{
uiKeyTimeCnt1=0;
ucKeyLock1=1; //自锁按键置位,避免一直触发
uiKeyIntervalCnt1=0; //按键有效间隔的时间计数器清零
ucKeyTouchCnt1++;
if(ucKeyTouchCnt1>1) //连续被按了两次以上
{
ucKeyTouchCnt1=0; //统计按键次数清零
ucKeySec=1; //触发1号按键
}
}
}
if(key_sr2==1)
{
ucKeyLock2=0;
uiKeyTimeCnt2=0;
if(ucKeyTouchCnt2>0) //之前已经有按键触发过一次了,再来一次就构成了双击
{
uiKeyIntervalCnt2++; //按键间隔的时间计数器累加
if(uiKeyIntervalCnt2>const_interval_time2) //超过最大允许的间隔时间
{
uiKeyIntervalCnt2=0; //时间计数器清零
ucKeyTouchCnt2=0; //清零按键按下去的次数
}
}
}
else if(ucKeyLock2==0) //有按键按下,且是第一次被按下
{
uiKeyTimeCnt2++;
if(uiKeyTimeCnt2>const_key_time2)
{
uiKeyTimeCnt2=0;
ucKeyLock2=1; //自锁按键置位,避免一直触发
uiKeyIntervalCnt2=0; //按键有效间隔的时间计数器清零
ucKeyTouchCnt2++;
if(ucKeyTouchCnt2>1) //连续被按了两次以上!!!这很关键!!!
{
ucKeyTouchCnt2=0; //统计按键次数清零
ucKeySec=1; //触发1号按键
}
}
}
}
void key_service()
{
switch(ucKeySec)
{
case 1: //1号键, 双击
uiVoiceCnt=const_voice_short;
ucKeySec=0;
break;
case 2:
uiVoiceCnt=const_voice_short;
ucKeySec=0;
break;
}
}
{
switch(ucKeySec)
{
case 1: //1号键, 双击
uiVoiceCnt=const_voice_short;
ucKeySec=0;
break;
case 2:
uiVoiceCnt=const_voice_short;
ucKeySec=0;
break;
}
}
void T0_time() interrupt 1
{
TF0=0;
TR0=0;
key_scan();
if(uiVoiceCnt!=0)
{
uiVoiceCnt--;
beep_dr=0;
}
else
{
;
beep_dr=1;
}
TH0=0xf8;
TL0=0x2f;
TR0=1;
}
{
TF0=0;
TR0=0;
key_scan();
if(uiVoiceCnt!=0)
{
uiVoiceCnt--;
beep_dr=0;
}
else
{
;
beep_dr=1;
}
TH0=0xf8;
TL0=0x2f;
TR0=1;
}
void delay_long(unsigned int uiDelayLong)
{
unsigned int i;
unsigned int j;
for(i=0;i<uiDelayLong;i++)
for(j=0;j<500;j++)
;
}
{
unsigned int i;
unsigned int j;
for(i=0;i<uiDelayLong;i++)
for(j=0;j<500;j++)
;
}
void initial_myself()
{
key_gnd_dr=0;
beep_dr=1;
TMOD=0x01;
TH0=0xf8;
TL0=0x2f;
}
{
key_gnd_dr=0;
beep_dr=1;
TMOD=0x01;
TH0=0xf8;
TL0=0x2f;
}
void initial_peripheral()
{
EA=1;
ET0=1;
TR0=1;
}
{
EA=1;
ET0=1;
TR0=1;
}