第7章 CC2530按键

来源:互联网 发布:qq变声软件下载 编辑:程序博客网 时间:2024/06/04 00:22

1 理论分析

1.1 CC2530 通用 IO 详解

用作通用 I/O 时,引脚可以组成 3 个 8 位端口,端口 0、端口 1 和端口 2,表示为 P0、P1 和 P2。其中,P0 和 P1 是完全的 8 位端口,而 P2 仅有 5 位可用。所有的端口均可以通过 SFR 寄存器 P0、P1 和 P2 位寻址和字节寻址。每个端口引脚都可以单独设置为通用 I/O 或外部设备 I/O。
除了两个高驱动输出口 P1.0 和 P1.1 各具备 20 mA 的输出驱动能力之外,所有的输出均具备 4 mA 的驱动能力。
寄存器 PxSEL,其中 x 为端口的标号 0~2,用来设置端口的每个引脚为通用 I/O或者是外部设备 I/O 信号。作为缺省的情况,每当复位之后,所有的数字输入/输出引脚都设置为通用输入引脚。
在任何时候,要改变一个端口引脚的方向,就使用寄存器 PxDIR 来设置每个端口引脚为输入或输出。因此只要设置 PxDIR 中的指定位为 1,其对应的引脚口就被设置为输出了。
当读取端口寄存器 P0、P1 和 P2 的值,不管引脚配置如何,输入引脚上的逻辑值都被返回。这在执行读-修改-写指令期间不适用。读-修改-写指令是:ANL,ORL,XRL,JBC,CPL,INC,DEC,DJNZ,MOV,CLR 和 SETB。在一个端口寄存器上操作,以下是正确的:当目标是端口寄存器 P0、P1 或 P2 中一个独立的位,寄存器的值,而不是引脚上的值,被读取、修改并写回端口寄存器。
用作输入时,通用 I/O 端口引脚可以设置为上拉、下拉或三态操作模式。作为缺省的情况,复位之后,所有的端口均设置为带上拉的输入。要取消输入的上拉或下拉功能,就要将 PxINP 中的对应位设置为 1。I/O 端口引脚 P1.0 和 P1.1 没有上拉/下拉功能。
注意:配置为外设 I/O 信号的引脚没有上拉/下拉功能,即使外设功能是一个输入。在电源模式 PM1、PM2 和 PM3 下 I/O 引脚保留当进入 PM1/PM2/PM3 时设置的I/O 模式和输出值(如果可用的话)。

1.2 流程图

下面是很实验的流程图,大家可以结合这个图来学习编写程序。

这里写图片描述

图1

2 实验详解

2.1实验目的

1)、通过实验掌握CC2530芯片GPIO的配置方法
2)、掌握Led驱动电路及开关Led的原理
3)、掌握检测按键的方法

2.2实验设备

硬件:PC 机一台 ZB2530(底板、核心板、仿真器、USB 线) 一套
软件:2000/XP/win7 系统,IAR 8.10 集成开发环境

2.3实验相关电路图

这里写图片描述

图2 LED电路图

这里写图片描述

图3 按键电路图

按键S1接在P0_1上,当按键松开时,P0_1通过电阻上拉为高电平,当按键S1按下时, P0_1为低电平。

2.4实验分析

本实验用到的通用 IO,只需要配置 PxSEL、PxDIR、PxINP 这三个寄存器,接下来对它们进行配置:
(1) 希望配置 P0.1 端口为:通用 IO、上拉、输入;
P1.0、P1.1、P0.4 端口为:通用 IO、输出;
(2)PxSEL、PxDIR、PxINP 这三个寄存器作用和配置方法如表1、2、3、4所示(以P1为例):

表1 端口1的功能选择

这里写图片描述

表2 端口1的方向

这里写图片描述

表3 端口1的输入模式

这里写图片描述

