cc2530 的第三次实验: 按键中断控制流水灯
效果为按一次按键, 流水灯亮一次
实验相关电路图:
实验相关寄存器:
初始化函数
- // 初始化 LED 灯
- // 设置 P1SEL, 通用为 0, 外设为 1 11111100
- P1SEL &=~0x03;
- // 设置 P0SEL, 11101111
- P0SEL &= ~0x10;
- // 设置 P1DIR, 输出为 1, 输入为 0 00000011
- P1DIR |= 0x03;
- // 设置 P0DIR 00010000
- P0DIR |= 0x10;
- // 初始化按钮和中断
- // 初始化按钮
- // 初始化 P0SEL, 通用为 0 11111101
- P0SEL&=~0x02;
- // 初始化 P0DIR, 输入为 0 11111101
- P0DIR&=~0x02;
- // 初始化中断
- // 设置引脚中断 1 为中断使能 00000010
- P0IEN |= 0x02;
- // 设置端口中断
- IEN1=1;
- // 设置端口中断触发方式 1 为中断使能
- IEN1|=0x20;
- // 设置总中断
- EA=1;
- // 清空标志位
- P0IFG=0;
中断服务函数
- // 中断服务函数
- #pragma vector = P0INT_VECTOR // 这一行的 P0INT_VECTOR 是中断源的名称吗?
- __interrupt void P0ISR(void)
- {
- // 清除端口中断标志位
- P0IFG=0;
- //LED 灯流水亮一遍
- BLink();
- // 清除端口中断标志位
- P0IF=0;
- }
上面的代码一定要注意 P0IFG 一定要在 P0IF 之前清除, 话说 P0IF 与 P0IFG 到底是干啥用的? 他们之间什么关系, 端口的标志寄存器?(记得查一下)
P0IFG 是端口 0 中断状态标志, P0IF 是 CPU 内中断标志寄存器, 什么鬼, 没弄明白啊, 问一下老师吧!
全部代码
- #include <ioCC2530.h>
- typedef unsigned int uint;
- typedef unsigned char uchar;
- #define LED1 P1_0
- #define LED2 P1_1
- #define LED3 P0_4
- #define BUTTON1 P0_1
- uint time=300;
- // 延迟函数
- void Delay(uint time)
- {
- for(uint i=0;i<time;i++)
- for(uint j=0;j<1070;j++);
- }
- // 初始化函数
- void Init(void)
- {
- // 初始化 LED 灯
- // 设置 P1SEL, 通用为 0, 外设为 1 11111100
- P1SEL &=~0x03;
- // 设置 P0SEL, 11101111
- P0SEL &= ~0x10;
- // 设置 P1DIR, 输出为 1, 输入为 0 00000011
- P1DIR |= 0x03;
- // 设置 P0DIR 00010000
- P0DIR |= 0x10;
- // 初始化按钮和中断
- // 初始化按钮
- // 初始化 P0SEL, 通用为 0 11111101
- P0SEL&=~0x02;
- // 初始化 P0DIR, 输入为 0 11111101
- P0DIR&=~0x02;
- // 初始化中断
- // 设置引脚中断 1 为中断使能 00000010
- P0IEN |= 0x02;
- // 设置端口中断
- IEN1|=0x20;
- // 设置端口中断触发方式 1 为下降沿触发
- PICTL|=0x01;
- // 设置总中断
- EA=1;
- // 清空标志位
- P0IFG=0;
- }
- void BLink()
- {
- Delay(time);
- LED1=0;
- LED2=1;
- LED3=1;
- Delay(time);
- LED1=0;
- LED2=0;
- LED3=1;
- Delay(time);
- LED1=0;
- LED2=0;
- LED3=0;
- Delay(time);
- LED1=1;
- LED2=1;
- LED3=1;
- }
- // 中断服务函数
- #pragma vector = P0INT_VECTOR // 这一行的 P0INT_VECTOR 是中断源的名称吗?
- __interrupt void P0ISR(void)
- {
- // 清除端口中断标志位
- P0IFG=0;
- //LED 灯流水亮一遍
- BLink();
- // 清除端口中断标志位
- P0IF=0;
- }
- // 主函数
- void main()
- {
- Init();
- LED3=0;
- while(1)
- {
- //LED3=0;
- }
- //return ;
- }
这个实验的难点以及重点主要是在初始化中断这个过程,
初始化引脚的寄存器 P0IEN|=0x02;
设置端口中断的寄存器 IEN1|=0x20;
设置端口中断触发方式 PICTL|=0x01;
设置总中断 EA=1
清空标志位: P0IFG=0;
来源: http://www.bubuko.com/infodetail-3342819.html