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

发布时间:2024-08-05  

把下面的内容保存成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”即可使用其中定义的宏来访问绝对地址,包括: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 )。指针就是地址。地址是内存的序号。指针通过指向内存的序号访问内存。替换点是都是地址。

内部的括号用来强制类型转换用的,外部的的括号用来防止宏定义展开时错误的用法


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>