zoukankan      html  css  js  c++  java
  • 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 )。指针就是地址。地址是内存的序号。指针通过指向内存的序号访问内存。替换点是都是地址。

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

     

  • 相关阅读:
    JavaSE: PrintStream类 和 PrintWriter类
    JavaSE: BufferedWriter类 和 BufferedReader类
    JavaSE: BufferedOutputStream类 和 BufferedInputStream类
    JavaSE: FileOutputStream类 & FileInputSteam类
    MYSQL指令
    用Java GUI做一个简单的管理系统
    [置顶] 用Java GUI做一个简单的管理系统
    HTML5+CSS 静态网页-极米商城
    爬取百度图片
    GhostNet
  • 原文地址:https://www.cnblogs.com/yuandongtao1989/p/6672863.html
Copyright © 2011-2022 走看看