IO 与 MM模式

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控制外部接口。

  • 3
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值