sfr:特殊寄存器是再库中已经有的 define:是自己定义的
就是告诉编译器将一个你自己指定的变量“name”链接到名字为“addr”的数据段中去,而这个变量是保存在特殊功能寄存器SFR中,并且保存在非初始化数据区(一个目标文件的数据区分为以初始化的和未初始化的),同时该变量是volatile属性的,即程序每次要用到它的时候都会重新从变量所在的物理地址中读取其...
51单片机的寄存器存在于内部空间0x80-0xFF,这空间属于直接寻址,不是访问外部总线。所以只能用 sfr P0=0x80来定义。STM32单片机就不一样,所有的外设寄存器都处于统一寻址的外部空间中,所以只能用这种方法定义其地址,访问时也类似MOVX指令的执行。
只是说你以后在程序里写adc0start 就会被替换成temppage=sfrpage;sfrpage=0x00;ad0busy=1;sfrpage=temppage 而已
一个有类型,一个只是宏定义。
首先,sbit led= P2,这个写法是错误的,虽然编译时不报错,但编译后执行程序时却是错误的。sbit 是定义一个引脚的,注意,只是定义一个引脚,而 P2是一个并行口,有8个引脚,是不能sbit 来定义,可以用 sfr 定义。define 并不是定义引脚的,也不是定义并行口,只是一个宏替换,就是程序中的led ...
sfr ADC_CONTR = 0xC5; //A/D转换控制寄存器 sfr ADC_DATA = 0xC6; //A/D转换结果寄存器 typedef unsigned char INT8U; typedef unsigned int INT16U; void delay(INT8U delay_time) // 延时函数 { INT8U n; INT16U m; for (n=0;n《delay_time;n++) ...
#define sbi(sfr,bit) (_SFR_BYTE(sfr) |=_BV(bit))等宏??其实和下的宏一样吧??#define ...
P0口一共有8位,sbit是用来指定某一位这样便于位操作 比如sbit P0_0=P0^0 表示P0口的第一位 之所以用宏你要理解宏和普通定义的区别 宏是预处理阶段直接替换 而如果用定义的话是需要分配内存的 另外这里的P0是GPIO的地址 sfr P0 = 0x??
ADC_CONTR&= ~ADC_POWER 本人也犯过类似错误 define ADC_POWER 0x80 ; 宏定义ADC_POWER的数值是 0x80,正确的 ADC_POWER=1 让一个数值等于另一个数值,所以是错误的 ADC_POWER 并不是特殊功能寄存器 它只是殊功能寄存器ADC_CONTR中的一位 声明特殊功能寄存器的方法是sfr ADC_CONTR=0xBC ...