其实可以直接赋值,相对好理解,但是熟练之后还是这个方法比较快。
使用或操作 “|” 。
任何值与0相或,保持原值。
任何值与1相或,结果为1.
例如:寄存器TMP
的当前值为0X62
,要将第2、3、6位置1。C语言表达式:TMP|=0X4C
。
0X62:0110 0010
0X4C:0100 1100
TMP= 0110 1110
那么这个0X4C
的值如何快速得到的?
先假设寄存器所有位的值都是0,如TMP=0000 0000。再将要操作的位置全部改为1,即0100 1100,也就快速得到了这个值 :0X4C。
使用与操作“&+非”
任何值与1相与,保持原值;
任何值与0相与,结果为0。
例如:寄存器TMP
的当前值为0X62,要将2、3、6位清0,用C语言表达:TMP&=~0X4C
,
0X62:0110 0010
0X4C:0100 1100
~0X4C:1011 0011
程序设计中快速操作的方法:
操作步骤同上:先假设寄存器所有位的值都是0,如TMP=0000 0000。要操作的位置1。
得到0100 1100,即0X4C,再取反 1011 0011。如此达到想要的操作。
总结:实际开发时,先假设寄存器所有位都是0,确定想要操作的位之后,将其置1,得到一个数。
若想将这些位置1,则用或操作编写赋值语句。若想将其清零,则用与+取反操作编写赋值语句。
可延伸至更多位。
通用I/O,也叫GPIO。
CC2530采用QFN40封装,有40个引脚。
有21个数字I/O端口,其中P0和P1是8位端口,P2仅有5位可以使用。
P2虽然有5个引脚,但是实际能用的只有P2_0。P2_1、P2_2在开发时接仿真器的通信引脚,P2_3、P2_4接外部晶振引脚。
所以实际开发可用I/O端口只有17个。所以通常要对I/O口进行功能复用。
通过对寄存器的配置选择引脚的的功能。可配置为通用I/O端口,或外部设备I/O口。
每个I/O端口都可以配置成外部中断源的输入引脚,而51单片机就只能固定在INT0和INT1两个引脚。
P1_0和P1_1具没有上拉/下拉能力,若一定要使用这两个引脚,则需要外接上拉电阻。P1_0和P1_1具备20mA高驱动输出,其余I/O引脚是4mA的驱动能力。
在单片机内部,有一些特殊功能的存储单元,这些单元用来存放控制单片机内部器件的命令、数据或运行过程中的一些状态信息,这些寄存器统称为“特殊功能寄存器(SFR) ”。
操作单片机的本质,就是对这些特殊功能寄存器进行读写操作,并且某些特殊功能寄存器可以位寻址。
为了便于使用,每个特殊功能寄存器都会起一个名字,在程序设计时,引入头文件“ioCC2530.h”,才能直接使用里面寄存器的名称。
与通用I/O端口相关的常用寄存器有下面4个:
(P即port 。X是序号0,1或者2)
位 | 位名称 | 复位值 | 操作 | 描述 |
---|---|---|---|---|
7:0 | SELPx[7:0] | 0X00 | R/W | 设置Px_7到Px_0端口的功能 。 0:对应端口被设为通用I/O功能。 1:对应端口被设置为外设功能 |
应用举例:P0SEL|=0X45 //将P0_6、P0_2和P0_0设置成外设功能。
P1SEL&=~0X13 //将P1_4 、P1_1和 P1_0设置成通用I/O功能。
位 | 位名称 | 复位值 | 操作 | 描述 |
---|---|---|---|---|
7:0 | DIRPx[7:0] | 0X00 | R/W | 设置Px_7到Px_0端口的传输方向。 0:输入。 1:输出。 |
应用举例:P0DIR&=~0X14 //将P0_4和P0_2设置为输入方向
P1DIR|=0X26 //将P1_5、P1_2和P1_1设置为输出方向
P0INP输入配置寄存器
位 | 位名称 | 复位值 | 操作 | 描述 |
---|---|---|---|---|
7:0 | MDP0[7:0] | 0X00 | R/W | 设置P0_7到P0_0端口的输入模式。 0:上拉/下拉(需要结合P2INP联合配置)。 1:三态。 |
P1INP输入配置寄存器
位 | 位名称 | 复位值 | 操作 | 描述 |
---|---|---|---|---|
7:2 | MDP1[7:0] | 0X00 | R/W | 设置P1_7到P1_2端口的输入模式。 0:上拉/下拉(需要结合P2INP联合配置)。 1:输出。 |
1:0 | ----------- | 00 | R0 | 不使用 |
P2INP输入配置寄存器 (用于设置到底是上拉还是下拉)
位 | 位名称 | 复位值 | 操作 | 描述 |
---|---|---|---|---|
7 | PDUP2 | 0 | R/W | 为P2端口所有引脚选择上拉还是下拉 0:上拉 1:下拉 |
6 | PDUP1 | 0 | R/W | 为P1端口所有引脚选择上拉还是下拉 0:上拉 1:下拉 |
5 | PDUP0 | 0 | R/W | 为P0端口所有引脚选择上拉还是下拉 0:上拉 1:下拉 |
4:0 | MDP2_[4:0] | 0X00 | R/W | 设置P2_4到P2_0端口的输入模式 0:上拉/下拉 1:三态 |
应用举例:将P0_1和P0_3端口设置为上拉模式
P0INP&=~0X0A //先将P0_3和P0_1端口设置为上拉/下拉
P2INP&=~0X20 //再将P0端口内所有引脚设置为上拉模式
应用举例:将P0_1和P0_3端口设置为上拉模式
P0INP&=~0X0A //先将P0_3和P0_1端口设置为上拉/下拉
P2INP&=~0X20 //再将P0端口内所有引脚设置为上拉模式
4.Px:数据端口,用来控制端口的输出或获取端口的输入。