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; //清中断标志 }
时间: 2024-10-09 13:57:43