STM32使用外部中断进行按键检测方法
各种按键处理逻辑程序。
https://blog.51cto.com/u_13719208/2107561https://blog.51cto.com/u_13719208/2107561
简单方法:
1、清中断标志位
2、禁止EXTI中断
3、点亮LED
4、使能EXTI中断
高级方法:
检测按键,可以用定时扫描的方法。
按下按键
这个一般不用EXIT中断。 因为按下一次其实会有下降沿 上升沿 还有中间的毛刺。产生几次正常。
要解决好这个问题最好用定时中断(10毫米)。定时中断里面检测下降沿 上升沿 多测几次滤除毛刺。
定时中断里:
{
static uint8_t Key_IO_stats=0;
static uint8_t Key_IO_Oldstats=0;
Key_IO_stats <<=1;
if(Key_IO)
Key_IO_stats +=1;
}
你只需要在程序的某个地方检测Key_IO_stats
这里还要记住上次的状态
如果是变为0xFF 那就是变高了
if((Key_IO_stats0xff)&&(Key_IO_Oldstats0))
{
Key_IO_Oldstats=0xff;
}
如果是变为0 那就是变低了
if((Key_IO_stats0)&&(Key_IO_Oldstats0xff))
{
Key_IO_Oldstats=0;
}
其他时候就是正在检测中(8次检测过滤 8次连续为1才为高,8次连续第才为低,其他的都不算。检测次数可以调整 )
2 给你个鼠标按键按下、弹起,上下双沿检测程序,单次响应,逻辑稍微复杂一点。一般用的都比这简单。
typedef struct
{
unsigned LDOWN :6;
unsigned LDEN :1;
unsigned LDOWN7 :1;
unsigned LUP :6;
unsigned LUEN :1;
unsigned LUP7 :1;
unsigned RDOWN :6;
unsigned RDEN :1;
unsigned RDOWN7 :1;
unsigned RUP :6;
unsigned RUEN :1;
unsigned RUP7 :1;
}Mouse_Key;
extern Mouse_Key MsKey;
void Button_Process(void)
{
if(BUTTON_IsPressed(PS2_BUTTON_LEFT) == true)
{
LED_On(LED_D3);
if (MsKey.LDEN == 1)
{
if (MsKey.LDOWN >= 5)
{
MsKey.LDOWN7 = 1;
MsKey.LDEN = 0;
MsKey.LUEN = 1;
}
else
{
MsKey.LDOWN++;
}
}
MsKey.LUP = 0;
}
else
{
LED_Off(LED_D3);
MsKey.LDOWN = 0;
if (MsKey.LUEN == 1)
{
if (MsKey.LUP >= 5)
{
MsKey.LUP7 = 1;
MsKey.LUEN = 0;
MsKey.LDEN = 1;
}
else
{
MsKey.LUP++;
}
}
}
if(BUTTON_IsPressed(PS2_BUTTON_RIGHT) == true)
{
LED_On(LED_D4);
if (MsKey.RDEN == 1)
{
if (MsKey.RDOWN >= 5)
{
MsKey.RDOWN7 = 1;
MsKey.RDEN = 0;
MsKey.RUEN = 1;
}
else
{
MsKey.RDOWN++;
}
}
MsKey.RUP = 0;
}
else
{
LED_Off(LED_D4);
MsKey.RDOWN = 0;
if (MsKey.RUEN == 1)
{
if (MsKey.RUP >= 5)
{
MsKey.RUP7 = 1;
MsKey.RUEN = 0;
MsKey.RDEN = 1;
}
else
{
MsKey.RUP++;
}
}
}
}
MsKey.LDOWN7,MsKey.LUP7,MsKey.RDOWN7, MsKey.RUP7,4个标志位在主程序中处理完才清除。