第2课  CC2530的通用I/O端口输入和输出控制

XMF393 / 广东职业技术学院  欧浩源

【视频教程】:将寄存器中某些为清0或置1

【视频教程】:CC2530通用I/O及相关寄存器

【视频教程】:LED灯闪烁实现的源码分析

【视频教程】:基于CC2530的跑马灯实现

【视频教程】:按键的工作原理与程序设计思路

【视频教程】:按键控制LED灯开关

【视频教程】:按键控制跑马灯的运行与暂停

一、CC2530的引脚概述

CC2530微控制器采用QFN40封装,有40 个引脚。其中,有21个数字I/O端口,其中P0和P1是8 位端口P2仅有5位可以使用。这21个端口均可以通过编程进行配置。实际上,在P2端口的5个引脚中,有2个需要用作仿真,有2个需要用作晶振,你在CC2530的开发中真正能够使用的只有17个引脚

在微控制器内部,有一些特殊功能的存储单元,这些单元用来存放控制微控制器内部器件的命令、数据或运行过程中的一些状态信息,这些寄存器统称为“特殊功能寄存器(SFR)”。操作微控制器的本质,就是对这些特殊功能寄存器进行读写操作,并且某些特殊功能寄存器可以位寻址

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

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

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

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

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

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

二、设置寄存器中某些位的方法

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

例如:寄存器P1TM的当前值是0x6c,现需要将该寄存器的第1位、第3 位和第5位设置为0,同时不能影响该寄存器其他位的值,那么,在C语言中应该怎么编写代码呢?

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

正确写法:P1TM &= ~0x2A;

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

首先将字节 0000 0000要操作的位设置为1,即000 00,在将该数值取反,即111 11,也就是~0x2A。再将该值与寄存器P1TM“相与”,那么有0的位,即1、3、5位将被清0,其余的位会保持原来的值不变。

所以:P1TM的当前值为0x6c,即0110 1100,

0110 1100 && 111 11 = 010 10,即1、3、5位清0,其他位不变。

<注意>:该方法只能操作多位同时清0,或者某一位清0的情况,如果要将寄存器的位既要清0又要置1,则不能采用这种写法。(其中原因自己思考一下)

在不少嵌入式应用的源码程序中,对于寄存器的第n位的清0操作也可以写成:寄存器 &= ~(0x01<<(n));其道理是一样的。

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

例如:寄存器P1TM的当前值是0x6c,现需要将该寄存器的第1位、第4位和第5位设置为1,同时不能影响该寄存器其他位的值,那么,在C语言中应该怎么编写代码呢?

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

正确写法:P1TM |= 0x32;

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

首先将字节 0000 0000要操作的位设置为1,即00 000,也就是0x32。 再将该值与寄存器P1TM“相或”,那个有1的位,即1、4、5位将被设置为1,其余的位会保持原来的值不变。

所以:P1TM的当前值为0x6c,即0110 1100,

 0110 1100 || 00 000 = 01 110,即1、4、5位置1,其他位不变。

同样要注意:该方法只能操作多位同时置1,或者某一位置1的情况。

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

三、实训案例:按键输入控制灯光输出状态

【1】准备工作。

引入CC2530必要的头文件“ioCC2530.h”,定义相关变量等。

【2】端口功能选择。

微控制器的大部分I/O端口都是功能复用的,在使用的时候需要通过功能选择寄存器来配置端口的功能。

【3】端口传输方向设置。

【4】对于输入的端口要设置其输入方式。

输入方式用来从外界器件获取输入的电信号,当CC2530的引脚为输入端口时,该端口能够提供“上拉”、“下拉”和“三态”三种输入模式,可以通过编程进行设置。在本次实训中,实际上不需要对P0_1和P1_2引脚进行输入方式的设置,因为CC2530复位后,各个I/O端口默认使用的就是上拉模式。

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

【6】设计端口初始化函数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设置为上拉模式,也可以不设置。

