「ZigBee模块」基础实验(3)外部中断

1.实现功能

使用中断方式实现:

按键KEY1按下LED1依次亮灭

按键KEY2按下LED2依次亮灭

 

2.元件连接方式

P1_0连接LED1

P1_1连接LED2

P0_0连接KEY1

P0_1连接KEY2

 

3.中断相关寄存器

PXIEN

P0IEN

P1IEN

P2IEN

地址

0xAB

0x8D

0xAC

PX[7:0] 各个控制口中断使能 (0:中断禁止 1:中断使能)

 

PICTL

D0~D3设置各个端口的中断触发方式(0:上升沿触发 1:下降沿触发)

D7控制I/O引脚在输出模式下的驱动能力。选择输出驱动能力增强来补偿引脚DVDD的低I/O电压,确保在较低的电压下的驱动能力和较高电压下相同。(0:最小驱动能力增强 1:最大驱动能力增强。)

PICTL

D7

D6

D5

D4

D3

D2

D1

D0

地址0x8C

IO驱动能力

未使用

P2_0-P2-4

P1_4-P1_7

P1_0-P1_3

P0_0-p0_7

 

 

PXIFG

P0IFG

P1IFG

P2IFG

地址

0x89

0x8A

0x8B

PX[7:0] 中断标志位,发生中断相应位置1

 

IEN1——中断使能1(0:中断禁止 1:中断使能)

IEN1

D7

D6

D5

D4

D3

D2

D1

D0

地址0x80

未用

P0

计数器4

计数器3

计数器2

计数器1

DMA

 

IEN2——中断使能2(0:中断禁止 1:中断使能)

IEN1

D7

D6

D5

D4

D3

D2

D1

D0

地址0x9A

未用

看门狗

P1

USART1

USART0

P2

PF通用

 

4.部分代码分析

外部中断初始化编程

P0IEN |= 0X03;       //P0_0、P0_1 设置为中断方式
PICTL |= 0X01;      // P0口下降沿触发
IEN1 |= 0X20;       // 允许P0口中断;
P0IFG = 0x00;      // 初始化中断标志位
EA = 1;            //打开总中断

5.完整代码

#include <ioCC2530.h>

#define uchar unsigned char
#define uint  unsigned int

//端口定义
#define KEY1 P0_0
#define KEY2 P0_1
#define LED1 P1_0
#define LED2 P1_1

//函数声明
void delayms(uint ms);    //延时函数
void keyInit();           //按键初始化
void ledInit();           //led初始化

/*****************************
延时函数
*****************************/
void delayms(uint ms)
{
  uint i, j;
  for(i=ms; i>0; i--)
    for(j=578; j>0; j--);
}

/*****************************
按键初始化
*****************************/
void keyInit()
{
  P0IEN |= 0X03;       //P0_0、P0_1 设置为中断方式
  PICTL |= 0X01;      //P0口下降沿触发
  IEN1 |= 0X20;       //允许P0口中断;
  P0IFG = 0x00;           //初始化中断标志位
  
  P0SEL &= ~0x03;
  P0DIR &= ~0x03;
  P0INP &= ~0x03;
  
  EA = 1;                 //打开总中断
}

/*****************************
led初始化
*****************************/
void ledInit()
{
  P1SEL &= ~0x03;
  P1DIR |= 0x03;
  P1INP &= ~0x03;
  
  LED1 = 0;
  LED2 = 0;
}

/*****************************
主函数
*****************************/
void main()
{
  ledInit();
  keyInit();
  while(1);
}

/*****************************
中断函数
*****************************/
#pragma vector = P0INT_VECTOR     //格式:#pragma vector = 中断向量,
__interrupt void P0_ISR(void)     // 紧接着是中断处理程序
{
  delayms(10);
  if(KEY1 == 0)
  {
    while(!KEY1);
    LED1 = !LED1;
  }
  if(KEY2 == 0)
  {
    while(!KEY2);
    LED2 = !LED2;
  }
  P0IFG &= ~0x03; //清中断标志
  P0IF = 0;      //清中断标志
}
原文地址:https://www.cnblogs.com/Donut/p/4123345.html