C51中~XBYTE 简介
C51的P0,P2口做外部扩展时使用,其中XBYTE [0x0002],P2口对应于地址高位,P0口对应于地址低位。一般P2口用于控制信号,P0口作为数据通道。
XBYTE定义的是外部地址,这样才能和接到你的IO口上的器件通信
在一般的读写外部RAM的程序中,经常看到这样的句子:
mov dptr,#1000h
mov a,#55h
movx @dptr,a
上面3调语句的C语言可以表示如下
#define
W_DATA=0X55;
在使用外部总线的时候,数据 地址和控制信号是直接按照规定的时序输出高低电平的,所以不用你管,当然你必须要满足时序工作如何理解#define XBYTE ((unsigned char volatile xdata * ))
8051 特有的内存型态
code
data
idata
bdata
xdata
pdata
特殊资料型态
bit
sbit
语法
sbit
范例
sbit
或是配合 bdata 宣告的位(bit)变量
char
sbit
(注意 sbit 前不可以加 static)
sfr
语法
sfr
范例
sfr
指定绝对地址的变量
在单一模块内可以使用下面的语法宣告
[memory_space]
范例
pdata
如果该变量必须为多个模块所使用(Global Variable)则以
抽象指针(Abstract Pointer)的方式在标头档(Header File)定义较为方便。
#define
范例
#define
(注意 char 与 pdata 的顺序)
ABSACC.H 提供了下列方便的宏(Macro)定义。
#define CBYTE ((unsigned char volatile code *) 0)
#define DBYTE ((unsigned char volatile data *) 0)
#define PBYTE ((unsigned char volatile pdata *) 0)
#define XBYTE ((unsigned char volatile xdata *) 0)
#define CWORD ((unsigned int volatile code *) 0)
#define DWORD ((unsigned int volatile data *) 0)
#define PWORD ((unsigned int volatile pdata *) 0)
#define XWORD ((unsigned int volatile xdata *) 0)
隐藏的初始化程序
80C51 在电源重置后(Power On Reset)所执行的第一个程序模块并不是使用者的主程序
main(),而是一个隐藏在 KEIL-C51 标准链接库中称为 startup.a51 的程序模块。
startup.a51 的主要工作是把包含 idata、xdata、pdata 在内的内存区块清除为 0,并
且初始化递归指针。接着 startup.a51 被执行的仍然是一个隐藏在 KEIL-C51 标准链接库
中称为 init.a51 的程序模块。而 init.a51 的主要工作则是初始化具有非零初始值设定的
变量。
在完成上述的初始化程序之后,80C51 的控制权才会交给 main() 开始执行使用者的程序。
#define XBYTE ((unsigned char volatile xdata *) 0)
定义
这样,可以直接用XBYTE[0xnnnn]或*(XBYTE+0xnnnn)访问外部RAM了
注意:xbyte是一个宏定义在absacc文件中,编程时要在前面加一个#include <absacc.h>这个头文件