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自动进入异常模式 ...
随机推荐
- 更新EF(更新表 添加表…)
- JSTL自定义标签 实现forEach循环支持集合.数组
java代码实现 tld配置 JSP页面代码
- jvm常用参数设置 专题
在jdk8中 -Xms2g不合法,能通过的:-Xms2G #!/bin/bash JAVA_OPTS="-Xms4G -Xmx4G -XX:+HeapDumpOnOutOfMemoryErr ...
- sql分组统计多列值
select BQDM,sum(case when HFBZ='0' then 1 ELSE 0 end) bxschf,sum(case when HFBZ='1' then 1 ELSE 0 en ...
- Django 下添加左侧字段显示和搜索
在对应的apps下建立xadmin.py from .models import EmailVerifyRecord import xadminclass EmailVerifyRecordAdmin ...
- 一些常用的UI框架
MUI 挺好用的ui库,结合Hbuild更好用哦 WEUI 腾讯出品,和微信样式完美匹配 SUI Element UI 饿了么出品的桌面端ui框架 Mint-UI 饿了么针对移动端的ui框架 VUX ...
- p标签内不能嵌套div(注解)
相关知识: 内联元素可以嵌套内联元素,块级元素可以嵌套部分块级元素并也能嵌套内联元素,但内联元素不能嵌套块级元素.块级元素为block,内联元素为inline,拥有“inline”特性的同时又拥有“b ...
- VS中添加第三方库及相对路径设置
原文 VS中添加第三方库及相对路径设置 对于一些第三方的SDK,一般会包含头文件(*.h),静态库文件(*.lib)和动态库文件(*.dll). 1. 文件位置:为了提高程序的可移植性,将第三库放在 ...
- Linux简单文本处理
tr命令:tr [option] set1 [set2] 删除或者替换set1中的字符在文本表示这个问题中,windows系统下,\r\n为换行:而linux系统下,\n为换行.win->lin ...
- C语言的setlocale和localtime函数(C++也可用)
Example 1234567891011121314151617181920212223242526272829303132 /* setlocale example */ #include < ...