找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 6228|回復(fù): 0
收起左側(cè)

用 #include<absacc.h> 即可使用其中定義的宏來(lái)訪問(wèn)絕對(duì)地址

[復(fù)制鏈接]
ID:76244 發(fā)表于 2015-4-7 00:22 | 顯示全部樓層 |閱讀模式
當(dāng)51單片機(jī)通過(guò)8255和鎖存器74LS273來(lái)擴(kuò)展IO時(shí),經(jīng)常用到頭文件absacc.h。

在程序中,用“#include<absacc.h>”即可使用其中定義的宏來(lái)訪問(wèn)絕對(duì)地址,包括:CBYTE、XBYTE、
PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD
例如:
rval=CBYTE[0x0002];指向程序存貯器的0002h地址
rval=XWORD [0x0002];指向外RAM的0004h地址
================================================================================
KEIL中ABSACC.H定義如下:
#ifndef __ABSACC_H__
#define __ABSACC_H__
#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) /*
外部 RAM */

#ifdef __CX51__
#define FVAR(object, addr) (*((object volatile far *) (addr)))
#define FARRAY(object, base) ((object volatile far *) (base))
#define FCVAR(object, addr) (*((object const far *) (addr)))
#define FCARRAY(object, base) ((object const far *) (base))
#else
#define FVAR(object, addr) (*((object volatile far *) ((addr)+0x10000L)))
#define FCVAR(object, addr) (*((object const far *) ((addr)+0x810000L)))
#define FARRAY(object, base) ((object volatile far *) ((base)+0x10000L))
#define FCARRAY(object, base) ((object const far *) ((base)+0x810000L))
#endif
#endif
========================================================================
xdata是large存儲(chǔ)類型,volatile是通過(guò)硬件來(lái)改變指針指向的內(nèi)容。
#define XBYTE    ((unsigned char volatile xdata *) 0)定義 XBYTE為指向
xdata地址空間unsigned char數(shù)據(jù)類型的指針,指針值為0這樣,
可以直接用XBYTE[0xnnnn]或*(XBYTE+0xnnnn)訪問(wèn)外部RAM了。
/**********************************CBYTE********************************/
Q:

absacc.h里的宏
#define   CBYTE    ((unsigned char volatile code *) 0)
value = CBYTE[0x002];
這句該如何理解?

A1:

結(jié)果是將程序空間(code)地址為0x002單元的內(nèi)容放到變量value中。
A2:

替換一下考慮
value = ((unsigned char volatile *) 0)[0x02];
替換一下考慮
unsigned char volatile *CBYTE = 0/*NULL*/;
這里CBYTE[0x02]= 1和*(CBYTE+0x02) = 1等價(jià)
#define   CBYTE   ((unsigned char volatile code *) 0)
是把CBYTE是指針,即code地址0
在這里,數(shù)組和指針是可以互用的。CBYTE[0x02]也就是*(CBYTE+0x02),都
是指的是地址0x02里的內(nèi)容,并是unsignedchar 類型的。
#defineCBYTE   ((unsigned char volatile code *) 0)
考慮下這個(gè)define定義的內(nèi)容
1、把CBYTE定義成一個(gè)0(0);
2、這個(gè)0是個(gè)地址(*號(hào));
3、這個(gè)地址是代碼段的地址(code);
4、并是unsignedchar類型的地址(unsigned char);
5、并這個(gè)地址的內(nèi)容是易逝性的(volatile);
本質(zhì)上是定義了一個(gè)地址(CBYTE)。指針就是地址。地址是內(nèi)存的序號(hào)。
指針通過(guò)指向內(nèi)存的序號(hào)訪問(wèn)內(nèi)存。替換點(diǎn)是都是地址。

內(nèi)部的括號(hào)用來(lái)強(qiáng)制類型轉(zhuǎn)換用的,外部的的括號(hào)用來(lái)防止宏定義展開時(shí)錯(cuò)誤的用法。
/*************************************************************************************/
再如:
#define COM8255 XBYTE[0X060FF] //后面若出現(xiàn)COM8255,
則單片機(jī)端口P0和P2聯(lián)合輸出0X060FF絕對(duì)物理地址(地址指向82C55指令寄存器)
#define PA8255 XBYTE[0X000FF] //后面若出現(xiàn)PA8255,
則單片機(jī)端口P0和P2聯(lián)合輸出0X000FF絕對(duì)物理地址(地址指向82C55的A組端口寄存器)
#define PB8255 XBYTE[0X020FF] //后面若出現(xiàn)PB8255,
則單片機(jī)端口P0和P2聯(lián)合輸出0X020FF絕對(duì)物理地址(地址指向82C55的B組端口寄存器)
#define PC8255 XBYTE[0X040FF] //后面若出現(xiàn)PC8255,
則單片機(jī)端口P0和P2聯(lián)合輸出0X040FF絕對(duì)物理地址(地址指向82C55的C組端口寄存器)


回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表