一、引脚概述

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端口为按键输入,设置为输入上拉模式。

 P1INP &=~0x04  //0000 0100->1111 1011  首先需要将P1_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 = ; //上电的时候,LED5不亮
LED6 = ; //上电的时候,LED6不亮
}

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

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

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

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

最终代码展示

 #include "ioCC2530.h"

 #define LED5 P1_3
#define LED6 P1_4
#define SW1 P1_2
#define SW2 P0_1
/*===================延时函数=========================*/
void Delay(unsigned int t)
{
while(t--);
}
/*================端口初始化函数======================*/
void InitPort() //输入输出需要单独设置,不可能一下设置完全
{
P1SEL &= ~0x18; //将P1_3和P1_4设置为通用I/O端口功能 0001 1000->1110 0111 将P1_3和P1_4设置普通IO口
P1DIR |= 0x18; //将P1_3和P1_4的端口传输方式设置为输出 0001 1000 将P1_3和P1_4设置为输出模式
P1SEL &= ~0x04; //将P1_2设置为通用I/O端口功能 0000 0100->1111 1011 将P1_2设置为普通IO口
P1DIR &= ~0x04; //将P1_2的端口传输方式设置为输入 1111 1011 将P1_2的设置为输入模式。还会有P1INP与P2INP寄存器设置
P0SEL &= ~0x02; //将P0_1设置为通用I/O端口功能 0000 0010 ->1111 1101 将P0_1设置为普通IO口
P0DIR &= ~0x02; //将P0_1的端口传输方式设置为输入 1111 1101 将P0_1设置为输入
P0INP &= ~0x02; //将P0_1的端口输入方式设置为:上拉/下拉 0000 0010->1111 1101 先设置上拉或者下拉模式 P0_1设置为、
P1INP &= ~0x04; //将P1_2的端口输入方式设置为:上拉/下拉 1111 1011 P1_2设置上拉或者下拉模式
P2INP &= ~0x60; //将P0端口和P1端口引脚设置为:上拉 0110 0000 -> 1001 1111 可看寄存器 5与6对应的P0和P1 0为上拉模式
LED5 = ; //上电的时候,LED5不亮
LED6 = ; //上电的时候,LED6不亮
}
/*=================按键扫描函数=======================*/
void ScanKeys()
{
if(SW1 == )
{ //发现SW1有低电平信号
Delay(); //按键去抖动 延时去抖
if(SW1 == )
{ //确实是有按键动作
while(SW1 == ); //等待按键1松开
//将LED5的灯光开关状态取反
LED5 = ~LED5;
}
if(SW2 == )
{ //发现SW2有低电平信号
Delay(); //按键去抖动
if(SW2 == )
{ //确实是有按键动作
while(SW2 == ); //等待按键2松开
LED6 = ~LED6;
}
}
}
/*=====================主函数=========================*/
void main()
{
InitPort();
while()
{
ScanKeys(); //按键扫描函数里面包含了点灯
}
}

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

  1. zigbee通用IO口小作业

    独立新建工程并编写.编译代码,实现按键控制流水灯运行,完成以下任务要求: [1]程序开始运行时,D4.D3.D6.D5灯全亮一会,然后全灭一会,开始进入流水灯. [2]流水灯的运行过程为:D4灯亮,其 ...

  2. stm32 HAL库笔记(一)——普通IO口

    今天介HAL库操作普通IO口,就是输入/输出. 如果用CubeMX配置io工程,打开以后可以看到如下代码: GPIO_InitTypeDef GPIO_Initure; __HAL_RCC_GPIOB ...

  3. STM32中IO口的8中工作模式

    该文摘自:http://blog.csdn.net/kevinhg/article/details/17490273 一.推挽输出:可以输出高.低电平,连接数字器件:推挽结构一般是指两个三极管分别受两 ...

  4. 转载电子发烧友网---STM32的IO口灌入电流和输出驱动电流

    刚开始学习一款单片机的时候一般都是从操作IO口开始的,所以我也一样,先是弄个流水灯. 刚开始我对STM32的认识不够,以为是跟51单片机类似,可以直接操作端口,可是LED灯却没反应,于是乎,仔细查看资 ...

  5. STM32的IO口的8种配置

    STM32的IO口的8种配置 1 STM32的输入输出管脚有以下8种可能的配置:(4输入+2输出+2复用输出) ① 浮空输入_IN_FLOATING ② 带上拉输入_IPU ③ 带下拉输入_IPD ④ ...

  6. 51单片机I/O引脚IO口工作原理

    51单片机I/O引脚IO口工作原理 一.51单片机管脚p0.p1.p2.p3口区别如下: 1.意思不同P0口作输出口用时,需加上拉电阻.P0口有复用功能.当对外部存储器进行读写操作时,P0口先是提供外 ...

  7. 【转载】FPGA静态时序分析——IO口时序

    转自:http://www.cnblogs.com/linjie-swust/archive/2012/03/01/FPGA.html 1.1  概述 在高速系统中FPGA时序约束不止包括内部时钟约束 ...

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

    1.1  概述 在高速系统中FPGA时序约束不止包括内部时钟约束,还应包括完整的IO时序约束和时序例外约束才能实现PCB板级的时序收敛.因此,FPGA时序约束中IO口时序约束也是一个重点.只有约束正确 ...

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

    本文所使用的单片机型号为STM32F030C8T6. 在030系列的单片机中,PA2引脚除了作为普通的IO引脚用作输入输出功能以外,还可以作为内部外设串口1,串口2,定时器15通道1这三个外设的功能引 ...

随机推荐

  1. 第十节:xml、re、logging模块

    XML模块:(用到的时候再看)tree=xml.parse('xmltest.xml')root= tree.getroot()print(root.tag) 打印对象的标签root.attrib 获 ...

  2. 一站式WebAPI与认证授权服务

    保护WEBAPI有哪些方法? 微软官方文档推荐了好几个: Azure Active Directory Azure Active Directory B2C (Azure AD B2C)] Ident ...

  3. WinForm:API

    一.WndProc:  主要用在拦截并处理系统消息和自定义消息 比如:windows程序会产生很多消息,比如你单击鼠标,移动窗口都会产生消息.这个函数就是默认的消息处理函数.你可以重载这个函数来制定自 ...

  4. U - Obtain a Permutation CodeForces - 1294E 思维

    题解: 注意每一列与每一列之间互不影响,所以贪心地求出没一列的最小操作值,然后累加起来. 怎么求没一列的最小值呢?维护一个数组same表示其中same[i]=j表示将该序列向上翻滚i次有j个元素归位, ...

  5. XML-解析失败原因初步分析

    更多精彩文章请关注公众号『大海的BLOG』 首先放出有问题的代码 之所以直入主题是因为肝完了事情,急需入睡.hiahia hiboard:updateUrl="https://xxx.com ...

  6. 在vue中使用ztree树插件

    插件资源及api:树官网 本事例是在vue3.0+中演示,事例是实际项目中正在用的组件所以部分打了马赛克. 1.插件准备(提前准备好插件文件) 可以直接在官网下载,搭建好脚手架后将准备好的文件放在li ...

  7. mysql相关面试题(一)

    1.主键自增,姓名字段重复.删除重复的姓名数据,只留一条 -- Every derived table must have its own alias 子查询要起别名 -- 思路:分组后只会显示一条, ...

  8. MySQL服务端恶意读取客户端文件漏洞 (DDCTF2019和国赛均涉及到这个漏洞)

    mysql协议中流程和go语言实现的恶意mysql服务器:https://blog.csdn.net/ls1120704214/article/details/88174003 poc :https: ...

  9. 程序选择结构if和switch的定义以及使用方法

       什么是if选择结构 if选择结构是根据条件判断之后在做处理 基本的if选择结构的语法 if(条件){//条件为真则执行代码1,否则不执行  //代码块1 }   if-else选择结构 为什么使 ...

  10. Vue自定义指令 数据传递

    在项目开发过程中,难免会遇到各种功能需要使用Vue自定义指令--directive 去实现 .关于directive的使用方式这里就不做过多的介绍了,Vue官方文档中说的还是听明白的.今天讲讲在使用V ...