- 打卡等级:偶尔看看III
- 打卡总天数:38
- 最近打卡:2025-04-29 08:28:25
已绑定手机
金牌会员
- 积分
- 1173
|
发表于 2024-12-10 15:24:27
|
显示全部楼层
这是真正项目使用的代码,部分宏定义没有列出,意思一看就明白
enum{
//不可修改
KEY1 = 0x0001,
KEY2 = 0x0002,
KEY3 = 0x0004,
//不可修改
KEY_EVENT__SDOWN = 0x0100, //短按按下
KEY_EVENT__LDOWN = 0x0200, //长按按下
KEY_EVENT__CDOWN = 0x0400, //连按按下
KEY_EVENT__SUP = 0x0800, //短按松开
KEY_EVENT__LUP = 0x1000, //长按松开
KEY_EVENT__CUP = 0x2000, //连按松开
//不可修改
KEY_NUM__ANY = (KEY1+KEY2+KEY3),
KEY_EVENT__DOWN = KEY_EVENT__SDOWN+KEY_EVENT__LDOWN+KEY_EVENT__CDOWN,
KEY_EVENT__UP = KEY_EVENT__SUP+KEY_EVENT__LUP+KEY_EVENT__CUP,
KEY_EVENT__ALL = KEY_EVENT__DOWN+KEY_EVENT__UP,
//_______________________________________
//指定按键事件
KEY1_SDOWN = (KEY1+KEY_EVENT__SDOWN),
KEY1_SUP = (KEY1+KEY_EVENT__SUP),
KEY1_LDOWN = (KEY1+KEY_EVENT__LDOWN),
KEY1_LUP = (KEY1+KEY_EVENT__LUP),
KEY2_SDOWN = (KEY2+KEY_EVENT__SDOWN),
KEY2_LDOWN = (KEY2+KEY_EVENT__LDOWN),
KEY2_LUP = (KEY2+KEY_EVENT__LUP),
KEY2_CDOWN = (KEY2+KEY_EVENT__CDOWN),
KEY2_SUP = (KEY2+KEY_EVENT__SUP),
KEY3_SDOWN = (KEY3+KEY_EVENT__SDOWN),
KEY3_LDOWN = (KEY3+KEY_EVENT__LDOWN),
KEY3_LUP = (KEY3+KEY_EVENT__LUP),
KEY3_SUP = (KEY3+KEY_EVENT__SUP),
KEY3_CDOWN = (KEY3+KEY_EVENT__CDOWN),
};
#define MS /10u
//请循环调用,建议10MS调用周期
void KEY_Scan(void)
{
Key_Typedef* pKey = &s_stKey;
u32 ulNum=0;
u32 ulTmpEvent = 0;
u32 ulGpio = 0;
pKey->usEventEx = 0;
if (!GPIO_VAL_GET(GPIO_S1))
{
ulGpio = KEY1;
ulNum++;
}
if (GPIO_VAL_GET(GPIO_S2)) //高电平有效
{
ulGpio = KEY2;
ulNum++;
}
if (!GPIO_VAL_GET(GPIO_S3))
{
ulGpio = KEY3;
ulNum++;
}
if (ulNum == 0)
{
//松开
u16 usTmp = pKey->usDeb;
pKey->usDeb = 0;
if (usTmp != 0xffff)
{
if (usTmp > 3000MS)
{
//此项目不需要此按键事件
//ulTmpEvent = pKey->ucBkpGpio + KEY_EVENT__CUP;
}
else
if (usTmp > 1000MS)
{
ulTmpEvent = pKey->usBkpGpio + KEY_EVENT__LUP;
}
else
if (usTmp > 50MS)
{
ulTmpEvent = pKey->usBkpGpio + KEY_EVENT__SUP;
}
}
}
else
if (ulNum > 1)
{
KEY_Hold();
return;
}
else
if (ulNum == 1)
{
//正常按下
if (pKey->usDeb != 0xffff)
{
pKey->usDeb++;
if (pKey->usDeb == 40MS)
{
ulTmpEvent = ulGpio + KEY_EVENT__SDOWN;
}
else
if (pKey->usDeb == 1000MS)
{
ulTmpEvent = ulGpio + KEY_EVENT__LDOWN;
}
else
{
bit bRepeat = (pKey->usDeb >= (3000MS+1000MS/5))?1:0;
if (bRepeat || pKey->usDeb == 3000MS)
{
ulTmpEvent = ulGpio + KEY_EVENT__CDOWN;
if (bRepeat)
{
pKey->usDeb = 3000MS + 1;
}
}
}
}
}
if (ulTmpEvent)
{
pKey->usBkpGpio = ulTmpEvent & KEY_NUM__ANY;
pKey->usEventEx = ulTmpEvent;
}
}
u32 KEY_GetEx(void)
{
return s_stKey.usEventEx;
}
//判断按键的代码必须每个循环周期调用,以确保同步
if (KEY_GetEx() == KEY1_SUP)
{
MF_Set2New(MF_INDEX__MENU0);
} |
|