整体思路:现在有4个按键
写一个获取按键值的函数,把函数放在定时器中,每10ms进行一次采集,采集到的按键值进行各种操作(不要太复杂,一般只加入某些变量和标志位的修改 以及一些条件判断),按键值在松开按键后进行清零。
工程文件结构
gpio.c 获取按键值
tim.c 每10ms进行一次按键处理程序
user.c 按键处理程序
main.c 各种函数运行包括按键处理程序
代码文件
gpio.c
/* USER CODE BEGIN 2 */
uint8_t key_val,key_val_last ,flag_shuangJi;
uint8_t get_key (){
static uint16_t key_count ;
static uint16_t shuangJi_count ;
if(!key_count)key_val=0;
if( !key1_io ||!key2_io ||!key3_io ||!key4_io){ //按键按下事件
key_count++;
if( !key1_io) key_val=91;
if( !key2_io) key_val=92;
if( !key3_io) key_val=93;
if( !key4_io) key_val=94;
// printf("OK\r\n");
}
/*双击*/
if(flag_shuangJi) shuangJi_count ++;
if(shuangJi_count>60 ){
shuangJi_count=flag_shuangJi=0;
}
if(key_count<=2 && key1_io &&key2_io &&key3_io &&key4_io) key_count= key_val=0;//抖动事件
else if(key_count>2 && key1_io &&key2_io &&key3_io &&key4_io){//按键松开事件
if(key_count<100){ //短按
switch (key_val)
{
case 91:key_val =1;
break;
case 92:key_val =2;
break;
case 93:key_val =3;
break;
case 94:key_val =4;
break;
}
/*双击*/
if(key_val_last!=key_val){ //
flag_shuangJi =shuangJi_count=0;
}
if(key_val_last==key_val && shuangJi_count<60 && flag_shuangJi==1){ //双击按键第二次按下
switch (key_val)
{
case 1:key_val =21;
break;
case 2:key_val =22;
break;
case 3:key_val =23;
break;
case 4:key_val =24;
break;
}
flag_shuangJi =shuangJi_count=0;
}
else if(!flag_shuangJi) { //双击按键第一次按下
flag_shuangJi =1;
key_val_last = key_val ; //记录
}
}
/**/
if(key_count>200){ //长按
switch (key_val)
{
case 91:key_val =11;
break;
case 92:key_val =12;
break;
case 93:key_val =13;
break;
case 94:key_val =14;
break;
}
}
// printf("key:%d,%d\r\n",flag_shuangJi,shuangJi_count);
key_count= 0;
}
return key_val;
}
/* USER CODE END 2 */
user.c 注意删改
void key_run ()
{
/*0:数据 1 :参数 2:统计*/
// printf("key:%d\r\n",key_val);
switch ( get_key())
{
case 1:flag.lcd++;
LCD_Clear(Black);
break;
case 2:if(!flag.lcd && !flag.tim_5s){
flag.M_H^=1;
value.NN++;
value.tim_5s_count=tim4_count=0;
flag.tim_5s = 1;
}
if(flag.lcd==1){
flag.R_K^=1;
}
break;
case 3:(!flag.R_K)?(value.RR++):(value.KK++);
break;
case 4:if(flag.lcd==1)(!flag.R_K)?(value.RR--):(value.KK--);
if(!flag.lcd)flag.shuo_ding=0;
break;
case 14:flag.shuo_ding=1;
break;
}
if(flag.lcd==3)flag.lcd=0;
if(flag.tim_5s){
value.tim_5s_count ++;
// printf("OK");
if(value.tim_5s_count>=500)flag.tim_5s=value.tim_5s_count =0;
}
// printf("tim:%d,%d\r\n",value.tim_5s_count,flag.tim_5s);
}
tim.c
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==&htim4){
key_run();
tim4_count ++ ;
if(tim4_count>=60000)tim4_count=0;
}
}
文章只提供思路,代码没有黏贴完成