请教51的io口地址和其他寄存器地址重复的疑惑

[复制链接]
4659|6
 楼主| llt1234567 发表于 2011-4-13 10:21 | 显示全部楼层 |阅读模式
sfr P0      = 0x80;
sfr SP      = 0x81;
sfr DPL     = 0x82;
sfr DPH     = 0x83;
sfr PCON    = 0x87;
sfr TCON    = 0x88;

sbit P0_0 = 0x80;
sbit P0_1 = 0x81;
sbit P0_2 = 0x82;
sbit P0_3 = 0x83;
sbit P0_4 = 0x84;
sbit P0_5 = 0x85;
sbit P0_6 = 0x86;
sbit P0_7 = 0x87;

p_0,P0_1等几个口和别的有重复,执行程序的时候会不会乱,51是怎么处理的呢,很疑惑
ayb_ice 发表于 2011-4-13 10:28 | 显示全部楼层
一个是SFR空间(直接寻址空间80~ff)
一个是位地址(位寻址空间00~7f)
new1988 发表于 2011-4-13 11:00 | 显示全部楼层
请注意,这两种定义类型是不同的,sfr是定义一个字节的空间,sbit是一位的空间。p0_0只是p0这个八位的字节空间中的一位
lyjian 发表于 2011-4-13 12:31 | 显示全部楼层
用不同的指令区分
ljm810010 发表于 2011-4-13 13:22 | 显示全部楼层
不同的地址体系
wangguojun2010 发表于 2011-4-20 18:07 | 显示全部楼层
请查看位寻址区、一般寻址区,寄存器区
sysdriver 发表于 2011-4-20 23:36 | 显示全部楼层
我理解LZ的意思

LZ知道P0的地址为什么是0x80,而不是0x84或0x85?我也不知道,我只知道这个MCU定义的,我没有权利把它变成0x84。相应的来说,字节地址0x80有和它相应的位地址0x80~0x87,但PCON = 0x87就偏偏没有位地址,我不知道为什么,这个也是由MCU定义的。
字节地址和位地址不一样。即sfr PCON =0x87;和sbit P0_7 =0x87;不一样,一个是字节地址,一个是位地址。51它就是这样区别的,不会乱。如 PCON = 0x05;那PCON就是0x05;但P0_7 =0x05;P0_7却=1;不是0就是1。

另外,sbit常用的定义是其他两种,不易混淆:sbit P0_0 = P0^0; sbit P0_0 = 0x80^0;官方手册用的是第一种,至于第二种和第三种(你那种)基本上少用,因为不直观。比如,sbit PT0 = 0xB9表示的是IP=0xB8的第二位,即sbit PT0 = 0xB9 = IP^1 = 0xB8^1。

另外,没有位地址的SFR,你不能sbit,不然会报错。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

27

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部