CC2530的通用IO口的输入输出

一、引脚概述

CC2530有40 个引脚。其中,有21个数字I/O端口,其中P0和P1是8 位端口P2仅有5位可以使用。P2端口的5个引脚中,有2个需要用作仿真,有2个需要用作晶振。所以可供我们使用的就只有17个引脚了。

操作微控制器的本质,就是对这些特殊功能寄存器(SFR)进行读写操作,并且某些特殊功能寄存器可以位寻址

每一个特殊功能寄存器本质上就是一个内存单元,为了便于使用,每个特殊功能寄存器都会起一个名字,在程序设计时,只要引入头文件“ioCC2530.h”,就可以直接使用寄存器的名称访问内存地址了。

CC2530的通用I/O端口相关的常用寄存器有下面4个:

<1> PxSEL:端口功能选择,设置端口是通用I/O还是外设功能

<2> PxDIR:作为通用I/O时,用来设置数据的传输方向。

<3> PxINP:作为通用输入端口时,选择输入模式是上拉下拉还是三态

<4> Px:数据端口,用来控制端口的输出或获取端口的输入。

具体的寄存器功能和应用下面会说到。

二、设置寄存器的方法

 <1> 对寄存器的某些位清0而不影响其他位。

使用“&=”将寄存器指定位清0,同时不影响其他位的值。

因为:逻辑“与”操作的特点是,该位有0结果就为0,若为1则保存原来值不变。

Tip:该方法只能操作多位同时清0,或者某一位清0的情况,如果要将寄存器的位既要清0又要置1,则不能采用这种写法。

对于寄存器的第n位的清0操作也可以写成:寄存器 &= ~(0x01<<(n))

 

<2> 对寄存器的某些位置1而不影响其他位。

使用“|=”将寄存器指定位置1,同时不影响其他位的值。

因为:逻辑“或”操作的特点是,该位有1结果就为1,若为0则保存原来值不变。

对于寄存器的第n位的清0操作也可以写成:寄存器 |= (0x01<<(n));

题目:实现2个按键分别控制2个LED灯开关的功能,即SW1按下后松开,LED5亮,SW1再次按下后松开, LED5灭。SW2以同样的方式控制LED6。本题中的引脚图

涉及到的寄存器

端口功能选择寄存器。

端口传输方向设置寄存器。

输入端口需要设置其输入方式的寄存器

端口能够提供“上拉”、“下拉”和“三态”三种输入模式

例子:将P1_2端口为按键输入,设置为输入上拉模式。

1 P1INP &=~0x04  //0000 0100->1111 1011  首先需要将P1_2设置为上/下拉模式
2 P2INP &=~0x40  //0100 0000 ->1011 1111 在将P1_2确定为上拉模式

通用I/O端口寄存器配置的基本思路。

设计思路:

1.设计一个端口初始化函数,对端口的功能进行配置,LED相关的端口设置为输出,按键相关的端口设置为输入,并且配置成上拉模式。

设计端口初始化函数InitPort()。

<1>设置P1SEL寄存器,将P1_2、P1_3和P1_4设置为通用I/O端口。

<2>设置P1DIR寄存器,将P1_3和P1_4设置为输出,将P1_2设置为输入。

<3>设置P0SEL寄存器,将P0_1设置为通用I/O端口。

<4>设置P0DIR寄存器,将P0_1设置为输入。

<5>设置PxINP寄存器,将P0_1和P1_2设置为上拉模式,也可以不设置。

void InitPort()
{
  P1SEL &= ~0x18;         //将P1_3和P1_4设置为通用I/O端口功能
  P1DIR |= 0x18;          //将P1_3和P1_4的端口传输方式设置为输出
  P1SEL &= ~0x04;         //将P1_2设置为通用I/O端口功能
  P1DIR &= ~0x04;         //将P1_2的端口传输方式设置为输入
  P0SEL &= ~0x02;         //将P0_1设置为通用I/O端口功能
  P0DIR &= ~0x02;         //将P0_1的端口传输方式设置为输入
  P0INP &= ~0x02;         //将P0_1的端口输入方式设置为:上拉/下拉
  P1INP &= ~0x04;         //将P1_2的端口输入方式设置为:上拉/下拉
  P2INP &= ~0x60;         //将P0端口和P1端口引脚设置为:上拉
  LED5 = 0;               //上电的时候,LED5不亮
  LED6 = 0;               //上电的时候,LED6不亮
}

