外部中断应用:按键
中断按键原理
- 在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内语句,让程序不结束 }
本文来自博客园,作者:无术师,转载请注明原文链接:https://www.cnblogs.com/artlessist/p/18560252
本文使用知识共享4.0协议许可 CC BY-NC-SA 4.0
特别说明版权归属的文章以及不归属于本人的转载内容(如引用的文章与图片)除外
浙公网安备 33010602011771号