ZigBee按键中断
何为按键中断?
在了解按键中断之前,我们先来了解一下什么是中断?中断就是程序执行当前代码,当前任务的时候;
突然有自身函数或外部的影响,而使程序执行到别的任务再回来。
举个栗子:
当你在做饭的时候,电话突然响了,这时候你只能停下当前做饭的动作,去执行听电话的动作
(同理,当你的程序要打印一句很长很长的话,突然有个中断出来,你要去执行那个中断,那个中断
可能是算一个数,也可能是让你程序复位程序执行)
中断优先级别
而说起中断,我们的中断也有个先后顺序中断,是先中断去算数还是先去中断复位呢?这就需要看你
程序的定义了,默认情况下,你是先把数算出来,再把程序复位才合理的,要是你把程序复位了,再
去算数,也进不去算了。不过话说回来,你最后复位了程序,算出来的结果,一样回不去显示出来,
毕竟被自己复位清会原始值了。但是做饭期间来电话,中间必定要做的事情还是要有的,因为你不知
道你的这个电话要聊多久,所以你会先把炉子给关了,然后才去接电话的,要不你的这顿饭就吃不下
了。
下面来看个例子怎么设置中断的优先级吧
首先,我们说一下规则
为了保证中断系统正常工作,CC2530的中断系统还存在自然优先级,即:
(1)如果多个组被设置成相同级别,则组号小的要比组号大的优先级高。
(2)同一组中所包含的3个中断源,最左侧的优先级最高,最右侧的优先级最低。
而将6个中断优先级组设置成不同优先级别,使用的是IP0和IP1两个寄存器,两个寄存器的定义见表2-7,。
要为优先级组设置优先级别,可参照表2-6来分别配置IP0和IP1。
例如,要设置的中断源优先级为P0INT>P1INT>P2INT,则可以使用以下代码实现
IP1=0x30; //IPG5级别为3,IPG4级别为2,IPG1级别为1,其他
IP0=0x22; //组级别为0。
看了上面的例子,可能一大部分人还是很懵,没事,我一开始也一样懵。
首先我们来把上面例子的IP1和IP0两个寄存器拆开来看
IP1 00 000
IP0 00 000
可能拆开来,我们还是不知道什么意思,但是我们看看IP1和IP0的第5位上,合起来后变成,再回到表2-6,
便是级别3-highest(最高级别),同理,我们的第位和第位,便设置成了级别2和级别1。
而我们为什么不在其他位设置11(级别3),10(级别2)和01(级别1)呢?原因很简单,我们再看回到表2-7。
P0INT在IPG5组上
P1INT在IPG4组上
P2INT在IPG1组上
而剩下的因为不需要分配优先级,便默认成为组级别0。
按键中断
说了半天,中断优先级别在我们今天这个文章里面暂时用不到,但是既然说到中断,我们也要先了解着,因为
CC2530单片机程序上,运用到中断的除了按键(外部)中断外,还有定时器中断和串口中断,后面迟早会用
到的。而同上个教程一样,我们要用中断,同样要用到寄存器。而相关寄存器看下面相关资料,也可百度自行
扩展。
先关寄存器
IEN0:中断使能0,0为中断禁止,1为中断使能
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
总中断EA |
未用 |
睡眠定时器中断 |
AES加密/解密中断 |
USART1 RX中断 |
USART0 RX中断 |
ADC中断 |
RF TX/RF FIFO中断 |
IEN1:中断使能1,0为中断禁止,1为中断使能
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
未用 |
未用 |
端口0 |
定时器4 |
定时器3 |
定时器2 |
定时器1 |
DMA传输 |
P0IFG(P1IFG相同):中断状态标志寄存器,当输入端口有中断请求时,相应的标志位将置1。
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
P0_7 |
P0_6 |
P0_5 |
P0_4 |
P0_3 |
P0_2 |
P0_1 |
P0_0 |
P2INP: D0~D4控制P2_0~P2_4的输入模式,0为上拉/下拉,1为三态;
D5~D7设置对P0、P1和P2的上拉或下拉的选择。0为上拉,1为下拉;
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
端口2选择 |
端口1选择 |
端口0选择 |
P2_4模式 |
P2_3模式 |
P2_2模式 |
P2_1模式 |
P2_0模式 |
P2IFG:D0~D4为P2_0~P2_4的中断标志位
D5为USB D+中断状态标志,当D+线有一个中断请求未决时设置该标志,用于检测USB挂起状态下的USB恢复事件。当USB控制器没有挂起时不设置该标志。
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
未用 |
未用 |
USB D+ |
P2_4 |
P2_3 |
P2_2 |
P2_1 |
P2_0 |
P2IEN:D0~D4控制P2_0~P2_4的中断使能
D5控制USB D+的中断使能
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
未用 |
未用 |
USB D+ |
P2_4 |
P2_3 |
P2_2 |
P2_1 |
P2_0 |
IEN2:中断使能2,0为中断禁止,1为中断使能
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
未用 |
未用 |
看门狗定时器 |
端口1 |
USART1 TX |
USART0 TX |
端口2 |
RF一般中断 |
PICTL:D0~D3设置各个端口的中断触发方式,0为上升沿触发,1为下降沿触发。
D7控制I/O引脚在输出模式下的驱动能力。选择输出驱动能力增强来补偿引脚DVDD的低I/O电压,
确保在较低的电压下的驱动能力和较高电压下相同。0为最小驱动能力增强。1为最大驱动能力增强。
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 |
程序
下面来两个程序实例,看看效果吧
//*********************************************
/*利用中断控制方式,使用SW1按键控制LED1的亮/灭状态,具体要求如下:
/*①系统上电后LED1熄灭
/*②每次按下一次SW1按键并松开时,LED1切换自身的亮/灭状态。
/*
/*
/*
//********************************************/ #include"ioCC2530.h"
#define D4 P1_1//LED1 typedef unsigned char uint8;
typedef unsigned int uint16; uint8 flag = ;//定义LED1的亮灭状态标志 void port()//初始化LED灯
{
P1DIR = 0x1b;//设置为输出
P1 &=~ 0x1b;//关闭LED灯
} void inter()//初始化中断
{
IEN2 = 0x10;//端口1中断使能
P1IEN = 0x04;//P1_2中断使能
PICTL = 0x02;//P1_3~P1_0下降沿触发中断
EA = ;//开启总中断
} main()
{
port();
inter();
while()
{
if(flag==)
{
D4=;
}
if(flag==)
{
D4=;
}
}
} #pragma vector = P1INT_VECTOR
__interrupt void P1_INT ()
{
if(P1IFG & 0x04)//如果P1_2端口中断标志位置位
{
flag = !flag;//每进入一次中断,改变一次中断
P1IFG &=~ 0x04;//清除P1_2端口中断标志位
}
P1IF = ;//清除P1端口中断标志位
}
//*********************************************
/*使用中断方式,用SW1按键控制LED1和LED2的显示效果,具体要求如下:
/*①系统上电后LED1和LED2全部熄灭
/*②第一次按下SW1按键后,LED1点亮
/*③第二次按下SW1按键后,LED2点亮
/*④第三次按下SW1按键后,LED2熄灭
/*⑤第四次按下SW1按键后,LED1熄灭
/*⑥四次按键过后,从要求②开始进入新的控制周期
/*
//********************************************/ #include"ioCC2530.h"
#define D3 P1_0//LED2
#define D4 P1_1//LED1 typedef unsigned char uint8;
typedef unsigned int uint16; uint8 flag=;//每次按键按下,改变LED状态的标志 void port()//初始化LED
{
P1DIR = 0x1b;//LED设置为输出
P1 &=~ 0x1b;//LED熄灭
} void inter()//按键中断初始化
{
IEN2 = 0x10;//P1端口中断使能
P1IEN = 0x04;//P1_2中断使能
PICTL = 0x02;//P1_3~P1_0设置下降沿触发中断
EA = ;//开启总中断
} main()
{
port();
inter();
while()
{
if(flag==)
{
D4=;
D3=;
}
else if(flag==)
{
D4=;
D3=;
}
else if(flag==)
{
D4=;
D3=;
}
else if(flag==)
{
D4=;
D3=;
}
}
} #pragma vector = P1INT_VECTOR
__interrupt void P1_INT()
{
if(P1IFG & 0x04)//如果P1_2端口中断标志位置位
{
flag++;
if(flag==)
{
flag=;
}
P1IFG &=~ 0x04;//清除P1_2端口中断标志位
}
P1IF = ;//清除P1端口中断标志位
}
ZigBee按键中断的更多相关文章
- 2、CC2541芯片中级教程-OSAL操作系统(进一步了解-OLED && 普通按键和5方向按键-中断!!!)这个系统驱动层和应用层不一样~
本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 ...
- nios II--实验4——按键中断硬件部分
按键中断 硬件开发 新建原理图 1.打开Quartus II 11.0,新建一个工程,File -> New Project Wizard…,忽略Introduction,之间单击 Next&g ...
- ok6410按键中断编程,linux按键裸机
6410按键中断编程 一.流程分析 外部中断控制寄存器(s3c6410x 359页) 1.EINTxCONy: 外部中断组x的第y个控制器.这个就是设置中断的触发方式.有5种触发方式. 2.EINT ...
- ARM实验5 —— 按键中断实验
key_int按键中断实验 实验内容: 通过开发板上的按键中断控制led灯进行跑马灯并打印信息. 通过简单事例说明猎户座4412处理器的GIC中断处理的应用,设置key2按键连接的引脚为中断模式,当识 ...
- u-boot中断功能初步分析之---------按键中断
作者:彭东林 邮箱:pengdonglin137@163.com QQ: 405728433 以前一直有个疑问,在U-boot下到底能不能使用中断,为了验证这个问题,于是乎,昨天晚上我在自己的 TQ2 ...
- cc2530的第三次实验,按键中断控制流水灯
cc2530的第三次实验:按键中断控制流水灯 效果为按一次按键,流水灯亮一次 实验相关电路图: 实验相关寄存器: 初始化函数 //初始化LED灯 //设置P1SEL,通用为0,外设为1 1111110 ...
- S3C2440—12.按键中断
文章目录 一. 总体 二. CPSR设置 三. 中断源设置 四. 中断控制器设置 五. C中断处理函数 六. 汇编IRQ异常处理程序 七. 源码 一. 总体 要驱动按键中断控制LED亮灭,程序要进行如 ...
- nios II--实验4——按键中断软件部分
软件开发 首先,在硬件工程文件夹里面新建一个software的文件夹用于放置软件部分:打开toolsàNios II 11.0 Software Build Tools for Eclipse,需要进 ...
- liunx驱动----按键中断
liunx 中断 先设置异常入口 异常向量 void __init trap_init(void) 构造了异常向量 vector_irq+offset 按下按键: cpu自动进入异常模式 ...
随机推荐
- WPF 播放音频使用的SoundPlayer和MediaPlayer
WPF中,最简单最容易播放音频的方式是使用SoundPlayer类.它是.NET Framework 2.0的一部分,是对Win32 PlaySound API的封装. 它具有以下限制: 1)仅支持. ...
- Java发展历程
Java 的发展要追溯到 1991 年,Patrick Naughton(帕特里克·诺顿)和 James Gosling(詹姆斯·高斯林)带领 Sun 公司的工程师打算为有线电视转换盒之类的消费产品设 ...
- Windows 10开发基础——VS2015 Update1新建UWP项目,XAML设计器无法加载的解决
这次,我们来解决一个问题...在使用Visual Studio 2015 Update 1的时候,新建一个UWP的项目,XAML设计器就会崩,具体异常信息如下图: 解决方法如下:下面圈出的那个路径就按 ...
- C#数据导出Excel详细介绍
概要: excel导出在C#代码中应用己经很广泛了,我这里就做些总结,供自己和读者学习用. Excel知识点.一.添加引用和命名空间 添加Microsoft.Office.Interop.Excel引 ...
- Tomcat Java SSL
转自 - http://blog.csdn.net/szzt_lingpeng/article/details/51247980 转载自:http://my.oschina.net/cimu/blog ...
- Westciv Tools主要为CSS3提供了渐变gradients、盒子阴影box-shadow、变形transform和文字描边四种在线生成效果的工具
Westciv Tools主要为CSS3提供了渐变gradients.盒子阴影box-shadow.变形transform和文字描边四种在线生成效果的工具 1.Westciv Tools 彩蛋爆料直击 ...
- qt的demo中,经常可以看到emum
最近开始看QT的文档,发现了很多好东西,至少对于我来说 收获很多~~~ 当然很多东西自己还不能理解的很透彻,也是和朋友讨论以后才渐渐清晰的,可能对于QT中一些经典的用意我还是存在会有些认识上的偏差,欢 ...
- 【Windows Universal Platform】只是学习笔记 - 开始
我是初学,之前没有windows/windows phone的应用开发经验:开博的目的只是记录和督促自己学习. 心血来潮也好,或是个人喜好的原因,想学着自己开发APP了(PS:以前做过web 开发) ...
- Qt之QSS(QTreeView)
check 是选中 前面的指示器的状态 select 是选中 项目 item 的状态. http://blog.csdn.net/u011012932/article/details/52606662
- DIOCP3 DEMO的编译(去掉VCL前缀)
总有些朋友问我,关于DEMO编译的一些问题,每次都回答大概都差不多,我想还是写篇说明书给大家,关于DEMO编译的步骤. [环境设定] 1.将DIOCP3\source路径添加到Delphi的搜索路径, ...