1.前期预备知识


1.1 新大陆Zigbee模块按键电路图

由上图可知,Zigbee模块的SW1按钮连接在P1.2端口上,当SW1导通,P1.2电平从3.3V被拉低接地。所以P1.2输入模式为下拉输入.

1.2 CC2530相关寄存器


寄存器名称 寄存器作用 寄存器描述
P1 (0x90) *控制端口1的高低电平 端口1.通用I/O。可以通过SFR位寻址
P1SEL (0xF4) 端口1 8个子端口的功能选择 P1SEL的8个bit分别代表 => P1.7~P1.0的功能选择.
值为 0:代表通用I/0(GPIO)功能.
值为 1 : 代表外设功能
P1DIR (0xFE) 端口1 输入输出选择 P1DIR的bit定义同P1SEL;
值为 0:代表从外部输入信号至CC2530;
值为 1:代表从CC2530输出信号至外部
P1INP (0xF6) 端口1 输入模式选择 P1INP定义为P1.7~P1.2的I/O输入模式。其中P1.0和P1.1是没有上拉/下拉功能
值为 0:上拉/下拉。
值为 1:三态(高电平、低电平、高阻态)
P2INP (0xINP) 端口2 输入模式及其它端口选择 P2INP比较特殊,因为P2端口引出的引脚只有3个,所以P2INP还有其它功能。
bit 0 ~ 4 : P2.4~P2.0的输入模式。 0 : 上拉/下拉; 1:三态
bit 5 : 设置端口0上拉/下拉选择。对端口P0上面的所有引脚设置为上拉/下拉输入 0 : 上拉; 1 : 下拉
bit 6 : 同bit 5功能,但是是设置端口1上所有引脚
bit 7 : 同bit5功能,但是是设置端口2上的所有引脚
P1IEN (0x8D) 端口1 中断屏蔽 端口P1.7~P1.0的中断使能(也就是说中断是否Enable*(打开))
0 : 中断禁用
1 : 中断使能
PICTL (0x8C) 端口中断控制 P0ICON(bit0) 端口0、1、2输入模式下的中断配置。
0 : 输入的上升沿引起中断
1 : 输入的下降沿引起中断
P1IFG (0x8A) 端口0 中断状态标志 端口0,bit7 ~ 0输入中断状态标志。当输入端口中断请求后,其相应的标志位将会被置为1.
IEN2 (0x9A) 中断使能1 P0IE(bit5) 端口1中断使能
0 : 中断禁止
1 : 中断使能
EA 中断的总开关 只有打开该开关,中断才能传入51芯片
0 : 中断禁止
1 : 中断使能

1.3 CC2530中断走向图



如上图所示,如果P1端口发生中断,需要传入51内核中,流程如下图所示.

所以,我们对中断进行初始化的一个流程也和上图一样,一层一层的将中断使能开关打开。

1.4 使用C语言为51单片机编写中断程序

使用C语言为51单片机编写中断程序,有一个特殊的函数声明形式。如以下代码所示:

#pragma vector = 中断向量地址
__interrupt void P01_ISR(void)
{
/*Do something*/
}

其中中断向量地址,可以在ioCC2530.h头文件中找到,可以直接使用宏定义字符替换。

/* --------------------------------------------------------------------------
* Interrupt Vectors
* --------------------------------------------------------------------------
*/
#define RFERR_VECTOR VECT( 0, 0x03 ) /* RF TX FIFO下溢和RX FIFO溢出*/
#define ADC_VECTOR VECT( 1, 0x0B ) /* ADC转换结束*/
#define URX0_VECTOR VECT( 2, 0x13 ) /* USART0 RX完成*/
#define URX1_VECTOR VECT( 3, 0x1B ) /* USART1 RX完成*/
#define ENC_VECTOR VECT( 4, 0x23 ) /* AES加密/解密完成*/
#define ST_VECTOR VECT( 5, 0x2B ) /* 睡眠定时器比较*/
#define P2INT_VECTOR VECT( 6, 0x33 ) /* 端口2输入*/
#define UTX0_VECTOR VECT( 7, 0x3B ) /* USART0 TX完成*/
#define DMA_VECTOR VECT( 8, 0x43 ) /* DMA传输完成*/
#define T1_VECTOR VECT( 9, 0x4B ) /* 定时器1(16位)捕捉/比较/溢出 */
#define T2_VECTOR VECT( 10, 0x53 ) /* 定时器2(MAC定时器)*/
#define T3_VECTOR VECT( 11, 0x5B ) /* 定时器3(8位)捕捉/比较/溢出*/
#define T4_VECTOR VECT( 12, 0x63 ) /* 定时器4(8位)捕捉/比较/溢出*/
#define P0INT_VECTOR VECT( 13, 0x6B ) /* 端口0输入*/
#define UTX1_VECTOR VECT( 14, 0x73 ) /* USART1 TX完成*/
#define P1INT_VECTOR VECT( 15, 0x7B ) /* 端口1输入*/
#define RF_VECTOR VECT( 16, 0x83 ) /* 射频通用中断*/
#define WDT_VECTOR VECT( 17, 0x8B ) /* 定时器模式下看门狗溢出*/

