CC2530的通用IO端口(GPIO)输入和输出控制 |
您所在的位置:网站首页 › snmp161和162端口是干什么的 › CC2530的通用IO端口(GPIO)输入和输出控制 |
前言: 单片机基本结构: 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_1 unsigned char Stat_key = 0; //按键状态全局变量 /*===================延时函数======================*/ void Delay(unsigned int t){ while(t--); } 端口功能选择 微控制器的大部分I/O口都是功能复用的,在使用的时候需要通过功能选择寄存器来配置端口的功能CC2530的特殊功能寄存器PxSEL是端口功能选择寄存器 PxSEL寄存器(端口功能选择): PxDIR寄存器(端口方向设置): 输入方式用来从外界器件获取输入的电信号,当CC2530的引脚为输入端口时,该端口能够提供“上拉”、“下拉”和“三态”三种输入模式,可以通过编程进行设置。在本案例中,实际上不需要对PO_ 1和P1_ 2引脚进行输入方式的设置,因为CC2530复位后,各个/O端口默认使用的就是上拉模式 P0INP寄存器和P1INP寄存器(端口输入方式设置): 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_1 unsigned 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(); } } |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |