自定义特殊功能寄存器对端口进行控制

cc2530和cc2540的区别:

cc2530使用的是ZigBee协议栈
cc2540使用的是ble(蓝牙低功耗)协议栈

下面我们对P1端口进行配置,实现通过P1端口对LED灯进行控制
__sfr __no_init volatile unsigned char P1SEL @ 0xf4; 
__sfr __no_init volatile unsigned char P1DIR @ 0xfe; 
__sfr __no_init volatile unsigned char P1    @ 0x90; 

void main()
{
   P1SEL = 0X00;
   P1DIR = 0XFF;

  while(1)
  {
      P1 = 0X0;
      //P1 = 0XFF;
   }
}
下面我们进行分析:
unsigned char P1SEL @ 0XF4//这是一个常见的变量定义赋值的一个过程,但我们现在是在配置寄存器,我们对P1SEL进行操作,其实就是对P1SEL所代表的的空间进行配置,所以我们这里不存在赋值的过程,在这里我们用‘@’替换‘=’,相当于给地址0XF4取了一个P1SEL的名字

volatile
//我们在对变量进行操作的时候,其实就是对对应的地址空间进行操作,我们在程序的运行过程中,变量的地址可能会发生变化,如果我们对错误的地址进行操作,则毫无意义,严重的会造成整个程序的崩溃,volatile的作用就是在每次调用这个函数前都重新获取它的地址,以防意外的发生

__no_init
//数据的存储肯定是在一段存储空间当中的,当我们定义变量的时候,如果我们不做任何说明,51内核会自动将它分配到init空间中,init空间会对变量自动赋0值;但是有时候,变脸本身的值是有含义的,我们如果将他们分配到init空间,抹去了原先的值,甚至更改了程序原本的含义,会造成严重的后果,所以我们在定义的时候要把它定义在非init空间中,由__no_init定义

__srf
//我们为什么调用所定义的寄存器就可以对端口进行控制了呢?普通的寄存器对端口是控制不了的,所以我们要用‘__srf’将其定义成特殊功能寄存器

P1SEL = 0X00;
//我们通过配置P1SEL对P1的功能进行配置,将相应位置0配置成通用IO,将相应位置1配置成外设IO,我们这里将P1的所有位配置成通用IO

P1DIR = 0XFF;
//我们通过配置P1DIR对P1的IO的方向进行配置,将相应位置0配置成输入模式,将相应位置1配置成输出模式,我们这里将P1的所有位配置成输出模式

P1 = 0X0;
//我们已经对端口的功能进行了初始化设置,下面我们就要对端口进行设置,改变端口的电压变化,以实现其功能;我们这里是对LED进行控制,因为LED的一端就是3.3V的电压,我们要使LED点亮,得使LED有电流流过,所以P1端口我们不能有电压,故P1的所有端口置0
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值