5.2 SW1控制LED1亮灭(中断功能)

发布者:平和宽容最新更新时间:2024-08-01 来源: cnblogs关键字:中断功能 手机看文章 扫描二维码
随时随地手机看文章

中断:CPU收到中断请求后暂停正在执行的程序,而去执行中断服务函数中的程序,处理结束后,继续执行原来的程序。


能够产生中断请求的中断源如下:

CC2530中断设置步骤:使能端口组中断(IEN)——端口组中具体端口中断使能/禁止(PxIEN)——设置中断触发方式PICTL——使能系统总中断(EA)

下文按此思路展开:

1、使能端口组中断

IEN2|=0x10;    //10000,设置IEN2的第4位,使能P1端口组中断

2、使能具体端口中断

P1IEN|=0x04;    //0100,P1_2口中断

3、设置中断触发方式

PICTL|=0x02;   //P_3到P1_1下降沿触发中断,SW1按下,电平由高变低

4、使能总中断

EA=1;    

要想使用中断功能,必须使能中断总开关EA,并且使能各个中断源的自身控制开关IEN。

具体寄存器详情如下:

中断服务函数格式:以P1为例。函数体不能带有参数,也不能有返回值

#pragma vector=P1INT_VECTOR

__interrupt void P1_INT(void) //注意,interrupt前是两个_

{

  /*处理程序*/

}


中断向量名如下:可查看ioCC2530.h头文件内容

中断标志位:中断源很多,需要识别触发中断的中断源。

P0、P1、P2端口组的中断标志位分别是P0IF、P1IF、P2IF。

P1_2连接着SW1按键,按键按下P1IF值变为1,CPU就去执行P1的中断服务函数。标志位不能自动复位,需要手动清除该中断标志位。

  P1IF=0;  //清除P1端口组中断标志位

具体是P1中哪一个针脚引起的中断,可以通过PxIFG寄存器的值来判断。当然也需要手动清除具体的针脚标志位(在中断服务函数中)。

  P1IFG&0x04     //判断P1_2的中断标志位是否为1

  P1IFG &=~ 0x04;   //清除P1_2的中断标志位

清除过程,先小再大。即先关局部再关总闸。


#include 'ioCC2530.h'


#define  LED1   P1_0


/*==================端口初始化函数=====================*/

void Init_Port()

{

  //将P1_0设置为通用I/O端口功能

  P1SEL &= ~0x01;   

  //将P1_0的端口传输方式设置为输出

  P1DIR |= 0x01;   

  LED1 = 0;

}

/*===============外部中断初始化函数==================*/

void Init_INTP()

{

  IEN2 |= 0x10;         //端口1中断使能

  P1IEN |= 0x04;        //端口P1_2外部中断使能

  PICTL |= 0x02;        //端口P1_0到P1_3下降沿触发 

  EA = 1;               //使能总中断

}

/*================外部中断1服务函数====================*/

#pragma vector = P1INT_VECTOR     //外部中断1的向量入口

__interrupt void Int1_Sevice()

{

  LED1 = ~LED1;

/*先清除引脚标志位,再清除端口组标志位,否则会一直进入中断*/

  P1IFG &= ~ 0x04;        //清除P1_2引脚的标志位

  P1IF = 0;               //清除P1端口组的标志位

}

/*====================主函数==========================*/

void main()

{

  Init_Port();          //初始化通用I/O端口

  Init_INTP();          //初始化外部中断

}


关键字:中断功能 引用地址:5.2 SW1控制LED1亮灭(中断功能)

上一篇:1、CC2530单片机介绍
下一篇:3、寄存器

推荐阅读最新更新时间:2024-11-12 11:49

STM8S103F3实现串口中断接,中断功能
一、首先进行UART1初始化 /*USART1 config*/ void USART1_Init(void) { /*Uart1*/ UART1_CR1=0x00; UART1_CR2=0x00; UART1_CR3=0x00; // 设置波特率,必须注意以下几点: // (1) 必须先写BRR2 // (2) BRR1存放的是分频系数的第11位到第4位, // (3) BRR2存放的是分频系数的第15位到第12位,和第3位到第0位 // 例如对于波特率位9600时,分频系数=2000000/9600=208 // 对应的十六进制数为00D0,BBR1=0D,BBR2
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved