大家好,我是皮皮猫吖!
每文一言:每天突破自己的记录,就是一位成功者!
本篇文章:
主要是学习Zigbee的中断使用。使用zigbee,通过外部中断方式来控制LED灯亮灭。
正文如下:
一、外部中断配置(P1_0作为输出口、P0_5作为输入口)
1)初始化P0_5口为普通IO、上拉输入状态(上一篇有详细配置讲解)
//1. 初始化io口是普通口,呈上拉输入状态
//P0_5作为普通io口0为普通io口
P0SEL &= 0xdf;1101 1111
//P0_5作为输入口,0为输入
P0DIR &= 0xdf;1101 1111
//设置P0为上拉模式, 设置P0_5这个io的模式,0为上拉或者下拉模式
P0INP &= 0xdf;1101 1111
//设置P0为上拉模式,设置P2INP的第六位为0
P2INP &= 0xdf; 1101 1111
2)开启IO口组中断:
P0组—P2组的组开关分别为:IEN1的第五位、IEN2的第四位、IEN2的第一位
寄存器 | IENX(X=1时,选择第五位;X=2时,选择第一位或第四位) |
---|---|
开启外部中断 | 0 |
关闭外部中断 | 1 |
3) 开启组内对应的具体IO口中断
寄存器 | PXIEN(X可以是0、1、2) |
---|---|
开启具体I/O口外部中断 | 1 |
关闭具体I/O口外部中断 | 0 |
4)设置开启了中断的输入引脚是上升沿方式触发,还是下降沿方式触发
PICTL寄存器:负责控制外部中断触发方式【上升沿触发 / 下降沿触发】
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
I/O驱动 | 未用 | 未用 | 未用 | P2_0-P2_4 | P1_4-P1_7 | P1_0-P1_3 | P0_0-P0_7 |
5)开启CPU总中断:EA=1
6)中断函数处理:
① 判断具体的中断源,判断PXIFG的哪一位发生中断?
② 中断标志位清零:PXIFG(X可以是0、1、2)
③ 组中断标志位清零:PXIF(X可以是0、1、2)
二、练习:当P0_5端口检测到低电平时,P1_0控制的LED灯发生亮灭交替操作
#include iocc2530.h
void delay(){
for(int i = 0; i 1000; i++)
for(int j = 0; j 30; j++);
}
void main(){
//设置一个io口为中断的步骤
//1. 初始化io口是普通口,呈上拉输入状态
//P0_5作为普通io口0为普通io口
P0SEL &= 0xdf;1101 1111
//P0_5作为输入口,0为输入
P0DIR &= 0xdf;1101 1111
//设置P0为上拉模式, 设置P0_5这个io的模式,0为上拉或者下拉模式
P0INP &= 0xdf;1101 1111
//设置P0为上拉模式,设置P2INP的第六位为0
P2INP &= 0xdf; 1101 1111
// 2. 总中断设置为1
EA = 1;
//3. 组内寄存器打开:1
// 只有P1IE是可以这么使用的,P1IE所在的寄存器的地址是0x9a,不能整除80
//设置P1IE的时候,需要设置P1IE所在的寄存器IEN2的第四位 IEN2 = 0x10 0001 0000
//IEN2的第四位表示的就是P1IE
P0IE = 1;
//4. 组内具体的位寄存器打开:1
P0IEN = 0x20;0010 0000
// 5. 下降沿触发
//P0这一组配置为下降沿触发
PICTL = 0x01; 0000 0001
P1DIR = 0x01;//配置P1_1为普通io输出
while(1);
}
//总中断函数
//PXIFG和PXIF是中断标志位
#pragma vector=P0INT_VECTOR
__interrupt void f(){
//判断是哪一位触发了中断
//P0组的第五位触发了中断
if(P0IFG & 0x20){
delay(); //延迟一段时间,按键消抖
if(0==P0_5){
//如果P0_5仍然是低电平
P1_0 ^= 1; //a ^= b == a = a ^ b
}
}
//已经触发中断,关闭中断判断位
P0IFG = 0;
//中断标志位重置为0,方便下次使用
P0IF=0;
}
希望本篇文章对大家有所帮助,后续会继续分享Zigbee相关学习知识…
如果文章内容有错误的地方,请在留言处留下你的见解,方便大家共同学习。谢谢!
如有侵权或其他任何问题请联系:QQ1370922071,本文主要用于学习交流,转载请声明!
作者:皮皮猫吖