2.主函数中扫描按键端口的变化,默认是高电平。当按键按下的时候,为低电平。当出现低电平的时候,需要进行去抖的处理。

  <1>没有按键下时,端口的输入为高电平,当发现该端口有低电平产生时,则有可能会是按键按下,需要经过去抖动处理,如果该端口还是低电平,则确认为按键按下。

<2>在进行按键处理时,先等待按键松开,然后再将相关的LED进行开关状态的取反控制。

void main()
{
  InitPort();
  while(1)
  {
    ScanKeys();
  }
}

最终代码展示

 1 #include "ioCC2530.h"
 2
 3 #define LED5 P1_3
 4 #define LED6 P1_4
 5 #define SW1 P1_2
 6 #define SW2 P0_1
 7 /*===================延时函数=========================*/
 8 void Delay(unsigned int t)
 9 {
10   while(t--);
11 }
12 /*================端口初始化函数======================*/
13 void InitPort()    //输入输出需要单独设置,不可能一下设置完全
14 {
15   P1SEL &= ~0x18;         //将P1_3和P1_4设置为通用I/O端口功能  0001 1000->1110 0111 将P1_3和P1_4设置普通IO口
16   P1DIR |= 0x18;          //将P1_3和P1_4的端口传输方式设置为输出   0001 1000 将P1_3和P1_4设置为输出模式
17   P1SEL &= ~0x04;         //将P1_2设置为通用I/O端口功能   0000 0100->1111 1011 将P1_2设置为普通IO口
18   P1DIR &= ~0x04;         //将P1_2的端口传输方式设置为输入  1111 1011 将P1_2的设置为输入模式。还会有P1INP与P2INP寄存器设置
19   P0SEL &= ~0x02;         //将P0_1设置为通用I/O端口功能   0000 0010 ->1111 1101 将P0_1设置为普通IO口
20   P0DIR &= ~0x02;         //将P0_1的端口传输方式设置为输入   1111 1101  将P0_1设置为输入
21   P0INP &= ~0x02;         //将P0_1的端口输入方式设置为:上拉/下拉  0000 0010->1111 1101  先设置上拉或者下拉模式 P0_1设置为、
22   P1INP &= ~0x04;         //将P1_2的端口输入方式设置为:上拉/下拉  1111 1011  P1_2设置上拉或者下拉模式
23   P2INP &= ~0x60;         //将P0端口和P1端口引脚设置为:上拉  0110 0000 -> 1001 1111  可看寄存器 5与6对应的P0和P1  0为上拉模式
24   LED5 = 0;               //上电的时候,LED5不亮
25   LED6 = 0;               //上电的时候,LED6不亮
26 }
27 /*=================按键扫描函数=======================*/
28 void ScanKeys()
29 {
30   if(SW1 == 0)
31   {                       //发现SW1有低电平信号
32     Delay(100);           //按键去抖动    延时去抖
33     if(SW1 == 0)
34     {                      //确实是有按键动作
35       while(SW1 == 0);    //等待按键1松开
36       //将LED5的灯光开关状态取反
37       LED5 = ~LED5;
38   }
39   if(SW2 == 0)
40   {                       //发现SW2有低电平信号
41     Delay(100);           //按键去抖动
42     if(SW2 == 0)
43     {                     //确实是有按键动作
44       while(SW2 == 0);    //等待按键2松开
45       LED6 = ~LED6;
46     }
47   }
48 }
49 /*=====================主函数=========================*/
50 void main()
51 {
52   InitPort();
53   while(1)
54   {
55     ScanKeys();  //按键扫描函数里面包含了点灯
56   }
57 }

原文地址:https://www.cnblogs.com/yuling520/p/12663094.html

时间: 2024-10-09 12:19:53

CC2530的通用IO口的输入输出的相关文章

STM32中IO口的8中工作模式

该文摘自:http://blog.csdn.net/kevinhg/article/details/17490273 一.推挽输出:可以输出高.低电平,连接数字器件:推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止.高低电平由IC的电源决定.         推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小.效率高.输出既可以向负载灌电流,也

STM32的IO口的8种配置

STM32的IO口的8种配置 1 STM32的输入输出管脚有下面8种可能的配置:(4输入+2输出+2复用输出) ① 浮空输入_IN_FLOATING ② 带上拉输入_IPU ③ 带下拉输入_IPD ④ 模拟输入_AIN ⑤ 开漏输出_OUT_OD ⑥ 推挽输出_OUT_PP ⑦ 复用功能的推挽输出_AF_PP ⑧ 复用功能的开漏输出_AF_OD 1.1 I/O口的输出模式下,有3种输出速度可选(2MHz.10MHz和50MHz),这个速度是指I/O口驱动电路的响应速度而不是输出信号的速度,输出信

掌握所有IO口的外部中断

外部中断配置流程 1.初始化IO口工作在普通IO.上拉输入状态. 2.首先开IO口组中断(P0IE=1.P1IE=1.P2IE=1): 3.开组内对应的具体某IO口中断(P0IEM.P1IEM.P2IEM该寄存器里面的对应位对应相应的IO口): 4.上升沿还是下降沿触发(PICTL寄存器): 5.开CPU总中断EA=1; #include <cc2530.h> void main() { //步骤1 P0SEL &=0xDF;//P05口表示为普通IO口 P0DIR &=0xD

STM32的IO口

STM32 的 IO 口 可以由软件配置成如下 8 种模式: 1.输入浮空 2.输入上拉 3.输入下拉 4.模拟输入 5.开漏输出 6.推挽输出 7.推挽式复用功能 8.开漏复用功能 每个 IO 口可以自由编程,但 IO 口寄存器必须要按 32 位字被访问.STM32 的很多 IO 口都是 5V 兼容的,这些 IO 口在与 5V 电平的外设连接的时候很有优势,具体哪些 IO 口是 5V 兼容的,可以从该芯片的数据手册管脚描述章节查到(I/O Level 标 FT 的就是 5V 电平兼容的). S

FPGA静态时序分析——IO口时序(Input Delay /output Delay)(转载)

转载地址:http://www.cnblogs.com/linjie-swust/archive/2012/03/01/FPGA.html 1.1  概述 在高速系统中FPGA时序约束不止包括内部时钟约束,还应包括完整的IO时序约束和时序例外约束才能实现PCB板级的时序收敛.因此,FPGA时序约束中IO口时序约束也是一个重点.只有约束正确才能在高速情况下保证FPGA和外部器件通信正确. 1.2  FPGA整体概念 由于IO口时序约束分析是针对于电路板整个系统进行时序分析,所以FPGA需要作为一个

STM32F030如何正确配置IO口的复用功能

本文所使用的单片机型号为STM32F030C8T6. 在030系列的单片机中,PA2引脚除了作为普通的IO引脚用作输入输出功能以外,还可以作为内部外设串口1,串口2,定时器15通道1这三个外设的功能引脚.那么如何配置这个IO口用作哪一种外设的功能引脚呢?查找STM32F030数据手册的31-32页,看到有这么两个表格, <Table 12. Alternate functions selected through GPIOA_AFR registers for port A> <Tabl

单片机IO口标准双向,推挽,高阻,开漏模式 ,LED感应亮灭实验【原创!】

单片机IO口标准双向,推挽,高阻,开漏模式 ,LED感应亮灭实验  十一长假在家快烂了,没事儿做,DIY技术搞起来!  [关于12C增强型单片机I/O口的工作类型实验研究] 文中动画视频效果下载: STC单片机头文件[51CTO-->单片机-->LED感应亮灭实验] 下载链接 链接:http://pan.baidu.com/s/1pJKK4w7   密码:a0re  1.用强推模式,点亮一个LED  /* 工程创建MCU选取,Atmel 89C55 单片机:STC12C4052AD 晶振:无要

巧妙的IO口按键扫描方法

在做项目的时候,我们经常要用到比较多的按键,而且IO资源紧张,于是我们就想方设法地在别的模块中节省IO口,好不容易挤出一两个IO口,却发现仍然不够用,实在没办法了就添加一个IC来扫键.一个IC虽然价格不高,但对于大批量生产而且产品利润低的厂家来说,这是一笔不菲的开支!那,我们能不能想到比较好的扫键方法:用最少的IO口,扫最多的键?可以吗?举个例:给出5个IO口,能扫多少键?有人说是2*3=6个,如图一: 对,大部分技术参考书都这么做,我们也经常这样做:用3个IO口作行扫描,2个IO作列检测(为方

【STM】IO口配置库函数、寄存器、位操作方式

库函数函数: 一个初始化函数:初始化一个或者多个IO口(同一组)的工作模式.输出类型.速度以及上下拉方式 1 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); 2 typedef struct 3 { 4 uint32_t GPIO_Pin//指定要初始化的端口 5 GPIOMode_TypeDef GPIO_Mode;//端口模式 6 GPIOSpeed_TypeDef GPIO_Speed;//速度