今天学习按键中断。
根据青风STM8开发板,编写key_exti.h头文件如下:
#ifndef __KEY_EXTI_H
#define __KEY_EXTI_H
#include "stm8s.h"
#define KEY1_PIN GPIO_PIN_0
#define KEY2_PIN GPIO_PIN_4
#define KEY3_PIN GPIO_PIN_3
#define KEY1_PORT GPIOI
#define KEY2_PORT GPIOE
#define KEY3_PORT GPIOE
BitStatus KEY_Down(GPIO_TypeDef* GPIOx,GPIO_Pin_TypeDef GPIO_Pin); //用于判断哪个按键被按下
void EXIT_KEY_Init(void);
#endif
再编写key_exti.c文件如下:
#include "key_exti.h"
#include "stm8s_gpio.h"
#include "stm8s_exti.h"
void EXIT_KEY_Init(void)
{
GPIO_Init(KEY1_PORT,KEY1_PIN,GPIO_MODE_IN_PU_NO_IT );//key1管脚没有中断功能
GPIO_Init(KEY2_PORT,KEY2_PIN,GPIO_MODE_IN_PU_IT );/key2、key3管脚初始化为上拉输入带中断功能
GPIO_Init(KEY3_PORT,KEY3_PIN,GPIO_MODE_IN_PU_IT );
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOE, EXTI_SENSITIVITY_FALL_ONLY);//设置外部中断触发方式为下降沿触发
}
void Delay(uint32_t temp)
{
for(; temp!= 0; temp--);
}
BitStatus KEY_Down(GPIO_TypeDef* GPIOx,GPIO_Pin_TypeDef GPIO_Pin)
{
/*检测是否有按键按下 */
if( GPIO_ReadInputPin(GPIOx,GPIO_Pin) == 0 )
{
/*延时消抖*/
Delay(10000);
if(GPIO_ReadInputPin(GPIOx,GPIO_Pin)==0)
{
/*等待按键释放 */
while(GPIO_ReadInputPin(GPIOx,GPIO_Pin)==0);
return 0;
}
else
return 1;
}
else
return 1;
}
主函数如下:
#include "stm8s.h"
#include "stm8s_clk.h"
#include "led.h"
#include "key_exti.h"
int main(void)
{
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); //设置系统时钟
LED_Init();
LED1_Close();
LED2_Close();
LED3_Close(); //初始化LED灯
/*config key*/
EXIT_KEY_Init(); //初始化外部中断按键
__enable_interrupt(); //使能外部中断
while(1)
{
}
}
最后,在stm8s_interrupt.c文件中编写中断处理函数如下:
#pragma vector=9
__interrupt void EXTI_PORTE_IRQHandler(void)
{
if (KEY_Down(KEY2_PORT,KEY2_PIN)==0)
{
LED2_Toggle(); Delay(100000);
LED2_Toggle(); Delay(100000);
LED2_Toggle(); Delay(100000);
LED2_Toggle(); Delay(100000);
LED2_Toggle(); Delay(100000);
}
if (KEY_Down(KEY3_PORT,KEY3_PIN)==0)
{
LED3_Toggle(); Delay(100000);
LED3_Toggle(); Delay(100000);
LED3_Toggle(); Delay(100000);
LED3_Toggle(); Delay(100000);
LED3_Toggle(); Delay(100000);
}
}
青风的源码不能识别那个按键被按下,经过我的改写可以识别不同的按键,key2按键按下则led2闪烁5次,key3按键按下则led3闪烁5次。