第一步:初始化GPIO口(该初始化基于STM32F412单片机开发,该按键程序在其他stm32f单片机上使用只需修改GPIO口初始化)
GPIO_InitTypeDef GPIO_InitStruct;
AHB1_GRP1_EnableClock(AHB1_GRP1_PERIPH_GPIOB);//时钟初始化
GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_6|GPIO_PIN_9;//IO口
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;//IO口模式
GPIO_InitStruct.Pull = GPIO_PULL_UP;
GPIO_Init(GPIOB, &GPIO_InitStruct);
第二步:按键类似位操作读取
u8 B_KEY_JC;
u8 R_KEY_timMax;
vu8 R_KEY_timi;
u8 Key_LB_value;
static u8 Key_LB_i;
static u8 Key_LB_data;
static u8 Key_LB_data_Q;
static u8 Key_LBUnstable_i;
#define KEY_1_RinBit GPIOB->IDR&GPIO_PIN_9==GPIO_PIN_9;
#define KEY_2_RinBit GPIOB->IDR&GPIO_PIN_3==GPIO_PIN_3;
#define KEY_3_RinBit GPIOB->IDR&GPIO_PIN_6==GPIO_PIN_6;
void KEY_Filter_processing(void)
{
Key_LB_data=0;
if(!KEY_1_RinBit)
Key_LB_data |= 0x01;
if(!KEY_2_RinBit)
Key_LB_data |= 0x02;
if(!KEY_3_RinBit)
Key_LB_data |= 0x04;
if(Key_LB_data_Q==Key_LB_data)//如果前后两次按键相同
{
if(Key_LB_i<10)
Key_LB_i++;
else
{
Key_LB_value=Key_LB_data;
Key_LBUnstable_i=0;
}
}
else
{
Key_LB_i=0;
Key_LB_data_Q=Key_LB_data;
if(Key_LBUnstable_i<20)
Key_LBUnstable_i++;
else
Key_LB_value=Key_LB_data;
}
}
第三步:读取按键情况
void Key_scan(void) // uint8
{
// static u8 key_delay=0;//按键去抖动寄存器
// static u8 key_value0=0;//前一次按键值寄存器
static u8 key_value1=0; //按键释放后的按键值寄存器
static u8 key_value2=0; //按键释放后的按键值寄存器
static u8 key_longtime=0;//长按时间累积寄存器1
static u8 key_longtime1=0;//长按时间累积寄存器2
static u8 key_super_longtime=0; //超长按时间累积寄存器
static u8 F_longkey=0;//长按
static u8 F_super_longkey=0;//超长按
static u8 f_onkey=0;
static u8 Key_Hda;
static u8 KEY_data=0;
static u8 B_anxiaOpen_EN=0;
static u8 B_f_onkey=0;
key_value=Key_LB_value;
{
{
if(key_value>0)
{
if(!f_onkey)
{
f_onkey=1;
if(key_value!=key_value2)
{
KEY_data=0;
}
Key_Hda=0;
if(key_value2==KEY_M && KEY_data==4)
{
KEY_data=5;
R_key_5C=KEY_M;
}
if(!B_Key_release)
R_key_anxia=key_value;
key_value1=key_value;
key_value2=key_value;
}
else
{//按键长按
if(key_longtime<15)//
{
key_longtime++;
if(key_value1!=key_value)
{
R_key_anxia=key_value;
key_longtime1=0;
B_anxiaOpen_EN=1;
}
key_value1=key_value;
key_value2=key_value;
}
if(key_value==key_value1 && key_value2==key_value)
{
if(!F_longkey)
{
if(++key_longtime1>=20)
{
key_longtime1=0;//
F_longkey=1;
//长按按键处理程序
KEY_data=0;
if(!B_Key_release)
R_key_keep=key_value;
}
}
else
{
if(!B_Key_release)
R_key_anzhu=key_value1;
if(!F_super_longkey)
{
if(++key_super_longtime>=15)
{
key_super_longtime=0;//
F_super_longkey=1;
//超长按按键处理程序
if(!B_Key_release)
R_key_super_keep=key_value1;
}
}
key_value2=key_value;
}
}
else if((key_value&key_value1)==0)
{
if(F_longkey)
{
if(!B_Key_release)
R_key_anzhuOpen=key_value1;
}
key_longtime=0;
key_longtime1=0;//3????
key_super_longtime=0;
key_value1=key_value;
key_value2=key_value;
}
else if((key_value&key_value1) &&(key_value!=key_value1))
{
key_value2=key_value;
}
}
}
else
{
B_Smoking_mark_Q=0;
key_longtime=0;
key_longtime1=0;
key_super_longtime=0;
if(F_longkey)
{//长按按键释放
KEY_data=0;
F_super_longkey=0;
if(!B_Key_release)
R_key_anzhuOpen=key_value1;
B_f_onkey=0;
}
else if(f_onkey)
{//短按按键释放
B_f_onkey=1;
if(!B_Key_release)
{
if(key_value1>0)
{
if(KEY_data<5)
{
KEY_data++;
}
}
}
if(!B_Key_release && !B_anxiaOpen_EN)
R_key_anxiaOpen=key_value1;
}
if(key_value2>0)
{
if(Key_Hda<15)
{
Key_Hda++;
}
else
{
if(!B_Key_release && B_f_onkey)
{
switch(KEY_data)
{
case 1: R_key_1C=key_value2;break;
case 3: R_key_3C=key_value2;break;
//case 5: R_key_5C=key_value2;break;
}
R_key_XC=key_value2;
R_key_XC_Data=KEY_data;
}
KEY_data=0;
key_value2=0;
}
}
f_onkey=0;
F_longkey=0;
if(!B_Key_release)
R_key_Open=key_value1;
else
{
B_Key_release=0;
KEY_data=0;
}
B_anxiaOpen_EN=0;
key_value1=0;
}
}
}
第四步:按键加减
//加减操作 //xh=0:加减不做循环 xh=1:加减到最大再次按下循环 xh=2:循环
u16 KEY_R_ADD_SUB(u8 *KEY,s16 R,u8 KADD,u8 KSUB,s16 max,s16 min,s8 bu,u8 xh,u8 tim)
{
static u8 B;
if((R==max || R==min)&&xh==1)
{
if(R_key_anxia==KADD || R_key_anxia==KSUB)
B=1;
}
else
{
B=0;
}
if(*KEY==KADD)
{
if(R
{
R+=bu;
R_Bright_screen_Time=R_Bright_screen_TimeMAX;
}
else if(xh)
{
R=min;
}
}
else if(*KEY==KSUB)
{
if(R>min)
{
R-=bu;
R_Bright_screen_Time=R_Bright_screen_TimeMAX;
}
else if(xh)
{
R=max;
}
}
if(R_key_anzhu==KADD)
{
if(!R_KEY_timi)
{
if(R_KEY_timMax>tim)
{
R_KEY_timMax-=5;
}
R_KEY_timi=R_KEY_timMax;
if(R
{
R+=bu;
R_Bright_screen_Time=R_Bright_screen_TimeMAX;
}
else if(xh==2 || B)
{
R=min;
}
}
}
else if(R_key_anzhu==KSUB)
{
if(!R_KEY_timi)
{
if(R_KEY_timMax>tim)
{
R_KEY_timMax-=5;
}
R_KEY_timi=R_KEY_timMax;
if(R>min)
{
R-=bu;
R_Bright_screen_Time=R_Bright_screen_TimeMAX;
}
else if(xh==2 || B)
{
R=max;
}
}
}
else if(!R_key_anzhu)
{
R_KEY_timMax=150;
}
if(R>max)
R=max;
else if(R
R=min;
return R;
}
/*KEY.h*/
extern u8 B_KEY_JC;
extern u8 R_KEY_timMax;
extern vu8 R_KEY_timi;
extern u8 R_key_anxia;
extern u8 R_key_Open;
extern u8 R_key_anxiaOpen;
extern u8 R_key_anzhuOpen;
extern u8 R_key_keep;
extern u8 R_key_super_keep;
extern u8 R_key_1C;
extern u8 R_key_3C;
extern u8 R_key_5C;
extern u8 R_key_XC;
extern u8 R_key_XC_Data;
extern u8 R_key_anzhu;
extern u8 key_value;
extern u8 B_Key_Clean_xC;
extern u8 B_Key_release;
extern u8 B_USB_RinBit;
extern u8 B_USB_Low;
extern u8 B_testing_IC;
extern u16 R_testing_IC_Tim;
extern u8 B_InterfaceGOTO;
typedef enum KEY_bit
{
KEY_M=0x01,
KEY_ADD=0x04,
KEY_SUB=0x02,
KEY_M_ADD=0x05,
KEY_M_SUB=0x03,
KEY_ADD_SUB=0x06,
KEY_NOP=0xFF,
}KEY_bit;