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

mac2022-07-05  14

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

相关资源:STM32F407 外部中断控制LED
最新回复(0)