IO扩展模式
IO模式,我们最开始学习51单片机的时候。
sbit P0_0 = P0^0; //位定义
P0_0 = 1; //直接对端口进行赋值。
而P0^0在 reg51.h 中 sfr P0 = 0x80。地址0x80为特殊寄存器。
直接对寄存器赋值。
MM(存储器映射)扩展模式
以传统得8051单片机为例,它具有16位的地址总线和8位数据总线,其中P0口作为数据和地址低字节的复用端口,P2口作为高8位地址总线。以蓝桥杯CT107D单片机综合训练平台为例,MM模式是一种可以像操作外部RAM储存器一样,操作外部接口器件。
所需要包含的头文件: absacc.h (Keil软件自带的库函数)
肯定有对8051单片机的存储地址空间划分不清楚的。下面这个链接可以参考一下。
https://www.cnblogs.com/smartjourneys/p/7487997.html
/*--------------------------------------------------------------------------
ABSACC.H
直接访问8051,扩展8051和NXP8051MX内存区域..
--------------------------------------------------------------------------*/
#ifndef __ABSACC_H__
#define __ABSACC_H__
#define CBYTE ((unsigned char volatile code *) 0)
// code ->程序储存区(64K地址范围)
#define DBYTE ((unsigned char volatile data *) 0)
// data 可寻址片内RAM
#if !defined (__CX2__)
#define PBYTE ((unsigned char volatile pdata *) 0)
// pdata 分页寻址片外RAM
#endif
#define XBYTE ((unsigned char volatile xdata *) 0)
// xdata 可寻址片外RAM
#define CWORD ((unsigned int volatile code *) 0)
#define DWORD ((unsigned int volatile data *) 0)
#if !defined (__CX2__)
#define PWORD ((unsigned int volatile pdata *) 0)
#endif
#define XWORD ((unsigned int volatile xdata *) 0)
#if defined (__CX51__) || defined (__CX2__)
#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
#if defined (__CX2__)
#define HBYTE ((unsigned char volatile huge *) 0)
#define HWORD ((unsigned int volatile huge *) 0)
#define HVAR(object, addr) (*((object volatile huge *) (addr)))
#define HARRAY(object, base) ((object volatile huge *) (base))
#endif
#define CVAR(object, addr) (*((object volatile code *) (addr)))
#define CARRAY(object, base) ((object volatile code *) (base))
#define DVAR(object, addr) (*((object volatile data *) (addr)))
#define DARRAY(object, base) ((object volatile data *) (base))
#define XVAR(object, addr) (*((object volatile xdata *) (addr)))
#define XARRAY(object, base) ((object volatile xdata *) (base))
#endif
蓝桥杯CT107D原理图如下:
不难得出:
Y4C 的地址为:8000H
Y5C 的地址为:A000H
Y6C 的地址为:C000H
Y7C 的地址为:E000H
说白了,类似于片选信号。但是不一样,我的理解是xXBYTE[8000]=0x00。这条指令包含地址信息8000H的锁存和0x00数据的输送。类比8086控制外部接口。