zoukankan      html  css  js  c++  java
  • 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 }
    View Code
  • 相关阅读:
    登录认证,全选,反选
    jQuery基础知识
    jQuery
    js练习
    BOM DOM
    mysql视图
    用CrwalSpider爬取boss直聘
    设置piplines.py数据管道
    在middlewares.py文件里添加代理ip
    爬取豆瓣电影
  • 原文地址:https://www.cnblogs.com/yuling520/p/12663094.html
Copyright © 2011-2022 走看看