新房没房产证如何过户:库函数absacc.h的介绍

来源:百度文库 编辑:中财网 时间:2024/04/27 16:44:25
在程序中,用“#include”即可使用其中定义的宏来访问绝对地址,包括: CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD 例如: rval=CBYTE[0x0002];指向程序存贮器的0002h地址 rval=XWORD [0x0002];指向外RAM的0004h地址

keil里 EDA中国门户网站4z AiB f*X U ^
/*--------------------------------------------------------------------------
)B-q d,r#V q:K B0ABSACC.H EDA中国门户网站.X0D ~ M _;H+L H
EDA中国门户网站,L A$`w5L'p }9p
Direct access to 8051, extended 8051 and Philips 80C51MX memory areas.
j @ ^ ] t2s {:m0Copyright (c)1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
,|&n*h&u A J4?9c0Allrights reserved. EDA中国门户网站 _s | c#]#Lm-I \
--------------------------------------------------------------------------*/ EDA中国门户网站 [ y p)_.g Y(W4L
k o H \9T Z o C0#ifndef__ABSACC_H__
$k4{1T*F I d l(N)B v/a0#define__ABSACC_H__ EDA中国门户网站 H N#z*R a,g F
P.`3u R a \ q o @0#define CBYTE((unsigned char volatile code *) 0)
h9G v ~'M0#define DBYTE((unsigned char volatile data *) 0)
{1L l!['Y7L4q0#define PBYTE((unsigned char volatile pdata *) 0) /**/
W O%P j8~ b0#define XBYTE((unsigned char volatile xdata *) 0)    /*外部RAM*/EDA中国门户网站2Y z b @-j \
u:t3O![ z.n4B0#define CWORD((unsigned int volatile code *) 0) EDA中国门户网站8N n ~ S%| W V
#define DWORD ((unsigned int volatile data *) 0)
$G A T T ^"a(?0#definePWORD ((unsigned int volatile pdata *) 0) EDA中国门户网站 Y W l(J ] U7}
#define XWORD ((unsigned int volatile xdata *) 0) EDA中国门户网站"G6b l a"E7M c$o
` N g f1q.S q0#ifdef __CX51__ EDA中国门户网站$W;l'o3p \ @ j6X
#define FVAR(object, addr) (*((object volatile far *) (addr))) EDA中国门户网站 J$[ p._(r q A
#define FARRAY(object, base) ((object volatile far *) (base)) EDA中国门户网站 T [H @0m2D%t6v%t A9z D
#define FCVAR(object, addr) (*((object const far *) (addr)))
0t+o J h P.I ^0#defineFCARRAY(object, base) ((object const far *) (base))
DQQ x'K J4v O f0#else
4\2j b @m _0#define FVAR(object,addr) (*((object volatile far *) ((addr)+0x10000L)))
&l D q:u \0#defineFCVAR(object, addr) (*((object const far *) ((addr)+0x810000L)))
x k ?'q r F0#defineFARRAY(object, base) ((object volatile far *) ((base)+0x10000L))
-a9y!j:Z ~ R J5?0#defineFCARRAY(object, base) ((object const far *) ((base)+0x810000L))
n%i Z:b%L O J0#endif
.X%o3Q4L ?(c.Z A:P }$h0#endif
}+D,L A U a0其他的你到编译器预定义头文件里找好了

/**********************************CBYTE********************************/

Q:

absacc.h里的宏
7H+o!v4b i3J m7p0#define CBYTE((unsigned char volatile code   *) 0)
$a,[ U [2L v R P*l4n0value =CBYTE[0x002];
D e2K R g | z @(Q0这句该如何理解?

A1:EDA中国门户网站 V,G N J S2z i

结果是将程序空间(code)地址为0x002单元的内容放到变量value中。EDA中国门户网站 \1m w x'_;u i-r Z

A2:

替换一下考虑
N m'J a r0value = ((unsigned char volatile *) 0)[0x02];EDA中国门户网站 -U5a I9x,y i
替换一下考虑
t5G kO F7`*r _0unsigned char volatile *CBYTE = 0/*NULL*/;EDA中国门户网站 ] z*@ M7s-}%o.K f P y
这里CBYTE[0x02] = 1和*(CBYTE+0x02) = 1等价EDA中国门户网站,[{ @ j*Z;U9x

` I {.M2K8s Q;|0#define CBYTE ((unsigned char volatile code   *) 0)
n y0X:n `0是把CBYTE是指针,即code地址0在这里,数组和指针是可以互用的。CBYTE[0x02]也就是*(CBYTE+0x02),都是指的是地址0x02里的内容,并是unsigned char 类型的。

#define CBYTE ((unsigned char volatile code   *) 0)
I x e O f E J ?0考虑下这个define定义的内容EDA中国门户网站$N^J-s+Y:X J
1、把CBYTE定义成一个0(0);EDA中国门户网站 ^ Y L f.` [ E8R
2、这个0是个地址(*号);EDA中国门户网站 o G J$J Z$R m"~E
3、这个地址是代码段的地址(code);
z M2H l2C04、并是unsigned char类型的地址(unsigned char);EDA中国门户网站2p)H"z)E'S$Q0o$a b)w
5、并这个地址的内容是易逝性的(volatile);EDA中国门户网站 P v O } r

-i q y D Y+N6? p'u6}0] X0本质上是定义了一个地址(CBYTE )。指针就是地址。地址是内存的序号。
%f | i+_&c F*]7m$|0指针通过指向内存的序号访问内存。替换点是都是地址。

内部的括号用来强制类型转换用的,外部的的括号用来防止宏定义展开时错误的用法EDA中国门户网站 l{0A _)B4Y$Z;D ~ [ {

再如:

#define COM8255 XBYTE[0X060FF] //后面若出现COM8255,则单片机端口P0和P2联合输出0X060FF绝对物理地址(地址指向82C55指令寄存器)
#define PA8255 XBYTE[0X000FF] //后面若出现PA8255,则单片机端口P0和P2联合输出0X000FF绝对物理地址(地址指向82C55的A组端口寄存器)
#define PB8255 XBYTE[0X020FF] //后面若出现PB8255,则单片机端口P0和P2联合输出0X020FF绝对物理地址(地址指向82C55的B组端口寄存器)
#define PC8255 XBYTE[0X040FF] //后面若出现PC8255,则单片机端口P0和P2联合输出0X040FF绝对物理地址(地址指向82C55的C组端口寄存器)

EDA中国门户网站,@-w Q d }x

/*************************************************************************************/