1.5 *函数指针

本节为选择学习内容,是笔者在学习按键中断时,思考的一个问题。想实现高级语言中事件机制,在高级语言中事件主要是靠方法指针和观察者设计模式一并完成。方法指针就是一个指向方法的指针。而C语言中的指针一样可以指向一个函数。如:

例1,简单的事件实现,函数指针。
#include <ioCC2530.h>
typedef unsigned int uint;
/************************/
void (*timer_ow)(); // 定义一个返回值为void参数为空的函数指针
int (*timer_ow1)(); // 定义一个返回值为int参数为void的函数指针
int (*timer_ow2)(int); // 定义一个返回值为int参数为int的函数指针
/************************/
void timer_Overflow(void)
{
/*Do something*/
}
int timer_Overflow1(void)
{
/*Do something*/
}
int timer_Overflow2(int z)
{
/*Do something*/
}
void main(void)
{
// 将函数timer_Overflow赋值给函数指针timer_ow
timer_ow = timer_Overflow;
// 调用函数指针
(*timer_ow)(); timer_ow1 = timer_Overflow1;
int result = (*timer_ow1)(); timer_ow2 = timer_Overflow2;
result = (*timer_ow2)(result);
}

2. 程序代码

#include <ioCC2530.h>

// 初始化通用端口
void init_gpio(void)
{
// 将p1_0,1,2设置成GPIO
P1SEL &=~ 0x07;
// 将p1_0,1设置成输出
P1DIR |= 0x03;
// 将p1_2设置成输入
P1DIR &=~ 0x04;
// 下拉P1全部端口,使LED全灭
P1 = 0x00;
// 设置端口1为上下拉功能
P1INP &=~ 0x04;
// 设置端口1输入模式为上拉
P2INP &=~ 0x40;
} // 初始化通用端口中断
void init_gpio_interrupt(void)
{
// 将P1设置为输入下降沿引起中断
PICTL |= 0x02;
// 设置P1引脚2为中断使能
P1IEN |= 0x04;
// 设置端口P1为中断使能
IEN2 |= 0x10;
// 打开中断总开关
EA = 1; //清空中断标志
P1IFG = 0;
P1IF = 0;
} #pragma vector = P1INT_VECTOR
__interrupt void P1_ISR(void)
{
// 判断中断信号是否从P1.2 SW1引脚发生
if(P1IFG == 0x04)
{
// 让LED翻转
P1_0 = ~P1_0;
P1_1 = ~P1_1;
}
// 清空中断标志
P1IFG = 0;
P1IF = 0;
} void main()
{
init_gpio();
init_gpio_interrupt();
while(1){;}
}

代码并没有特别困难的地方,根据前面的预备知识和流程图基本可以看得懂。

THE END

