#define HAVEKEY_PIN 0x0003 //
#define KEYPOP 0x0000
#define KEY_START_PRESSED 1 //
typedef struct
{
INT8U bLastValue; //
INT8U bDebunceTime; //
INT8U bPressed; //
INT8U bValue; //
INT8U bState; //
} tKEY;
1. 按键IO口配置
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_KEY_PORT, ENABLE);
GPIO_InitStruct.GPIO_Pin = PAUSE_KEY_PIN | CLEAR_KEY_PIN ;//| ENTER_KEY_PIN | SET_KEY_PIN ;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; //GPIO_Mode_AF,GPIO_Mode_OUT
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_Level_2;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIO_KEY_PORT, &GPIO_InitStruct);
memset( &KeyCtrl,0,sizeof(tKEY));
}
2. 按键debunce时间,在timer里调用
void KeyCtrlbDebunceTimeDec(void)
{
if(KeyCtrl.bDebunceTime)
{
KeyCtrl.bDebunceTime--;
}
else
{
KeyCtrl.bDebunceTime = 20;
}
}
3. 扫描按键
INT8U KeyScan(u8 *bKeyValue)
{
int TempKeyIn;
TempKeyIn = GPIO_ReadInputData(GPIO_KEY_PORT);
TempKeyIn = GPIO_ReadInputData(GPIO_KEY_PORT) & HAVEKEY_PIN; //get high 8 bit
TempKeyIn = (TempKeyIn ^ 0xffff) & HAVEKEY_PIN;
if(TempKeyIn == 0x0000) //no key pressed
{
memset( &KeyCtrl,0,sizeof(tKEY));
return NOKEY_PRESSED;
}
else
{
if(KeyCtrl.bState != KEY_START_PRESSED) //start key pressed
{
KeyCtrl.bState = KEY_START_PRESSED;
KeyCtrl.bDebunceTime = 20; //10ms
return NOKEY_PRESSED;
}
else
{
if(TempKeyIn == KeyCtrl.bLastValue) //lastkey
{
return NOKEY_PRESSED;
}
else
{
if(KeyCtrl.bDebunceTime !=0) //debunce time? 10ms
{
return NOKEY_PRESSED;
}
else
{
KeyCtrl.bLastValue = TempKeyIn;
KeyCtrl.bValue = TempKeyIn;
*bKeyValue = TempKeyIn;
return KEY_PRESSED;
}
}
}
}
}
4. 按键处理
void KeyPro(void)
{
u8 KeyValue;
if(KeyScan(&KeyValue) == KEY_PRESSED)
{
if(KeyValue == CLEAR_KEY)
{
ExtiCnt = 0;
}
else if(KeyValue == PAUSE_KEY)
{
PauseFlag = ~PauseFlag;
}
}
}
设计资源 培训 开发板 精华推荐
- 使用 ON Semiconductor 的 LA5724M 的参考设计
- 使用 ROHM Semiconductor 的 BU4910 的参考设计
- TRK-S12ZVFP64: 适用于暖通空调(HVAC)应用的S12 MagniV
- NCP1611GEVB,NCP1611 160 W 宽电源、PFC 级控制器的评估板
- USB拓展坞
- LT1307CMS8 外部控制突发模式操作的典型应用电路
- NCP133AMXADJTCGEVB:NCP133 XDFN-4 评估板 ADJ
- LTC2610CUFD 八通道、14 位数模转换器的典型应用
- CPU复位电路AZ7031ZTR电压检测器典型应用电路
- 基于BlueNRG-M2SA模块的评估平台