你稍微懂一点点的 硬件知识,就不会有这个问题了。 指针访问属于 “间接访问”。 而51的SFR 属于 只能"直接访问",是不能用指针访问的。 至于,51的扩展寄存器 XSFR 属于只能“间接访问”,即无论如何都必须通过指针才能访问的。 |
3038838599 发表于 2024-8-25 15:15 总而言之 0x80~0xFF地址的寄存器只能用SFR来访问, 如 sfr P3 = 0xB0; ... P3 = 0x0F; if(P3 != 0x0F) { ... } |
3038838599 发表于 2024-8-24 16:08 这个寄存器地址是在xdata区域,不在0x80--0xFF,所以可以这样定义,大多数寄存器地址是0x80--0xFF,需要使用直接寻址, 如果用间接寻址访问0x80--0xFF,就是访问idata的RAM, 如果用直接寻址访问0x80--0xFF,就是访问寄存器 0x00-0x7F可以是data区,也可以是idata区 如果用间接寻址访问0x00--0x7F,就是访问idata区 如果用直接寻址访问0x00--0x7F,就是访问data区 |
我也看了这段话,但是没有整明白,有人说32的是地址映射, |
cccc888 发表于 2024-8-22 21:23 是的 我也是看见过别的51内核的单片机这么做,所以才需要搞懂 #define I2C_SR *(_IO uint8 xdata *)0x402b // RV: 00H I2C状态寄存器 |
我尝试回答,不知道是否有误,请指正。 1、51特殊功能寄存器与RAM使用统一编址,如果用这种指针方式访问,编译器不知道指向哪个鬼,编译器会给出警告说:内存空间或许无效。 2、所以,51使用关键字SFR访问特殊寄存器。如:sfr P1 = 0x90; //P1口数据寄存器 |
又有新发现。参照别的头文件加上内存区块名
发现加了data和加idata和不加生成的汇编代码一样。这算不算??,既然支持了,就应该有区别吧。 |
3038838599 发表于 2024-8-22 09:45 的确是这样子的,但是xdata寄存器可以这样定义,我看过别的单片机的头文件定义。 |
是因为32比较落后,没有bit功能,只能这么操作 而51就比较强大,不但能用bit赋值,也能用指针赋值 只是你没写对 |
51的寄存器只能直接寻址操作,不能用间接寻址,所以不能用指针。 |
cccc888 发表于 2024-8-21 20:54 那你试着不要“reg52.h"头文件,看看能不能把P1的引脚都置0。 |
|
51用汇编也可以实现同样的效果 |
|