蓝桥杯之单片机设计与开发(5)——有关于存储器映射扩展模式(MM)

 

今天无聊去了解了一下开发板的两种编程模式,发现挺有乐趣。

0、CT107D开发板两种编程方式

CT107D 单片机综合训练平台具有 IO 扩展模式和存储器映射(MM)扩展模式,可以通过调节板上跳线J13进行配置。其中 IO扩展模式较为容易理解,存储器映射扩展模式可以直接通过XBYTE 关键字来操作部分资源,能够大大简化外设资源程序设计,下面将举例点亮LED说明两种扩展方式。 

MM编程仅作为拓展视野,比赛还是最好使用IO来!

1、IO扩展模式

偷旭博一张图=,=

我们可以看之前的有关LED的代码。

具体参考:蓝桥杯(1)——LEDhttps://blog.csdn.net/Xiaomo_haa/article/details/86495641

点亮LED

//点亮LED
void Led_illume(void)
{
    P2 = (P2 & 0x1f) | 0x80;	//打开Y4C(LED)
    P0 = 0xff;			//关闭LED
    
    delay1000ms();

    P2 = (P2 & 0x1f) | 0x80;	//打开Y4C(LED)
    P0 = 0x00;			//打开LED
}

2、存储器映射扩展模式(MM)

51 单片机可以外扩64K 字节的RAM和ROM空间,传统的8051单片机具有16 位地址总线和 8 位数据总线,其中 P0 口作为数据和地址低字节的复用端口,P2 口作为高 8 位地址线。CT107D 单片机综合训练平台的存储器映射扩展方式(MM),是一种可以像操作外部 RAM存储器一样, 操作LED指示灯、 执行结构 (蜂鸣器、 继电器等..)、数码管、 82C55等外设资源的扩展方式,当然实现这样的操作,是与 CT107D 单片机综合训练平台的硬件设计具有关联性的。举例说明,在上面IO扩展方式里已经介绍过,如果我们希望通过程序点亮或者熄灭LED 指示灯需要进行如下操作:

IO扩展方式代码片段: 

P2 = ((P2&0x1f)|0xA0); 
P0 = 0x00;    // LED = 0xff; 
P2 &= 0x1f; 

 如果,我们将扩展方式配置跳线配置为存储器映射扩展方式(MM),我们可以通过以下
简单代码来实现其操作: 

XBYTE[0x8000] = 0x00; // XBYTE[0x8000] = 0xff; 

到现在存在的疑问是,LED 指示灯模块的地址:0x8000是如何确定的呢?

由CT107D单片机综合训练平台的硬件电路图我们可以知道

当 P2.7 = 1; P2.6 = 0; P2.5 = 0;(其它地址线不需要关心),即可将与 LED 指示灯模块连接的 74HC573“打通” ,此时可以通过 P0
口控制 LED 指示灯的状态。

因此,LED 指示灯模块的地址为 0x8000;由此类推,我们可以知道执行机构模块的操作地址为 0xA000,数码管段码端的操作地址为 0xE000,数码管位选端口的操作地址为0xC000 等等。 

#include "reg52.h" 
#include "absacc.h" 
sbit LCD_E = P1^7; 

//主函数 
void main(void) 
{ 
    LCD_E = 0; //将 LCD 模块禁能,防止LCD模块对总线状态的影响 
    while(1) 
    { 
          XBYTE[0x8000] = 0x00;   //LED 指示灯全部点亮 
          /* 一小段延时函数  */             
          delay(); 
           
          XBYTE[0x8000] = 0xff;   //LED指示灯全部熄灭 
          delay(); 
    } 
} 

MM编程方式,能够简化程序设计,这一点在数码管动态扫描显示的代码部分体现的尤为明显,由于这种扩展方式占用单片机P3.6引脚,在使用4X4矩阵键盘时,不建议使用这种扩展方式。

数码管显示程序片段

IO方式

void display(void)
{
    //数码管消隐
    P2 = (P2&0x1F|0xE0);
    P0 = 0xFF;
    P2 &= 0x1F;

    //位选控制
    P2 = (P2&0x1F|0xC0);
    P0 = (1<<dspcom);
    P2 &= 0x1F;

    //段选控制
    P2 = (P2&0x1F|0xE0);
    P0 = tab[dspbuf[dspcom]];
    P2 &= 0x1F;

    if(++dspcom == 8)
        dspcom = 0;
}

MM方式

void display(void)
{
    //数码管消隐
    XBYTE[0xE000] = 0xFF;

    //位选控制
    XBYTE[0xC000] = (1<<dspcom);

    //段选控制
    XBYTE[0xE000] = tab[dspbuf[dspcom]];

    if(++dspcom == 8)
        dspcom = 0;
}

 

具体可参照蓝桥杯单片机资源扩展方式说明(IO&MM)
http://www.51hei.com/bbs/dpj-124295-1.html
(出处: 单片机论坛)

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值