CC2530的通用IO端口(GPIO)输入和输出控制
前言:
单片机基本结构:
单片机的程序开发过程:
单片机的程序运行:
目录
- 1.CC2530引脚概述
- 1.1.CC2530的通用I/O端口(GPIO)相关的常用寄存器
- 1.2.设置寄存器中某些位的方法
- 1.2.1.对寄存器的某些位清0而不影响其他位
- 1.2.2.对寄存器的某些位置1而不影响其他位
- 2.案例:按键输入控制灯光输出状态
1.CC2530引脚概述
CC2530微控制器采用QFN40封装,有40个引脚,21个数字IO端口
P0、P1为8位端口,P2为5位端口,此21个端口均可以通过编程进行配置
其中P1_0、P1_1具有20mA的输出驱动能力,其余部分只有4mA
特殊功能寄存器(SFR):微控制器内部的特殊功能的存储单元,用来存放控制微控制器内部器件的命令、数据或运行过程中的一些状态信息,操作微控制寄存器的本质:对SFR进行读写操作,某些SFR可以进行位寻址操作。
每一个SFR的本质:一个内存单元,使用内存地址标识内存单元
为了方便记忆与使用,每个SFR都会起一个名字,在程序设计时,只要引入头文件ioCC2530.h
,就可以直接使用寄存器的名称访问内存地址
1.1.CC2530的通用I/O端口(GPIO)相关的常用寄存器
PxSEL:端口功能选择,设置端口是通用I/O或外设I/O
x端口号:0、1、2,可位寻址
默认情况下,复位后,所有数字输入/输出引脚都配置为通用输入引脚
0:通用I/O
1:外设I/O
PxDIR:作为通用I/O时,用来设置数据的传输方向
x端口号:0、1、2,可位寻址
P2DIR只有第0位至第4位是端口2的方向选择控制位,第6位和第7位是端口0外设优先级控制位
0:输入
1:输出
PxINP:作为通用输入端口时,选择输入模式时上拉、下拉还是三态
默认情况下,复位后,输入配置为带有上拉的输入。如果要取消输入端口的上拉或下拉功能,必须将PxINP中的相应位设置为1
P2INP中,第0位至第4位是端口2的输入模式选择位,第5位至第7位是端口0、端口1、端口2的上下拉选择位
1.2.设置寄存器中某些位的方法
1.2.1.对寄存器的某些位清0而不影响其他位
使用 &=
将寄存器指定位清0,同时不影响其他位的值
例子: 寄存器P1TM当前值为0x6c,现需要将该寄存器的第1位、第3位和第5位设置为0,同时不影响该寄存器其他位的值,使用C语言实现:
分析:
将0000 0000中要操作的位置1为0010 1010,将该数取反为1101 0101,十六进制为 ~0x2A,再将该值与寄存器P1TM相与,就可实现要求
P1TM当前值为0x6c,二进制为0110 1100,相与为0110 1100 && 1101 0101 = 0100 0100,实现1、3、5位清0,而其他位不变正确写法:
P1TM &= ~0x2A;
注意:
该方法只适用于操作多位同时清0或某一位清0的情况
1.2.2.对寄存器的某些位置1而不影响其他位
使用 |=
将寄存器指定位置1,同时不影响其他位的值
例子: 寄存器P1TM的当前值为0x6c,现需要将该寄存器的第1位,第4位和第5位置1,同时不能影响其他位的值,使用C语言实现
分析:
将0000 0000中要操作的位置1为0011 0010,十六进制为 0x32,再将该值与寄存器P1TM相或,就可实现要求
0110 1100 || 0011 0010 = 0111 1110,实现1、4、5位置1,而其他位不变正确写法:
P1TM |= 0x32;
注意:
该方法只适用于多位同时置1或某一位置1的情况
2.案例:按键输入控制灯光输出状态
要求:
在ZigBee的小模块上,实现2个案件分别控制2个LED灯开关的功能,即SW1按下后松开,LED5亮,SW1再次按下后松开,LED5灭。SW2以同样的方式控制LED6。电路连接如图:
设计思路:
1.设计一个端口初始化函数,对端口的功能进行配置,LED相关的端口设置为输出,按键相关的端口设置为输入,并且配置成上拉模式
2. 在主函数中不断扫描按键端口的变化,没有按键按下,该端口为高电平,如果有按键按下,则为低电平。当发现按键端口有低电平时,先要进行去抖动处理
3. 因为一个按键有“开灯”和“关灯”两种状态,需要定义一个按键状态的全局变量来处理按键按下的时候,应该是亮LED还是关LED
- 准备工作
引入CC2530必要的头文件,定义相关变量等
#include "ioCC2530.h"#define LED5 P1_3
#define LED6 P1_4
#define SW1 P1_2
#define SW2 P0_1unsigned char Stat_key = 0; //按键状态全局变量/*===================延时函数======================*/
void Delay(unsigned int t){while(t--);
}
- 端口功能选择
微控制器的大部分I/O口都是功能复用的,在使用的时候需要通过功能选择寄存器来配置端口的功能
CC2530的特殊功能寄存器PxSEL是端口功能选择寄存器
PxSEL寄存器(端口功能选择):
P1SEL &= ~0x1c;
//将P1_2、P1_3、P1_4设置为通用I/O口
P0SEL &= ~0X02;
//将P0_1设置为通用I/O口
- 端口传输方向设置
PxDIR寄存器(端口方向设置):
P1DIR |= 0x18;
//将P1_3和P1_4端口设置为输出
P1DIR &= ~0x04;
//将P1_2设置为输入
P0DIR &= ~0x02;
//将P0_1设置为输入
- 对于输入的端口
输入方式用来从外界器件获取输入的电信号,当CC2530的引脚为输入端口时,该端口能够提供“上拉”、“下拉”和“三态”三种输入模式,可以通过编程进行设置。在本案例中,实际上不需要对PO_ 1和P1_ 2引脚进行输入方式的设置,因为CC2530复位后,各个/O端口默认使用的就是上拉模式
P0INP寄存器和P1INP寄存器(端口输入方式设置):
P2INP寄存器(端口输入方式设置):
- 设计端口初始化函数InitPort()
- 设置P1SEL寄存器,将P1_2、P1_3和P1_4设置为通用I/O口
- 设置P1DIR寄存器,将P1_3和P1_4设置为输出,将P1_2设置为输入
- 设置P0SEL寄存器,将P0_1设置为通用I/O口
- 设置P0DIR寄存器,将P0_1设置为输入
- 将PxINP寄存器,将P1_3和P1_4设置为上拉模式,也可以不设置
- 设计键盘扫描函数ScanKeys()
- 没有按键按下,端口输入为高电平,当端口有低电平产生是,则有可能会是按键按下,需要经过去抖动处理,如果该端口还是低电平,则确认为有按键按下
- 在进行按键处理时,先等待按键松开,然后根据灯光状态标志Stat_key进行开灯或关灯动作
Stat_key为灯光状态标志字节,其第0位和第1位分别标志着LED5和LED6的当前状态
该字节的第0位为1时,LED5当前已亮
该字节的第0位为0时,LED5当前熄灭
该字节的第1位为1时,LED6当前已亮
该字节的第1位为0时,LED6当前熄灭
- 主函数实现
/*===========================主函数=====================*/
void main(){InitPort();while(1){ScanKeys();}
}
- 完整版源代码
#include "ioCC2530.h"#define LED5 P1_3
#define LED6 P1_4
#define SW1 P1_2
#define SW2 P0_1unsigned char Stat_key = 0; //按键状态全局变量/*===========================延时函数======================*/
void Delay(unsigned int t){while(t--);
}
/*===========================端口初始化函数===============*/
void InitPort(){P1SEL &= ~0x18; //将P1_3和P1_4设置为通用I/O口P1DIR |= 0x18; //将P1_3和P1_4设置为输出方式P1SEL &= ~0x04; //将P1_2设置为通用I/0口P1DIR &= ~0x04; //将P1_2设置为输入方式P0SEL &= ~0x02; //将P0_1设置为通用I/0口P0DIR &= ~0x02; //将P0_2设置为输入方式P0INP &= ~0x02; //将P0_2输入方式设置为上拉/下拉P1INP &= ~0x04; //将P1_2输入方式设置为上拉/下拉P2INP &= ~0x60; //将P0端口和P1端口引脚设置为上拉LED5 = 0; //上电的时候,LED5不亮LED6 = 0; //上电的时候LED6不亮
}
/*===========================按键扫描函数================*/
void ScanKeys(){if(SW1 == 0){ //发现SW1有低电平信号Delay(100); //延时100ms,按键去抖动if(SW1 == 0){ //确定SW1有按键动作while(SW1 == 0){ //等待按键1松开if((Stat_key & 0x01) == 0x01){ //判断按键1按下之前,LED灯是打开还是关闭Stat_key &= ~0x01;LED5 = 0;}else{Stat_key |= 0x01;LED5 = 1;}}}} if(SW2 == 0){ //发现SW2有低电平信号Delay(100); //按键去抖动if(SW2 == 0){ //确定SW2有按键动作while(SW2 == 0){ //等待按键2松开if((Stat_key & 0x02) == 0x02){ Stat_key &= ~0x02;LED6 = 0;}else{Stat_key |= 0x02;LED6 = 1;}}}}
}
/*===========================主函数=====================*/
void main(){InitPort();while(1){ScanKeys();}
}
CC2530的通用IO端口(GPIO)输入和输出控制相关推荐
- 【CC2530入门教程-02】CC2530的通用I/O端口输入和输出控制
[CC2530入门教程-06]CC2530的ADC工作原理与应用 [CC2530入门教程-05]CC2530的串行接口原理与应用 [CC2530入门教程-04]CC2530的定时/计数器原理与应用 [ ...
- CC2530学习笔记(2)—— IO端口基本操作实验(按键控制亮灯)
CC2530学习笔记(2)-- IO端口基本操作(按键控制亮灯) 关于CC2530的IO端口基本知识.IO端口有关寄存器的介绍和描述请参照:CC2530学习笔记(1)-- IO端口 电路原理图如图1 ...
- STM32的GPIO输入与输出
目录 1.GPIO简介 2. GPIO基本结构 3. GPIO位结构 4. GPIO模式 4.1 浮空/上拉/下拉输入 4.2 模拟输入 4.3 开漏/推挽输出 4.4 复用开漏/推挽输出 1.GPI ...
- ARM(IMX6U)裸机按键输入实验(BSP+SDK、GPIO输入与输出、按键消抖)
参考:Linux之ARM(IMX6U)裸机按键输入实验(GPIO的输出与输入) 作者:一只青木呀 发布时间: 2020-08-17 21:43:37 网址:https://blog.csdn.net/ ...
- 51入门详解教程系列之IO口的输入和输出
一.IO口的输入 1.分类 (1)基本输入IO电路 (2)施密特触发输入电路 (3)弱上拉输入电路 2.各种的优缺点 (1)基本输入IO电路 1>优点:不接VCC,GND,在低功耗模式下,不费电 ...
- lpc1768的gpio库函数_LPC1768之GPIO输入和输出配置基础例程
**************************************** Copyright (c) CaKen ************************************ ** ...
- 【1】WiFi——————ESP8266 SDK编程 之 GPIO输入、输出、中断模式
简述 GPIO ESP8266共计17个I/O管脚,每个GPIO都可使能内部上拉/下拉(XPD_DCDC只有下拉) IO管脚是双向.非反相和三态的: 输入模式 输出模式 中断模式 上升沿触发 下降沿触 ...
- AVR单片机开发1——IO口的输入和输出
所用环境为iccavr,检测单片机的输入输出.proteus仿真如下: #include<_iom88to328v.h> #define uchar unsigned char #defi ...
- STM32工作笔记0010---认识GPIO IO端口
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 GPIO,通用baiI/O端口.在嵌入式系统中,经du常需要控制许多结构简单的外部设zhi备或者电 ...
最新文章
- react学习笔记(二)编写第一个react组件
- Java Review - 并发编程_LockSupport
- 不区分大小写的内容比较
- 这个高度站立办公十分的棒
- 通过自定义配置实现插件式设计
- P4900 食堂(数学式子推导)
- Shell应用:批量将文件编码由gbk转utf-8
- java里面value_「Java基础知识」Java中包含哪些运算符
- c 找不到mysql.h_Linux下C连接MySQL找不到MySQL.H的问题
- 一篇报告了解国内首个针对加密流量的检测引擎
- 人工智能必备知识储备之“数学篇”
- java初级程序员需要掌握技能,快来看鸭~
- linux系统中连接两个网桥,Linux 网桥代码分析 (二)
- 理查德外推法计算偏导数近似值-python实现
- SharePoint 2013 开发中JavaScript本地化方案
- android耳机检测驱动程序,USB 音频 CTS 验证程序测试
- 数字小写到英文大写的转换
- Baumer profinet 接口编码器的简单调试
- 人工神经网络的发展前景,人工神经网络及其应用
- 为ubuntu装好搜狗拼音法
热门文章
- matlab k l变换题目,K-L变换及例题技术分析.ppt
- 一个简单的五子连珠小游戏
- 纯前端js(或者vue)导出excel实现:合并单元格、设置单元格样式、单元格内换行
- 仿抖你妹原版主题源码/仿抖音模式套图WordPress图片主题模板
- 联发科MT8788(i500P)安卓智能核心板,支持4GLTE,搭载双核AI处理器
- Computer Architecture A Quantitative Approach 读书笔记chapter1-1
- 一种MMO服务器框架
- UE(User Experience)用户体验培训(本大纲可以定制)
- 【Mac版excel快捷键Control+E实用技巧2】excel如何快速从身份证号中提取出生年月日?
- Linux系统分区详解