何为按键中断?

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

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

举个栗子:

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

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

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

中断优先级别

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

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

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

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

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

了。

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

首先,我们说一下规则

为了保证中断系统正常工作,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. 更新EF(更新表 添加表…)

           

  2. JSTL自定义标签 实现forEach循环支持集合.数组

    java代码实现 tld配置 JSP页面代码

  3. jvm常用参数设置 专题

    在jdk8中 -Xms2g不合法,能通过的:-Xms2G #!/bin/bash JAVA_OPTS="-Xms4G -Xmx4G -XX:+HeapDumpOnOutOfMemoryErr ...

  4. sql分组统计多列值

    select BQDM,sum(case when HFBZ='0' then 1 ELSE 0 end) bxschf,sum(case when HFBZ='1' then 1 ELSE 0 en ...

  5. Django 下添加左侧字段显示和搜索

    在对应的apps下建立xadmin.py from .models import EmailVerifyRecord import xadminclass EmailVerifyRecordAdmin ...

  6. 一些常用的UI框架

    MUI 挺好用的ui库,结合Hbuild更好用哦 WEUI 腾讯出品,和微信样式完美匹配 SUI Element UI 饿了么出品的桌面端ui框架 Mint-UI 饿了么针对移动端的ui框架 VUX ...

  7. p标签内不能嵌套div(注解)

    相关知识: 内联元素可以嵌套内联元素,块级元素可以嵌套部分块级元素并也能嵌套内联元素,但内联元素不能嵌套块级元素.块级元素为block,内联元素为inline,拥有“inline”特性的同时又拥有“b ...

  8. VS中添加第三方库及相对路径设置

    原文 VS中添加第三方库及相对路径设置 对于一些第三方的SDK,一般会包含头文件(*.h),静态库文件(*.lib)和动态库文件(*.dll). 1.  文件位置:为了提高程序的可移植性,将第三库放在 ...

  9. Linux简单文本处理

    tr命令:tr [option] set1 [set2] 删除或者替换set1中的字符在文本表示这个问题中,windows系统下,\r\n为换行:而linux系统下,\n为换行.win->lin ...

  10. C语言的setlocale和localtime函数(C++也可用)

    Example 1234567891011121314151617181920212223242526272829303132 /* setlocale example */ #include < ...