STM8学习笔记----按键中断

今天学习按键中断。


根据青风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次。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值