今天无聊去了解了一下开发板的两种编程模式,发现挺有乐趣。
0、CT107D开发板两种编程方式
CT107D 单片机综合训练平台具有 IO 扩展模式和存储器映射(MM)扩展模式,可以通过调节板上跳线J13进行配置。其中 IO扩展模式较为容易理解,存储器映射扩展模式可以直接通过XBYTE 关键字来操作部分资源,能够大大简化外设资源程序设计,下面将举例点亮LED说明两种扩展方式。
MM编程仅作为拓展视野,比赛还是最好使用IO来!
1、IO扩展模式
偷旭博一张图=,=
我们可以看之前的有关LED的代码。
具体参考:蓝桥杯(1)——LED(https://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
(出处: 单片机论坛)