absacc.h keil軟件里怎么找不到 ,如何找?


 
        
把下面的內容保存成absacc.h即可:原因是高版本的KEIL進行了優化,將以前很多庫文件去除了,需要用戶手動添加
#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)
#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


當51單片機通過8255和鎖存器74LS273來擴展IO時,經常用到頭文件absacc.h。

在程序中,用“#include<absacc.h>”即可使用其中定義的宏來訪問絕對地址,包括:CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD

例如:
rval=CBYTE[0x0002];指向程序存貯器的0002h地址
rval=XWORD [0x0002];指向外RAM的0004h地址

再如:

#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組端口寄存器)

absacc.h里的宏#define CBYTE ((unsigned char volatile code   *) 0) 

value = CBYTE[0x002]; 

這句該如何理解?

A1: 

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

A2: 

替換一下考慮

value = ((unsigned char volatile *) 0)[0x02]; 

替換一下考慮

unsigned char volatile *CBYTE = 0/*NULL*/; 

這里CBYTE[0x02] = 1和*(CBYTE+0x02) = 1等價 

#define CBYTE ((unsigned char volatile code   *) 0) 是把CBYTE是指針,即code地址0 在這里,數組和指針是可以互用的。

CBYTE[0x02]也就是*(CBYTE+0x02),都是指的是地址0x02里的內容,並是unsigned char 類型的。

#define CBYTE ((unsigned char volatile code   *) 0) 

考慮下這個define定義的內容

1、把CBYTE定義成一個0(0); 

2、這個0是個地址(*號);

3、這個地址是代碼段的地址(code); 

4、並是unsigned char類型的地址(unsigned char); 

5、並這個地址的內容是易逝性的(volatile); 本質上是定義了一個地址(CBYTE )。指針就是地址。地址是內存的序號。指針通過指向內存的序號訪問內存。替換點是都是地址。

內部的括號用來強制類型轉換用的,外部的的括號用來防止宏定義展開時錯誤的用法

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM