XTYBE
说法一:
2楼:
ABSACC.h,XBYTE的定义是这样的,
#define XBYTE ((unsigned char volatile xdata *)
0),XBYTE就相当于一个指向外部数据区的无符号字符型变量的指针(的名称,且当前的指针指向外部RAM的0地址),而在C里面指针一般和数组是可以混用的。这样也就相当于存在 一个定义在外部数据存储器的数组XBYTE[65536],直接使用下标就可访问其中的每个单元。
【从其它嵌入式的C带来的习惯,一直使用*(unsigned char volatile xdata
*)(0x2000)=0xFF这类的方式来进行对外部绝对地址的字节访问。
】
5楼:
呵呵,倒过来写都行...
例如, 200[XBYTE]=xxx;
char
buff[10];
//或者用 char
*buff=&buffer;
buff[3]=0xaa;
3[buff]=0xaa; //居然是一样的,倒塌...
因此,我认为编译器是这么干的:对于形如xxx[yyy]这样的表达式,会转化为*(xxx+yyy),
因此写成xxx[yyy]或者写成yyy[xxx]都无所谓了...非典用法,请勿乱用,出了事偶不负责...
6楼:
本质就是强制指针变换,有什么神秘的...
说法二:
用XBYTE定义的目的是将外部电路不同的功能编程不同的地址而已
这样就可以在程序里面通过直接对地址附置,就能使外部电路实现需要的功能,这样做还有一个好处就是在编译的时候会产生
MOVX 指令,这样可以操作WR和RD引脚,以实现特定的功能
至于用XBYTE定义的地址是多少就得根据实际的外围电路的连接来确定,不是随便写的
说法三:
在用C51的P0,P2口做外部扩展时使用,其中XBYTE
[0x0002],P2口对应于地址高位,P0口对应于地址低位。一般P2口用于控制信号,P0口作为数据通道。
比如:P2.7接WR,P2.6接RD,P2.5接CS,那么就可以确定个外部RAM的一个地址,想往外部RAM的一个地址写一个字节时,地址可以定为XBYTE
[0x4000],其中WR,CS为低,RD为高,那就是高位的4,当然其余的可以根据情况自己定,然后通过
XBYTE [0x4000] =
57;
这赋值语句,就可以把57写到外部RAM的0x4000处了,此地址对应一个字节。
个人总结:
以下图为例
P0口接了8根 低地址 地址线
P2口低4位接了4根 高地址 地址线
P2口高3位接了3根 控制信号线 RD WR CS
P2口P2.7没用
这样P0,P2口接的外围设备有12位的 地址线,3根控制线,1根未使用的线,
那么这个外围器件的地址范围是
XXXX 0000 0000 0000-XXXX FFFF FFFF FFFF
XXXX 是从0000-FFFF的16种不同的组合,那么由 XXXX 0000 0000 0000-XXXX FFFF FFFF FFFF组成的地址范围就会有16中不同的表示范围,但是这16中不同的地址表示都是指同以物理地址。这就是 物理地址对应的映射地址不唯一。
例如:0000 0000 0000 0000和1111 0000 0000 0000都是指同一物理地址
0000 0000 0000 0000和0000 0000 0000 0001指的是不同的物理地址
这样XXXX就可以作为控制信号线来使用
如果想对XXXX 0000 0000 0000地址进行 RD=0 WR=1 CS=1 这样的操作
RD,WR,CS分别对应P2.4 P2.5 P2.6
X110 0000 0000 0000(X可以是1或者0,这里选1,那么1110 0000 0000 0000=0xe000)
那么可以通过命令:XBYTE[0xe000]=0 来实现
这句C语言命令的汇编命令如下:
mov dptr,#e000h
mov a,#0h
movx @dptr,a
如果把 X110 0000 0000 0000中X=0,那么 0110 0000 0000 0000=0x6000
那么实现以上操作是:XBYTE[0x6000]=0 来实现
从上面可以看出 最高位 未用的位设置位0或者1没有任何影响,只是形式不同而已,
此处 XBYTE[0xe000]=0 和 XBYTE[0x6000]=0 等价
如果想对XXXX 0000 0000 0000地址进行 RD=1 WR=0 CS=1 这样的操作
X101 0000 0000 0000=0xc000(X=1) 或者=0x5000(X=0)
命令为 XBYTE[0xc000]=0,或者XBYTE[0x5000]=0
如果想对想对XXXX 0000 0000 0000地址进行 RD=1 WR=0 CS=1 这样的操作,并且向A0-A12这12位数据线输出数值57,那么命令为:XBYTE[0xc000]=57或者XBYTE[0x5000]=57
如果想对想对XXXX 0000 0000 0001地址进行 RD=1 WR=0 CS=1 这样的操作,并且向A0-A12这12位数据线输出数值57,那么命令为:XBYTE[0xc001]=57或者XBYTE[0x5001]=57
以上地址线A0-A12接的是外围存储器件,那么XXXX 0000 0000 0000 -XXXX 1111 1111 1111是地址范围
p0.0-p0.7 02.0-p2.3
如果地址线A0-A12接的是外围设备(非存储器件),那么地址只能是 XXXX 0000 0000 0000这一个了(个人观点,还没有找到可靠依据,如果找到,再来更新)
外围器件的编地址
程序存储器扩展时片选产生方法
1、 线选法
线选法是把单根的高位地址信号直接接到存贮器芯片的片选端,一根地址线对应一个。线选法的主要优点是简单、省硬件;缺点是各芯片的地址空间不连续,不能充分利用CPU的最大地址空间。
2、 全译码法
全译码法是把片内选址后剩余的高位地址通过译码器进行译码,译码后的输出产生片选信号,每一种输出作为一个片选。全译码法的主要优点是可以最大限度地利用CPU地址空间,各芯片间地址可以连续;但译码电路较复杂,要增加硬件开销。
3、 部分地址译码法
此方法是将高位剩余的地址一部分进行全译码,另一部分则不用暂可悬空。这种方法的优缺点介于上述两种译码方法之间。即能利用CPU较大的空间地址,又简化译码电路;但存在存贮器空间的地址重叠问题。
四、程序存储器扩展实例
1、用一片2716芯片扩展2K程序存储器
1)地址线连接:2716的存储容量为2K*8,需11位地址(A10~A0)进行存储单元的选择。为此先把芯片的A7~A0与地址锁存器的8位地址输出对应联接,剩下的高位地址(A10~A8)与P2口的P2.2~P2.0相连。这样2716芯片的内存储单元的问题就解决了。
2)数据线的连接:程序存储器的数据输出引脚到P0口对应连接。
3)控制信号线的连接:程序存储器的扩展只涉及到外部存储器选通信号PSEN,此信号与2716的OE端相接,以便进行存储单元的读出选通。
4)片选线的连接:因为这是一个小规模存储器扩展系统,采用线选法比较方便,为此只需在剩下的高位地址线中选取P2.7作芯片选择信号与2716的CE端相连即可。
5)扩展芯片的地址范围:
最低地址:当A0~A10取值为0000000000时。
A15 P2.7 | A14 P2.6 | A13 P2.5 | A12 P2.4 | A11 P2.3 | A10 P2.2 | A9 P2.1 | A8 P2.0 | A7 P0.7 | A6 P0.6 | A5 P0.5 | A4 P0.4 | A3 P0.3 | A2 P0.2 | A1 P0.1 | A0 P0.0 |
0 | X | X | X | X | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 . 1 | 0 . 1 | 0 . 1 | 0 . 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0000H、0800H、1000H、1800H、2000H、2800H、…..7800H、7FFFH |
最高地址:当A0~A10取值为11111111111时。
A15 P2.7 | A14 P2.6 | A13 P2.5 | A12 P2.4 | A11 P2.3 | A10 P2.2 | A9 P2.1 | A8 P2.0 | A7 P0.7 | A6 P0.6 | A5 P0.5 | A4 P0.4 | A3 P0.3 | A2 P0.2 | A1 P0.1 | A0 P0.0 |
0 | X | X | X | X | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
0 | 0 . 1 | 0 . 1 | 0 . 1 | 0 . 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
07FFH、0FFFH、17FFH、17FF H、27FFH、2FFFH…..7FFFH |
所以,该联接方式程序存储器的地址范围为:0000H~07FFH、0800H~0FFFH、
1000H~17FFH………
这种地址范围重叠是线选法本身造成的。因此地址范围的非惟一性是线选法的一大缺点。
A15接的是CE(片选)
当A15=0时:16位二进制地址范围0XXX X000 0000 0000-0XXX X1111 1111 1111
当A15=1时:16位二进制地址范围1XXX X000 0000 0000-1XXX X1111 1111 1111
此处X表示该位可为 0或1 中的任意值,那么XXXX的范围 0000-1111(16)
那么0XXX X000 0000 0000-0XXX X1111 1111 1111(有16种地址表示)
1XXX X000 0000 0000-1XXX X1111 1111 1111(也有16种地址表示)
这就意味着:
当A15=0时,对于同一物理地址,有16种不同的地址值可以表示(同一地址,地址值不唯一)
同样,当A15=1时,对于同一物理地址,有16种不同的地址值可以表示(同一地址,地址值不唯一)
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』