按键连续点击的c语言程序,长按键C语言程序
長(zhǎng)按鍵C語言程序
zhchxgh | 2009-07-04 01:46:51 ?? 閱讀:8246
發(fā)布文章
一共用了四個(gè)按鈕.
#define?_KEYDOWN_TEST_TIME??????(20)
unsigned?char?IsKeyDown(volatile?unsigned?char?Value,?unsigned?char?pin)
{
unsigned?long?CurState?=?0,?i;
for(i?=?0;?i?
CurState?+=?_GET_BIT(Value,?pin)??0:1;?????//鍵盤接了上拉電阻,低電平才是按下
if(CurState?==?_KEYDOWN_TEST_TIME)
return?1;
return?0;
}
//以下所有值均是以?DealWithKey函數(shù)的調(diào)用頻率為基礎(chǔ)的,該頻率是定時(shí)器2的定時(shí)值決定的
//短按鍵的計(jì)數(shù)值,只有當(dāng)按鍵檢測(cè)計(jì)數(shù)器計(jì)數(shù)大于等于此值時(shí)才認(rèn)為是一次短按
#define?_KEY_SHORT_CNTR?????????????(2)
//長(zhǎng)按鍵的計(jì)數(shù)值,只有當(dāng)按鍵檢測(cè)計(jì)數(shù)器計(jì)數(shù)大于等于此值時(shí)才認(rèn)為是一次長(zhǎng)按
#define?_KEY_LONG_CNTR??????????????(_KEY_SHORT_CNTR?*?3)
//無按鍵按下時(shí)的按鍵檢測(cè)間隔,用于按鍵消抖動(dòng)
#define?_KEY_NORMAL_DEVIDER?????????(2)
//此值用于按鈕長(zhǎng)按后,按鈕檢測(cè)函數(shù)的執(zhí)行頻率
#define?_ADDMIN_FAST_DEVIDER????????(15)
//此值用于按鈕短按后,按鈕檢測(cè)函數(shù)的執(zhí)行頻率
#define?_ADDMIN_LONG_DEVIDER????????(_ADDMIN_FAST_DEVIDER?*?3)
//此值用于設(shè)置蜂鳴器鳴響時(shí)間
#define?_BEEPER_DEVIDER?????????????(10)
void?DealWithKey(void)
{
static?unsigned?int?AddCntr?=?0;
static?unsigned?int?MinCntr?=?0;
static?unsigned?int?UnitCntr?=?0;
static?unsigned?int?RunCntr?=?0;
static?unsigned?char?BeepCntr?=?0;
static?unsigned?int?DevCntr?=?0;
static?unsigned?char?LastRunState?=?0;
unsigned?char?temp;
if(g_State?!=?Setting)??//運(yùn)行狀態(tài),?所有按鍵都無效
return;
if(BeepCntr?>?0)????????//處理蜂鳴器
--BeepCntr;
else
_BEEPER_OFF;
if(DevCntr)???????????//按鍵處理分頻器
{
--DevCntr;
return;
}
//這個(gè)按鈕是可以重復(fù)進(jìn)入的,?長(zhǎng)按后先低頻率動(dòng)作,?當(dāng)動(dòng)作幾次后再高頻率動(dòng)作
AddCntr?=?IsKeyDown(_PIN(_TO_KEY_ADD),?_KEY_ADD)??AddCntr?+?1?:?0;
if((temp?=?(AddCntr?>=?_KEY_LONG_CNTR))?||?AddCntr?>=?_KEY_SHORT_CNTR)
{
...
}
//同上
MinCntr?=?IsKeyDown(_PIN(_TO_KEY_MIN),?_KEY_MIN)??MinCntr?+?1?:?0;
if((temp?=?(MinCntr?>=?_KEY_LONG_CNTR))?||?MinCntr?>=?_KEY_SHORT_CNTR)
{
...
}
//這個(gè)按鈕是不可重復(fù)進(jìn)入的,?就是說只有抬起后再按下才動(dòng)作
UnitCntr?=?IsKeyDown(_PIN(_TO_KEY_UNIT),?_KEY_UNIT)??UnitCntr?+?1?:?0;
if(UnitCntr?==?_KEY_SHORT_CNTR)
{
...
}
else?if(UnitCntr?>?_KEY_SHORT_CNTR)
{
UnitCntr?=?_KEY_SHORT_CNTR?+?1;?//禁止重復(fù)執(zhí)行
}
//這個(gè)按鈕是要在按鈕抬起后才執(zhí)行其他函數(shù)的
if(IsKeyDown(_PIN(_TO_KEY_RUN),?_KEY_RUN))
{
++RunCntr;
}
else
{
RunCntr?=?0;
if(LastRunState)????????????//表明鍵已經(jīng)按下后才抬起的
{
LastRunState?=?0;
g_State?=?EmptyInflatting;
}
}
if(RunCntr?==?_KEY_SHORT_CNTR)
{
BeepCntr?=?_BEEPER_DEVIDER;
_BEEPER_ON;
LastRunState?=?1;???????//此鍵是抬起時(shí)生效.
}
else?if(RunCntr?>?_KEY_SHORT_CNTR)
{
RunCntr?=?_KEY_SHORT_CNTR?+?1;??//禁止重復(fù)執(zhí)行
}
DevCntr?=?_KEY_NORMAL_DEVIDER;
}
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。
參與討論
請(qǐng)登錄...
登錄后參與討論
總結(jié)
以上是生活随笔為你收集整理的按键连续点击的c语言程序,长按键C语言程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js 判断是否为空对象,或者空数组
- 下一篇: 程序员神器!