按键连续点击的c语言程序,长按键C语言程序
長按鍵C語言程序
zhchxgh | 2009-07-04 01:46:51 ?? 閱讀:8246
發布文章
一共用了四個按鈕.
#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函數的調用頻率為基礎的,該頻率是定時器2的定時值決定的
//短按鍵的計數值,只有當按鍵檢測計數器計數大于等于此值時才認為是一次短按
#define?_KEY_SHORT_CNTR?????????????(2)
//長按鍵的計數值,只有當按鍵檢測計數器計數大于等于此值時才認為是一次長按
#define?_KEY_LONG_CNTR??????????????(_KEY_SHORT_CNTR?*?3)
//無按鍵按下時的按鍵檢測間隔,用于按鍵消抖動
#define?_KEY_NORMAL_DEVIDER?????????(2)
//此值用于按鈕長按后,按鈕檢測函數的執行頻率
#define?_ADDMIN_FAST_DEVIDER????????(15)
//此值用于按鈕短按后,按鈕檢測函數的執行頻率
#define?_ADDMIN_LONG_DEVIDER????????(_ADDMIN_FAST_DEVIDER?*?3)
//此值用于設置蜂鳴器鳴響時間
#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)??//運行狀態,?所有按鍵都無效
return;
if(BeepCntr?>?0)????????//處理蜂鳴器
--BeepCntr;
else
_BEEPER_OFF;
if(DevCntr)???????????//按鍵處理分頻器
{
--DevCntr;
return;
}
//這個按鈕是可以重復進入的,?長按后先低頻率動作,?當動作幾次后再高頻率動作
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)
{
...
}
//這個按鈕是不可重復進入的,?就是說只有抬起后再按下才動作
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;?//禁止重復執行
}
//這個按鈕是要在按鈕抬起后才執行其他函數的
if(IsKeyDown(_PIN(_TO_KEY_RUN),?_KEY_RUN))
{
++RunCntr;
}
else
{
RunCntr?=?0;
if(LastRunState)????????????//表明鍵已經按下后才抬起的
{
LastRunState?=?0;
g_State?=?EmptyInflatting;
}
}
if(RunCntr?==?_KEY_SHORT_CNTR)
{
BeepCntr?=?_BEEPER_DEVIDER;
_BEEPER_ON;
LastRunState?=?1;???????//此鍵是抬起時生效.
}
else?if(RunCntr?>?_KEY_SHORT_CNTR)
{
RunCntr?=?_KEY_SHORT_CNTR?+?1;??//禁止重復執行
}
DevCntr?=?_KEY_NORMAL_DEVIDER;
}
*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。
參與討論
請登錄...
登錄后參與討論
總結
以上是生活随笔為你收集整理的按键连续点击的c语言程序,长按键C语言程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js 判断是否为空对象,或者空数组
- 下一篇: 程序员神器!