蓝桥杯10-存储器mm模式写法

一、概念原理

        51 单片机可以外扩 64K 字节的 RAM ROM 空间,传统的 8051 单片机具有 16 位地
址总线和 8 位数据总线,其中 P0 口作为数据和地址低字节的复用端口, P2 口作为高 8
地址线。 CT107D 单片机综合训练平台的存储器映射扩展方式( MM ), 是一种可以像操作
外部 RAM 存储器 一样,操作 LED 指示灯、执行结构(蜂鸣器、继电器等 .. )、数码管、 82C55
等外设资源的扩展方式,当然实现这样的操作,是与 CT107D 单片机综合训练平台的硬件
设计具有关联性的。    使用XBYTE关键字

【注】LED 指示灯模块的地址为 0x8000

        蜂鸣器继电器的操作地址为 0xA000
        数码管段码端的操作地址为 0xE000
        数码管位选端口的操作地址为 0xC000
     使用mm模式相当于少写了选择锁存器的函数;

二、与IO模式的区别:

(1)头文件里需引入 #include "absacc.h"
(2)存储器映射模式: XBYTE[ 0x8000 ] = 0x00 ;
          IO模式:P2 = ((P2& 0x1f)| 0xA0);
                        P0 = 0x00 ; // LED = 0xff;
                        P2 &= 0x1f ;
(3)存储器映射扩展方式占用单片机的P3.6引脚;
三、示例对比

 

IO模式:

#include "reg52.h"

void SelectHC573(unsigned char channel)
{
    switch(channel)
    {
        case 4 : P2 = (P2 & 0x1f) | 0x80; break;
        case 5 : P2 = (P2 & 0x1f) | 0xa0; break;
        case 6 : P2 = (P2 & 0x1f) | 0xc0; break;
        case 7 : P2 = (P2 & 0x1f) | 0xe0; break;
    }

}

void Delay(unsigned int t)
{
    while(t--);
        while(t--);

}

void LEDRunning()
{
    SelectHC573(4);
    P0 = 0xf0;
    Delay(60000);
    Delay(60000);
    P0 = 0x0f;
    Delay(60000);
    Delay(60000);
    P0 = 0xff;
    Delay(60000);
    Delay(60000);
}


void SMGRunning()
{

    unsigned char i;
    for(i=0;i<8;i++)
    {
            SelectHC573(6);
            P0 = 0x01 << i;
            SelectHC573(7);
            P0 = 0x00;
            Delay(60000);
        Delay(60000);
        }
        P0 = 0xff;
            Delay(60000);
        Delay(60000);
}

void main()
{
    
    while(1)
    {
        LEDRunning();
        SMGRunning();
    }
    
}

存储器扩展模式:

#include "reg52.h"

#include "absacc.h"


void Delay(unsigned int t)
{
    while(t--);
        while(t--);

}

void LEDRunning()
{
  XBYTE[0x8000] = 0xf0;
    
    Delay(60000);
    Delay(60000);
    XBYTE[0x8000] = 0x0f;
    //P0 = 0x0f;
    Delay(60000);
    Delay(60000);
    XBYTE[0x8000] = 0xff;
    //P0 = 0xff;
    Delay(60000);
    Delay(60000);
}


void SMGRunning()
{

    unsigned char i;
    for(i=0;i<8;i++)
    {
            XBYTE[0xc000] = 0x01 <<i;
            //SelectHC573(6); P0 = 0x01 << i;
            XBYTE[0xe000] = 0x00;
            //SelectHC573(7);P0 = 0x00;
            Delay(60000);
        Delay(60000);
        }
        XBYTE[0xe000] = 0xff;
            Delay(60000);
        Delay(60000);
}

void main()
{
    
    while(1)
    {
        LEDRunning();
        SMGRunning();
    }
    
}


 

 

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值