CC2530学习路线-基础实验-GPIO 按键控制LED灯亮灭(2)

目录

  • 1.前期预备知识

    • 1.1 新大陆Zigbee模块按键电路图
    • 1.2 CC2530相关寄存器
    • 1.3 CC2530中断走向图
    • 1.4 使用C语言为51单片机编写中断程序
    • 1.5 *函数指针
  • 2. 程序代码
  • THE END


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

原文地址:https://www.cnblogs.com/InCerry/p/9397851.html

时间: 2024-10-24 07:29:12

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

四、按键控制LED灯亮灭

材料: 1.SAGOO UNO 1块: 2.按键模块 1块: 3.杜邦线若干. 步骤: 1.按照下图连接按键模块和UNO: SAGOO UNO引脚                                      按键模块引脚 3V3  <------------------------------------>    V(电源) GND <------------------------------------>    G(电源) Pin2  <----------

socket通信——多角度控制LED灯亮灭

今天以物联网网关(网关链接)以服务器,在多个客户端就做一个非常简单的功能:点亮或熄灭网关上的LED灯.目前想到了三种方式,分别是:TCP&UDP测试工具.自编Java客户端和Mono Android客户端.相信这会很有意思的. 1.服务器端 在使用或编写客户端之前,首先来看看服务器端代码,其专门通过串口烧进网关内部 OutputPort led = new OutputPort((Cpu.Pin)GPIO_NAMES.PF8, false); Socket sc; Socket ss = new

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

1.CC2530的IO口概述 CC2530芯片有21 个数字输入/输出引脚,可以配置为通用数字I/O 或外设I/O 信号,配置为连接到ADC.定时器或USART外设.这些I/O 口的用途可以通过一系列寄存器配置,由用户软件加以实现. I/O 端口具备如下重要特性:    ?? 21 个数字I/O 引脚 ?? 可以配置为通用I/O 或外部设备I/O ?? 输入口具备上拉或下拉能力 ?? 具有外部中断能力. 21 个I/O 引脚都可以用作于外部中断源输入口.因此如果需要外部设备可以产生中断.外部中断

stm32控制LED的亮灭

其实这个小实验就是学会运用GPIO这个外设. GPIO是一个片上高速外设,它是由几个寄存器来控制的,每个寄存器占据0x04: GPIOx_BSSR: 端口位设置/清除寄存器,这个寄存器的BSy位是0-15位(BS0-BS15),BRy位是16-31位(BR0-BR15):通过这两个位可以控制16个引脚:BSy只写,写0对ODRy无作用,写1置ODRy位1:BSy只写,写0对ODRy无作用,写1清除ODRy为0:如若两个位同时设置,BSy位起作用. GPIOx_CRL/CRH: 端口配置低/高寄存

tq2440裸机程序. 按键控制LED灯.

http://blog.csdn.net/w_ww_w/article/details/8211538 http://blog.csdn.net/shengnan_wu/article/details/8168795

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

记录自己linux学习过程,让自己能够一直坚持下去 1.原理图分析: nLED_1, nLED_2, nLED_4, 给低电平则对应LED灯亮,高电平则对应LED灯灭, S3C2440芯片GPF4-GPF6对应nLED_1, nLED_2, nLED_4, 所以代码里面操作GPF4-GPF6就可以控制LED灯亮灭. 2.写代码前了解事项 第一步:将GPF0-GPF4配置为输出功能 第二步:控制GPF0-GPF4输出低电平 3.编写代码 1 .text 2 .global _start 3 _st

外部按键 控制 LED 中断 (参考 http://www.oschina.net/question/565065_115196?sort=time )

转帖: http://www.oschina.net/question/565065_115196?sort=time 实验目的: mini2440开发板上有6个按键,将其中的前4个按键设为外部中断方式,当按下K1时,LED1亮:当按下K2时,LED2亮:当按下K3时,LED3亮:当按下K4时,LED4亮. 首先我们先了解一下 mini2440 按键和LED接口:     GPBCON 地址: 0x56000010 (LED 灯可以参考流水灯的随笔) 按键接口电路如图2所示,当按键没有按下时,G

STM32学习笔记(四)——串口控制LED(中断方式)

目录: 一.时钟使能,包括GPIO的时钟和串口的时钟使能 二.设置引脚复用映射 三.GPIO的初始化配置,注意要设置为复用模式 四.串口参数初始化配置 五.中断分组和中断优先级配置 六.设置串口中断类型并使能串口中断 七.编写中断服务函数函数名格式为函数名格式为 USARTxIRQHandler(x 对应串口号). 八.主函数的实现. 一.时钟使能,包括GPIO的时钟和串口的时钟使能 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //

树莓派GPIO输入输出--控制LED

GPIO引脚有两种模式BOARD和BCM. 1.GPIO输出控制LED 效果图: 代码: (1)使用BOARD模式,GPIO.setmode(GPIO.BOARD).35号引脚在BCM下是GPIO19 (2)将引脚35设置为输出模式,GPIO.setup(35,GPIO.OUT) (3)对GPIO35引脚输出高电平,也可以为GPIO.HIGH 2.GPIO接口获取输入信号 效果图: 电路图 当开关断开时,GPIO23是高点平获取到的输入信号是Ture.当开关按下时GPIO23为接地,获取到的信号