(3) 所以,按照表格寄存器的内容,对LED配置如下:
P1SEL &=~0x01; //配置P1.0为通用IO口,默认为0的,可以不设
P1DIR |= 0x01; //P10 定义为输出
按键S1配置如下:
P0SEL &= ~0X02; //设置P01为普通IO口
P0DIR &= ~0X02; //按键在P01 口,设置为输入模式
P0INP &= ~0x02; //打开P01上拉电阻,不影响

2.5参考代码

#include <ioCC2530.h> #define uint unsigned int #define uchar unsigned char //定义控制LED灯的端口 #define LED1 P1_0 //LED1为P1.0口控制 #define KEY1 P0_1 //KEY1为P0.1口控制 //函数声明  void Delayms(uint); //延时函数 void InitLed(void); //初始化LED1 void KeyInit(); //按键初始化 uchar KeyScan();//按键扫描程序 /***************************** 延时函数 *****************************/ void Delayms(uint xms) //i=xms 即延时i毫秒 {     uint i,j;     for(i=xms;i>0;i--)     for(j=587;j>0;j--); } /*****************************       LED初始化函数 *****************************/ void InitLed(void) {     P1DIR |= 0x01; //P1_0定义为输出     LED1 = 1; //LED1灯熄灭      } /****************************      按键初始化函数 *****************************/ void InitKey() {   P0SEL &= ~0X2; //设置P01为普通IO口     P0DIR &= ~0X2; //按键在P01 口,设置为输入模式    P0INP &= ~0x2; //打开P01上拉电阻,不影响 } /****************************      按键检测函数 *****************************/ uchar KeyScan(void) {   if(KEY1==0)   {     Delayms(10);     if(KEY1==0)     {       while(!KEY1); //松手检测       return 1; //有按键按下     }   }   return 0; //无按键按下 } /***************************       主函数 ***************************/ void main(void) {   InitLed(); //调用初始化函数   InitKey();   while(1)   {    if(KeyScan())//按键改变LED状态      LED1=~LED1;          } } 

2.6实验现象

通过按键,改变LED的状态。

2.7 实验总结

通过本实验,大家需要掌握以下 4 点:
 CC2530 通用 IO 使用需要配置相关寄存器;
 CC2530 通用 IO 寄存器的类型以及每个类型如何配置;
 除了两个高驱动输出口 P1.0 和 P1.1 各具备 20 mA 的输出驱动能力之外,所有的输出均具备 4 mA 的驱动能力;
 在任何时候,要改变一个端口引脚的方向,就使用寄存器 PxDIR 来设置每个端口引脚为输入或输出。因此只要设置 PxDIR 中的指定位为 1,其对应的引脚口就被设置为输出了。

本章参考代码

点击进入

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 卧虎电视连续剧在线播放 卧虎剧情分集介绍 卧虎在线播放 卧虎床垫多少钱 藏龙卧虎紫砂杯 盘龙卧虎高山顶剧情介绍 电视连续剧卧虎免费 卧虎床垫怎么样 晋剧卧虎令全本 电视连续剧卧虎全集 卧蝉眼 卧蚕是什么 卧蚕和眼袋区别 卧蚕眼袋区别 卧蚕眼袋 眼袋与卧蚕对照图 卧蚕图片 眼袋卧蚕 卧蚕与没卧蚕对照图 卧蚕什么意思 一张图说明卧蚕和眼袋 眼袋和卧蚕区别 卧蚕怎么快速练出来 卧蚕眉 怎么区分卧蚕和眼袋 5分钟卧蚕训练法 卧蚕怎么画 卧蚕眉图片 卧蚕眼图片 眼袋卧蚕区别图 卧蚕不笑时样子图片 做个卧蚕多少钱 什么是卧蚕 卧蚕眼袋图片 卧蚕笔 什么卧蚕 有卧蚕和没卧蚕 怎样区分卧蚕和眼袋 韩式卧蚕眼 眼睛 卧蚕 卧蚕变大