关键词:IO扩展技术;存储器映射扩展;基础;小蜜蜂
一、知识点
1.IO扩展和存储器映射扩展
2.WR-单片机写引脚,WR=0,Y4C输出0/1由Y4是0/1控制,
3.IO扩展方式用J13的2、3引脚;存储器映射方式用J13的1、2引脚(1引脚连接单片机的P3^6)(执行MOVX写外部存储器,执行MOV写内部存储器,当执行MOVX时,1引脚WR会有信号输出,输出低电平)
4.在4*4矩阵键盘中,用不了存储器映射扩展
二、实验
实验目的:
实验1:IO扩展模式
所需部件:
1.HC573锁存器选择信道
2.Delay函数
3.LEDRunning()先只点亮低四位,后只点亮高四位
4.SMGRunning()数码管逐个闪烁
代码:
#include <REGX52.H>
void Delay(unsigned int t)
{
while(t--);
while(t--);
}
void SelectHC573(unsigned char channel)
{
switch(channel)
{
case 4:P2=(P2&0x1f)|0x80;break;//0x80控制LED的地址
case 5:P2=(P2&0x1f)|0xA0;break;//0xA0控制蜂鸣器和继电器的地址
case 6:P2=(P2&0x1f)|0xC0;break;//0xC0控制数码管段选的地址
case 7:P2=(P2&0x1f)|0xE0;break;//0xE0控制控制数码管位选的地址
}
}
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=0;
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();//LED先亮,再数码管逐个点亮
}
}
实验2:存储器映射扩展
大体与实验1相同,区别:
1.多了头文件(XBYTE关键字才能起作用)——#include "absacc.h"
2.去掉H7573锁存器部分,直接用XBYTE[0x8000]=0xf0;——XBYTE[地址]=数据/指令,取代先选信道再操作的步骤
3.IO扩展方式用J13的2、3引脚;存储器映射方式用J13的1、2引脚
代码:
#include <REGX52.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;
Delay(60000);
Delay(60000);
XBYTE[0x8000]=0xff;
Delay(60000);
Delay(60000);
}
void SMGRunning()
{
unsigned char i=0;
for(i=0;i<8;i++)
{
XBYTE[0xc000]=0x01<<i;
XBYTE[0xe000]=0xff;
Delay(60000);
Delay(60000);
}
XBYTE[0xe000]=0xff;
Delay(60000);
Delay(60000);
}
void main()
{
while(1)
{
LEDRunning();
SMGRunning();//LED先亮,再数码管逐个点亮
}
}
感谢B站小蜜蜂老师的教程,本笔记资料及代码均来自教程,仅作为个人复习、整理和学习交流用。