何为按键中断?

在了解按键中断之前,我们先来了解一下什么是中断?中断就是程序执行当前代码,当前任务的时候;

突然有自身函数或外部的影响,而使程序执行到别的任务再回来。

举个栗子:

当你在做饭的时候,电话突然响了,这时候你只能停下当前做饭的动作,去执行听电话的动作

(同理,当你的程序要打印一句很长很长的话,突然有个中断出来,你要去执行那个中断,那个中断

可能是算一个数,也可能是让你程序复位程序执行)

中断优先级别

而说起中断,我们的中断也有个先后顺序中断,是先中断去算数还是先去中断复位呢?这就需要看你

程序的定义了,默认情况下,你是先把数算出来,再把程序复位才合理的,要是你把程序复位了,再

去算数,也进不去算了。不过话说回来,你最后复位了程序,算出来的结果,一样回不去显示出来,

毕竟被自己复位清会原始值了。但是做饭期间来电话,中间必定要做的事情还是要有的,因为你不知

道你的这个电话要聊多久,所以你会先把炉子给关了,然后才去接电话的,要不你的这顿饭就吃不下

了。

下面来看个例子怎么设置中断的优先级吧

首先,我们说一下规则

为了保证中断系统正常工作,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传输

 

P0IFGP1IFG相同):中断状态标志寄存器,当输入端口有中断请求时,相应的标志位将置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设置对P0P1P2的上拉或下拉的选择。0为上拉,1为下拉;

D7

D6

D5

D4

D3

D2

D1

D0

端口2选择

端口1选择

端口0选择

P2_4模式

P2_3模式

P2_2模式

P2_1模式

P2_0模式

P2IFGD0~D4P2_0~P2_4的中断标志位

       D5USB 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

 

P2IEND0~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一般中断

PICTLD0~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按键中断的更多相关文章

  1. 2、CC2541芯片中级教程-OSAL操作系统(进一步了解-OLED && 普通按键和5方向按键-中断!!!)这个系统驱动层和应用层不一样~

    本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 ...

  2. nios II--实验4——按键中断硬件部分

    按键中断 硬件开发 新建原理图 1.打开Quartus II 11.0,新建一个工程,File -> New Project Wizard…,忽略Introduction,之间单击 Next&g ...

  3. ok6410按键中断编程,linux按键裸机

    6410按键中断编程 一.流程分析 外部中断控制寄存器(s3c6410x  359页) 1.EINTxCONy: 外部中断组x的第y个控制器.这个就是设置中断的触发方式.有5种触发方式. 2.EINT ...

  4. ARM实验5 —— 按键中断实验

    key_int按键中断实验 实验内容: 通过开发板上的按键中断控制led灯进行跑马灯并打印信息. 通过简单事例说明猎户座4412处理器的GIC中断处理的应用,设置key2按键连接的引脚为中断模式,当识 ...

  5. u-boot中断功能初步分析之---------按键中断

    作者:彭东林 邮箱:pengdonglin137@163.com QQ: 405728433 以前一直有个疑问,在U-boot下到底能不能使用中断,为了验证这个问题,于是乎,昨天晚上我在自己的 TQ2 ...

  6. cc2530的第三次实验,按键中断控制流水灯

    cc2530的第三次实验:按键中断控制流水灯 效果为按一次按键,流水灯亮一次 实验相关电路图: 实验相关寄存器: 初始化函数 //初始化LED灯 //设置P1SEL,通用为0,外设为1 1111110 ...

  7. S3C2440—12.按键中断

    文章目录 一. 总体 二. CPSR设置 三. 中断源设置 四. 中断控制器设置 五. C中断处理函数 六. 汇编IRQ异常处理程序 七. 源码 一. 总体 要驱动按键中断控制LED亮灭,程序要进行如 ...

  8. nios II--实验4——按键中断软件部分

    软件开发 首先,在硬件工程文件夹里面新建一个software的文件夹用于放置软件部分:打开toolsàNios II 11.0 Software Build Tools for Eclipse,需要进 ...

  9. liunx驱动----按键中断

    liunx 中断 先设置异常入口 异常向量 void __init trap_init(void) 构造了异常向量 vector_irq+offset       按下按键: cpu自动进入异常模式 ...

随机推荐

  1. WPF 播放音频使用的SoundPlayer和MediaPlayer

    WPF中,最简单最容易播放音频的方式是使用SoundPlayer类.它是.NET Framework 2.0的一部分,是对Win32 PlaySound API的封装. 它具有以下限制: 1)仅支持. ...

  2. Java发展历程

    Java 的发展要追溯到 1991 年,Patrick Naughton(帕特里克·诺顿)和 James Gosling(詹姆斯·高斯林)带领 Sun 公司的工程师打算为有线电视转换盒之类的消费产品设 ...

  3. Windows 10开发基础——VS2015 Update1新建UWP项目,XAML设计器无法加载的解决

    这次,我们来解决一个问题...在使用Visual Studio 2015 Update 1的时候,新建一个UWP的项目,XAML设计器就会崩,具体异常信息如下图: 解决方法如下:下面圈出的那个路径就按 ...

  4. C#数据导出Excel详细介绍

    概要: excel导出在C#代码中应用己经很广泛了,我这里就做些总结,供自己和读者学习用. Excel知识点.一.添加引用和命名空间 添加Microsoft.Office.Interop.Excel引 ...

  5. Tomcat Java SSL

    转自 - http://blog.csdn.net/szzt_lingpeng/article/details/51247980 转载自:http://my.oschina.net/cimu/blog ...

  6. Westciv Tools主要为CSS3提供了渐变gradients、盒子阴影box-shadow、变形transform和文字描边四种在线生成效果的工具

    Westciv Tools主要为CSS3提供了渐变gradients.盒子阴影box-shadow.变形transform和文字描边四种在线生成效果的工具 1.Westciv Tools 彩蛋爆料直击 ...

  7. qt的demo中,经常可以看到emum

    最近开始看QT的文档,发现了很多好东西,至少对于我来说 收获很多~~~ 当然很多东西自己还不能理解的很透彻,也是和朋友讨论以后才渐渐清晰的,可能对于QT中一些经典的用意我还是存在会有些认识上的偏差,欢 ...

  8. 【Windows Universal Platform】只是学习笔记 - 开始

    我是初学,之前没有windows/windows phone的应用开发经验:开博的目的只是记录和督促自己学习. 心血来潮也好,或是个人喜好的原因,想学着自己开发APP了(PS:以前做过web 开发) ...

  9. Qt之QSS(QTreeView)

    check 是选中 前面的指示器的状态 select 是选中 项目 item 的状态. http://blog.csdn.net/u011012932/article/details/52606662

  10. DIOCP3 DEMO的编译(去掉VCL前缀)

    总有些朋友问我,关于DEMO编译的一些问题,每次都回答大概都差不多,我想还是写篇说明书给大家,关于DEMO编译的步骤. [环境设定] 1.将DIOCP3\source路径添加到Delphi的搜索路径, ...