本次代码块主要是用于处理按键操作如短按长按按几次。/*这些宏以实际情况进行定义本人的按键处理函数每20ms处理一次*/ #define LONG_PRESS 25 //长按按键计时 #define SHORT_PRESS 3 //短按按键计时 #define SHORT_LOOSE 3 //短暂松开按键计时 #define LONG_LOOSE 15 //长时间松开按键计数 #define READ_BOTTON() RB3 //读取IO口RB3的状态 volatile unsigned char s_KeyUp_count 0; //按键松开计时 volatile unsigned char s_KeyDown_count 0; //按键按下计时 volatile unsigned char g_LongPressFlag 0; //长按按键标志位 volatile unsigned char g_ShortPressFlag 0; //短按按键标志位 volatile unsigned char s_KeyShortNum 0; //短按次数 /* 按键处理函数 */ void Key_Handle(void) { if(0 READ_BOTTON()) //识别到RB3电平为0按键按下 { if(s_KeyDown_count LONG_PRESS) { // } else { s_KeyDown_count;//按键按下时间计数 //短按 if(s_KeyDown_count SHORT_PRESS) { s_KeyUp_count 0; } if(s_KeyDown_count LONG_PRESS)//长按 { g_LongPressFlag 1; } } } else { if(s_KeyUp_count LONG_LOOSE) { } else { s_KeyUp_count; //按键松开时间计数 if(s_KeyUp_count SHORT_LOOSE) { if((s_KeyDown_count SHORT_PRESS) (s_KeyDown_count LONG_PRESS)) { s_KeyShortNum; } g_LongPressFlag 0; s_KeyDown_count 0; } if(s_KeyUp_count LONG_LOOSE) { if(1 s_KeyShortNum) { //短按一次处理事件1 } else if(2 s_KeyShortNum) { //短按两次处理事件2 } s_KeyShortNum 0; } } } }
简易按键处理函数
本次代码块主要是用于处理按键操作如短按长按按几次。/*这些宏以实际情况进行定义本人的按键处理函数每20ms处理一次*/ #define LONG_PRESS 25 //长按按键计时 #define SHORT_PRESS 3 //短按按键计时 #define SHORT_LOOSE 3 //短暂松开按键计时 #define LONG_LOOSE 15 //长时间松开按键计数 #define READ_BOTTON() RB3 //读取IO口RB3的状态 volatile unsigned char s_KeyUp_count 0; //按键松开计时 volatile unsigned char s_KeyDown_count 0; //按键按下计时 volatile unsigned char g_LongPressFlag 0; //长按按键标志位 volatile unsigned char g_ShortPressFlag 0; //短按按键标志位 volatile unsigned char s_KeyShortNum 0; //短按次数 /* 按键处理函数 */ void Key_Handle(void) { if(0 READ_BOTTON()) //识别到RB3电平为0按键按下 { if(s_KeyDown_count LONG_PRESS) { // } else { s_KeyDown_count;//按键按下时间计数 //短按 if(s_KeyDown_count SHORT_PRESS) { s_KeyUp_count 0; } if(s_KeyDown_count LONG_PRESS)//长按 { g_LongPressFlag 1; } } } else { if(s_KeyUp_count LONG_LOOSE) { } else { s_KeyUp_count; //按键松开时间计数 if(s_KeyUp_count SHORT_LOOSE) { if((s_KeyDown_count SHORT_PRESS) (s_KeyDown_count LONG_PRESS)) { s_KeyShortNum; } g_LongPressFlag 0; s_KeyDown_count 0; } if(s_KeyUp_count LONG_LOOSE) { if(1 s_KeyShortNum) { //短按一次处理事件1 } else if(2 s_KeyShortNum) { //短按两次处理事件2 } s_KeyShortNum 0; } } } }