外部中断应用:按键

中断按键原理

  • https://www.cnblogs.com/untit1ed/p/18560244用软件查询实现按键功能的程序设计中,程序不停地检测按键状态而不能进行其它操作,造成了工作效率的降低与资源的浪费
  • 利用中断实现该功能,只在按键产生中断触发信号时执行中断服务程序中的按键程序,以此节约资源

代码实现

  • 设置PA组为按键,当按下时以改变LED状态为现象

  • 配置按键及其中断触发参数

    void IO_interrupt_Init(void)//触发参数配置函数
    {
    	//配置PA3,PA4,PA5,PA6这些与按键相连的端口
      //具体配置哪些端口请看你所用开发板的原理图中,哪些端口与“独立按键”相连
    	PA_DDR = 0x87;		//配置为0输入模式            
    	PA_CR1 = 0x78;		//寄存器1配置为1启用上拉输入
    	PA_CR2 = 0x78;		//寄存器2配置为1启用中断
      
      //配置中断触发参数
    	//端口A对应控制位PAIS[1:0],按下按键为电平变化为高至低电平
      EXTI_CR1 = 0x02;//0000 0010;配置为10下降沿触发
      //控制端口A的中断源EXTI0的向量号为3,因此要配置VECT3SPR[1:0]
      ITC_SPR1 = 0xC0;//1100 0000;   11配置为最高级
    }   
    
  • 中断服务函数

    STM8单片机的GPIO中断通常是共用一个向量入口,这意味着当任何一个GPIO引脚产生中断时,程序都会跳转到同一个中断服务函数,如果需要检测连接到同一组GPIO端口的按键具体是哪一个被按下,可以在中断服务函数中进行轮询

    #pragma vector = 0x05//EXTI0中断号为3,偏移2得5
    __interrupt void PortA_LED_IRQHandler()//中断服务函数
    {
      delay(50);//消抖
      //将PA_IDR_IDR3这些寄存器通过宏定义命名为key0方便使用
      if(key0==0){
    	led0 = ~led0;	//LED0状态取反
    	}
      if(key1==0){
    	//轮询法检测按下的是哪个按键,其下省略
    	}
    }
    
  • 主函数

    int main( void )//主函数
    {
      GPIO_LED_init();
      IO_interrupt_Init();
      asm("rim");//将main程序优先级降为0,开启总中断
      while(1);//在没有发生中断时,程序将一直执行while内语句,让程序不结束
    }
    

posted on   无术师  阅读(30)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?

统计

点击右上角即可分享
微信分享提示