首页 > 代码库 > 「ZigBee模块」基础实验(3)外部中断

「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;      //清中断标志}

 

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