【7】设计键盘扫描函数ScanKeys()。

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

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

【8】主函数的实现。

至此,大功搞成,连接仿真器,进行编译调试。

【附件】:本实训源代码。

  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端口功能
  16. P1DIR |= 0x18; //将P1_3和P1_4的端口传输方式设置为输出
  17. P1SEL &= ~0x04; //将P1_2设置为通用I/O端口功能
  18. P1DIR &= ~0x04; //将P1_2的端口传输方式设置为输入
  19. P0SEL &= ~0x02; //将P0_1设置为通用I/O端口功能
  20. P0DIR &= ~0x02; //将P0_1的端口传输方式设置为输入
  21. P0INP &= ~0x02; //将P0_1的端口输入方式设置为:上拉/下拉
  22. P1INP &= ~0x04; //将P1_2的端口输入方式设置为:上拉/下拉
  23. P2INP &= ~0x60; //将P0端口和P1端口引脚设置为:上拉
  24. LED5 = ; //上电的时候,LED5不亮
  25. LED6 = ; //上电的时候,LED6不亮
  26. }
  27. /*=================按键扫描函数=======================*/
  28. void ScanKeys()
  29. {
  30. if(SW1 == )
  31. { //发现SW1有低电平信号
  32. Delay(); //按键去抖动
  33. if(SW1 == )
  34. { //确实是有按键动作
  35. while(SW1 == ); //等待按键1松开
  36. //将LED5的灯光开关状态取反
  37. LED5 = ~LED5;
  38. }
  39. if(SW2 == )
  40. { //发现SW2有低电平信号
  41. Delay(); //按键去抖动
  42. if(SW2 == )
  43. { //确实是有按键动作
  44. while(SW2 == ); //等待按键2松开
  45. LED6 = ~LED6;
  46. }
  47. }
  48. }
  49. /*=====================主函数=========================*/
  50. void main()
  51. {
  52. InitPort();
  53. while()
  54. {
  55. ScanKeys();
  56. }
  57. }

CC2530入门教程-02】CC2530的通用I/O端口输入和输出控制的更多相关文章

  1. 【CC2530入门教程-02】CC2530的通用I/O端口输入和输出控制

    第2课  CC2530的通用I/O端口输入和输出控制 小蜜蜂科教 / 广东职业技术学院  欧浩源 [通用I/O端口视频教程:https://v.qq.com/x/page/x0793aol7us.ht ...

  2. 【CC2530入门教程-增强版】基础技能综合实训案例(基础版)-上位机源码

    [CC2530入门教程-增强版]基础技能综合实训案例(基础版)-上位机源码 广东职业技术学院  欧浩源 一.需求分析 按照指定参数打开串口,与测控终端建立数据传输通道,并根据应用要求实现程序逻辑,具体 ...

  3. 【Zigbee技术入门教程-02】一图读懂ZStack协议栈的基本架构和工作机理

    [Zigbee技术入门教程-02]一图读懂ZStack协议栈的基本架构和工作机理 广东职业技术学院  欧浩源  ohy3686@foxmail.com Z-Stack协议栈是一个基于任务轮询方式的操作 ...

  4. 【Zigbee技术入门教程-02】一图读懂ZStack协议栈的核心思想与工作机理

    [Zigbee技术入门教程-02]一图读懂ZStack协议栈的核心思想与工作机理 广东职业技术学院  欧浩源   Z-Stack协议栈是一个基于任务轮询方式的操作系统,其任务调度和资源分配由操作系统抽 ...

  5. 【CC2530入门教程-01】IAR集成开发环境的建立与项目开发流程

    [引言] 本系列教程就有关CC2530单片机应用入门基础的实训案例进行分析,主要包括以下6部分的内容:1.CC2530单片机开发入门.2.通用I/O端口的输入和输出.3.外部中断初步应用.4.定时/计 ...

  6. 【CC2530入门教程-01】CC2530微控制器开发入门基础

    [引言] 本系列教程就有关CC2530单片机应用入门基础的实训案例进行分析,主要包括以下6部分的内容:[1]CC2530微控制器开发入门基础.[2]通用I/O端口的输入和输出.[3]外部中断初步应用. ...

  7. 【CC2530入门教程-03】CC2530的中断系统及外部中断应用

    第3课  CC2530的中断系统及外部中断应用 广东职业技术学院  欧浩源 一.中断相关的基础概念  内核与外设之间的主要交互方式有两种:轮询和中断. 轮询的方式貌似公平,但实际工作效率很低,且不能及 ...

  8. 【CC2530入门教程-04】CC2530的定时/计数器原理与应用

    第4课  CC2530的定时/计数器原理与应用 广东职业技术学院  欧浩源 一.定时/技术器的基本原理 定时/计数器,是一种能够对内部时钟信号或外部输入信号进行计数,当计数值达到设定要求时,向CPU提 ...

  9. 【CC2530入门教程-05】CC2530的串行接口原理与应用

    第5课  CC2530的串行接口原理与应用 广东职业技术学院  欧浩源 一.并行通信与串行通信 微控制器与外设之间的数据通信,根据连线结构和传送方式的不同,可以分为两种:并行通信和串行通信. 并行通信 ...

随机推荐

  1. Java AOP (2) runtime weaving 【Java 切面编程 (2) 运行时织入】

    接上一篇 Java AOP (1) compile time weaving [Java 切面编程 (1) 编译期织入] Dynamic proxy   动态代理 Befor talking abou ...

  2. java-cef嵌入基于Chrome内核浏览器,做页面爬虫(可以尽在ajax异步请求数据)

    1 CentOS 7.0 上安装和配置 VNC 服务器 2.1 2.1.1 首先,我们需要一个可用的桌面环境(X-Window),如果没有的话要先安装一个. 注意:以下命令必须以 root 权限运行. ...

  3. java中的引用传递(同样适用于JS)

    1  java中的数据类型: 有8种基本数据类型,分别为:byte(1),boolean(1),char(2),short(2),int(4),long(8),float(4),double(8)   ...

  4. zoj1654 Place the Robots 二分图最大匹配

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=654 将每一行的包含空地的区域编号 再将每一列的包含空地的区域编号 然 ...

  5. 学习笔记:javascript 表单对象(form)

    Form 对象属性 属性 描述 acceptCharset 服务器可接受的字符集. action 设置或返回表单的 action 属性. enctype 设置或返回表单用来编码内容的 MIME 类型. ...

  6. 区别client、offset、scroll系列以及event的几个距离属性

    element元素结点属性 一. offset系列 1.offsetWidth 和offsetHeight element.offsetWidth是一个只读属性,它包括了: css width + p ...

  7. List的多维度排序案例演示~

    文章也已同步到我的csdn:http://blog.csdn.net/u012881584/article/details/72377510 关于List的多维度排序. 日常工作中有很多关于list的 ...

  8. 【JavaScript OPP基础】---新手必备

    今天和大家分享一下近期整理的有关JavaScriptOPP的基础知识~~~我们一起来学习一下-- JavaScriptOPP基础 一.面向对象编程OOP1.语言的分类:面向机器:汇编语言面向过程:C语 ...

  9. 使用 CKEditor 上传图片, 粘贴屏幕截图

    之前写过wangEditor,那真是好用,文档也清晰,半天就搞定了,无奈没有对应license,只好选择别的. 外语一般,阅读理解都靠蒙.CKEditor官方文档看的我云里雾里,国内的博客比较少,经过 ...

  10. Java反射机制剖析(四)-深度剖析动态代理原理及总结

    动态代理类原理(示例代码参见java反射机制剖析(三)) a)  理解上面的动态代理示例流程 a)  理解上面的动态代理示例流程 b)  代理接口实现类源代码剖析 咱们一起来剖析一下代理实现类($Pr ...