第13节:按住一个独立按键不松手的加速匀速触发
key_service();//按键服务的应用程序
led_run(); //led灯的应用程序
}
}
void led_run() //led灯的应用程序
{
if(uiSetNumber<500) //如果被设置的参数uiSetNumber小于500,LED灯则灭。否则亮。
{
led_dr=0; //灭
}
else
{
led_dr=1; //亮
}
}
void key_scan()//按键扫描函数 放在定时中断里
{
/* 注释一:
* 独立按键连续加速扫描的过程:
* 第一步:每次按下去触发一次单击按键,如果按下去到松手的时间不超过1秒,则不会进入连续加速触发模式。
* 第二步:如果按下去不松手的时间超过1秒,则进入连续加速触发模式。按键触发节奏不断加快,蜂鸣器鸣叫的节奏
* 也不断加快。直到它们都到达一个极限值,然后以此极限值间隔匀速触发。在刚开始加速的时候,按键触发与
* 蜂鸣器触发的步骤是一致的,等它们任意一个达到极限值的时候,急促的声音跟按键的触发不一致,并不是
* 蜂鸣器每叫一次,按键就触发一次。实际上加速到最后,按键触发的速度远远比蜂鸣器的触发速度快。
*/
if(key_sr1==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
{
ucKeyLock1=0; //按键自锁标志清零
uiKeyTimeCnt1=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。
uiKeyCtntyCnt1=0; //按键连续加速的时间间隔延时计数器清零
uiSynCtntyCnt1=0; //蜂鸣器连续加速的时间间隔延时计数器清零
uiCtntyTimeSet1=const_initial_set; //按键每次触发的时间间隔初始值,这数值不断变小,导致速度不断加快
uiCtntySynSet1=const_initial_set; //同步声音的时间间隔初始值,这数值不断变小,导致鸣叫的节奏不断加快
}
else if(ucKeyLock1==0)//有按键按下,且是第一次被按下
{
uiKeyTimeCnt1++; //累加定时中断次数
if(uiKeyTimeCnt1>const_key_time1)
{
uiKeyTimeCnt1=0;
ucKeyLock1=1; //自锁按键置位,避免一直触发
ucCtntyFlag1=0; //连续加速触发模式标志位 0代表单击 1代表连续加速触发
ucKeySec=1; //触发1号键
}
}
else if(uiKeyTimeCnt1 { uiKeyTimeCnt1++; } else //按住累加到1秒后仍然不放手,这个时候进入有节奏的连续加速触发 { uiKeyCtntyCnt1++; //按键连续触发延时计数器累加 //按住没松手,每隔一段uiCtntyTimeSet1时间按键就触发一次,而且uiCtntyTimeSet1不断减小,速度就越来越快 if(uiKeyCtntyCnt1>uiCtntyTimeSet1) { if(uiCtntyTimeSet1>const_min_level) { uiCtntyTimeSet1=uiCtntyTimeSet1-const_sub_dt; //uiCtntyTimeSet1不断减小,速度就越来越快 } else { uiCtntyTimeSet1=const_last_min_set; //uiCtntyTimeSet1不断减小,到达一个极限值 } uiKeyCtntyCnt1=0; ucCtntyFlag1=1; //进入连续加速触发模式 ucKeySec=1; //触发1号键 } uiSynCtntyCnt1++; //蜂鸣器连续触发延时计数器累加 //按住没松手,每隔一段uiCtntySynSet1时间蜂鸣器就触发一次,而且uiCtntySynSet1不断减小,鸣叫的节奏就越来越快 if(uiSynCtntyCnt1>uiCtntySynSet1) { uiCtntySynSet1=uiCtntySynSet1-const_sub_dt; //uiCtntySynSet1不断减小,鸣叫的节奏就越来越快 if(uiCtntySynSet1 { uiCtntySynSet1=const_syn_min_level; //uiCtntySynSet1不断减小,达到一个极限值 } uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。 uiSynCtntyCnt1=0; } } if(key_sr2==1) { ucKeyLock2=0; uiKeyTimeCnt2=0; uiKeyCtntyCnt2=0; uiSynCtntyCnt2=0; uiCtntyTimeSet2=const_initial_set; uiCtntySynSet2=const_initial_set; } else if(ucKeyLock2==0) { uiKeyTimeCnt2++; if(uiKeyTimeCnt2>const_key_time2) { uiKeyTimeCnt2=0; ucKeyLock2=1; ucCtntyFlag2=0; ucKeySec=2; } } else if(uiKeyTimeCnt2 { uiKeyTimeCnt2++; } else { uiKeyCtntyCnt2++; if(uiKeyCtntyCnt2>uiCtntyTimeSet2) { if(uiCtntyTimeSet2>const_min_level) { uiCtntyTimeSet2=uiCtntyTimeSet2-const_sub_dt; } else { uiCtntyTimeSet2=const_last_min_set; } uiKeyCtntyCnt2=0; ucCtntyFlag2=1; ucKeySec=2;
独立按键加速匀速触 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)