CC2530学习路线-基础实验-GPIO 按键控制LED灯亮灭(2)的更多相关文章

  1. CC2530学习路线-基础实验-GPIO 控制LED灯亮灭(1)

    目录 1.前期预备知识 1.1 新大陆ZigBee模块LED灯电路 1.2 CC2530相关寄存器 1.3 寄存器操作技巧 1.4 CPU空转延时 1.4 操作流程图 2.程序代码 The End 1 ...

  2. CC2530学习路线-基础实验-定时器控制LED灯亮灭(3)

    目录 1. 前期预备知识 1.1 定时器中断触发 1.2 相关寄存器 1.3 寄存器相关问题 1.4 T1.T3定时器初始化流程 2 程序及代码 THE END 1. 前期预备知识 1.1 定时器中断 ...

  3. CC2530学习路线-基础实验-串口通讯发送字符串(4 未完待续)

    目录 1. 前期预备知识 1.1 串口通讯电路图 1.2 实验相关寄存器 1.2 常用波特率设置 本章未完待续..... 原来写的文章已经丢失了,只能找到这一小部分,看什么时候有时间再补上. 1. 前 ...

  4. [ZigBee] 3、ZigBee基础实验——GPIO输出控制实验-控制Led亮灭

    1.CC2530的IO口概述 CC2530芯片有21 个数字输入/输出引脚,可以配置为通用数字I/O 或外设I/O 信号,配置为连接到ADC.定时器或USART外设.这些I/O 口的用途可以通过一系列 ...

  5. 10-ESP8266 SDK开发基础入门篇--上位机通过串口控制ESP8266灯亮灭

    https://www.cnblogs.com/yangfengwu/p/11087618.html 其实这一节就是对上三节的综合测试 https://www.cnblogs.com/yangfeng ...

  6. 按键控制LED灯-ESP32中断处理

    #include <driver/gpio.h> #include <esp_task_wdt.h> #include <freertos/FreeRTOS.h> ...

  7. 独立按键控制led灯

    #include "regx51.h"typedef unsigned int u16; void delay_us(u16 time){ while(time--){} }voi ...

  8. 嵌入式Linux学习入门:控制LED灯

    记录自己linux学习过程,让自己能够一直坚持下去 1.原理图分析: nLED_1, nLED_2, nLED_4, 给低电平则对应LED灯亮,高电平则对应LED灯灭, S3C2440芯片GPF4-G ...

  9. 【iCore4 双核心板_ARM】例程四:USART实验——通过命令控制LED

    实验原理: 开发板上自带一片CH340芯片,完成本实验电脑需要安装CH340驱动, CH340的TXD连接STM32的GPIO(PXC7),CH340的RXD连接STM32的 GPIO(PC6),通过 ...

随机推荐

  1. 操作符重载operator

    发现一篇好文: 转载: http://www.cnblogs.com/xiehongfeng100/p/4040858.html #include <iostream>#include & ...

  2. 如何给a标签绑定ajax事件

    <a href="review?action=delete&id=${review.id}&articleId=${review.articleId}"cla ...

  3. phpstrom+xdebug配置

    1.确认是否安装了xdebug 2.在php.ini文件中配置如下 [xdebug] zend_extension="D:\wamp\php-5.6.2-x64\ext\php_xdebug ...

  4. 电商类Web原型制作分享-IKEA

    IKEA是一个家居整合大型零售商,属于电商类官网.电商以展示商品.售后服务.购物流程为主.根据网站的图文方式排版,主导航栏使用的标签组,区域导航栏使用的是垂直选项卡,实现下拉弹出面板交互的功能. 本原 ...

  5. cubieboard网络设置

    1.1 配置静态ip vi /etc/network/interface auto lo iface lo inet loopback #以下是添加的内如 auto eth0 #iface eth0 ...

  6. 2018.09.23 孙悟空大战鲤鱼精(单调队列优化dp)

    描述 孙悟空大战鲤鱼精,孙悟空在通天河遇到鲤鱼精,他嫉恶如仇,看见妖精就手痒(忘了自己是妖精).但是鲤鱼精知道孙悟空的厉害,在孙悟空来到通天河,鲤鱼精就跑到了河对面.于是孙悟空就去追鲤鱼精. 我们可以 ...

  7. 2018.09.14 bzoj2982: combination(Lucas定理)

    传送门 貌似就是lucas的板子题啊. 练一练手感觉挺舒服的^_^ 代码: #include<bits/stdc++.h> #define mod 10007 #define ll lon ...

  8. 2018.08.30 游戏(概率dp)

    题目描述 Alice 和 Bob 两个人正在玩一个游戏,游戏有很多种任务,难度为 p 的任务(p是正整数),有 1/(2^p) 的概率完成并得到 2^(p-1) 分,如果完成不了,得 0 分.一开始每 ...

  9. 2018.07.08 hdu4521 小明系列问题——小明序列(线段树+简单dp)

    小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Proble ...

  10. 一个 图片 滚动 飞入的css特效

    @keyframes bounceInLeft { from, 60%, 75%, 90%, to {animation-timing-function: cubic-bezier(0.215, 0. ...