【蓝桥杯07】——存储器映射扩展技术应用

分别用IO扩展方式与存储器扩展方式,对LED灯和数码管进行基本的控制。

  1. 首先点亮LED灯的低四位,关闭高四位,延时片刻,点亮指示灯的高四位,关闭低四位,延时片刻,关闭所有LED灯。
  2. 然后依次逐个点亮数码管的所有段码,每次只点亮一个数码管。
  3. 循环执行上述功能。

外部资源的地址映射关系

0X8000:LED指示灯;
0Xa000:蜂鸣器与继电器
0Xc000:数码管位选
0Xe000:数码管段选

  1. 进行存储器映射扩展,需要将J13的1,2脚短接。
  2. 引入absacc.h头文件,通过XBYTE关键字来直接操作扩展资源(如点亮所有LED灯—XBYTE[0x8000]=0x00;)。
  3. 存储器映射扩展方式要占用单片机的P3^6引脚。

IO扩展方式

#include <STC15F2K60S2.H>

void delay(unsigned int n);
void selectHC(unsigned char n);
void ledRun();
void smgRun();

sbit beer=P0^6;
void main()
{
    
    
	selectHC(5);
	beer=0;
	P2=P2&0X1F;
	while(1)
	{
    
    
		ledRun();
		smgRun();
  }
}

void delay(unsigned int n)
{
    
    
	while(n--);
	while(n--);
}

void selectHC(unsigned char n)
{
    
    
	switch(n)
	{
    
    
		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 ledRun()
{
    
    
	selectHC(4);
	P0=0xf0;  //低四位亮
	delay(60000);
	delay(60000);
	P0=0x0f;  //高四位亮
	delay(60000);
	delay(60000);
	P0=0xff;  //全部熄灭
	delay(60000);
	delay(60000);
}

void smgRun()
{
    
    
	unsigned char i;
	for(i=0;i<8;i++)
	{
    
    
		selectHC(6); //位选
		P0=0x01<<i;
		selectHC(7); //段选
		P0=0x00;
		delay(60000);
		delay(60000);
  }
	P0=0xff;
	delay(60000);
	delay(60000);
}

存储器扩展方式

#include <STC15F2K60S2.H>
#include <absacc.h>
void delay(unsigned int n);
void selectHC(unsigned char n);
void ledRun();
void smgRun();

sbit beer=P0^6;
void main()
{
    
    
	selectHC(5);
	beer=0;
	P2=P2&0X1F;
	while(1)
	{
    
    
		ledRun();
		smgRun();
  }
}

void delay(unsigned int n)
{
    
    
	while(n--);
	while(n--);
}

void selectHC(unsigned char n)
{
    
    
	switch(n)
	{
    
    
		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 ledRun()
{
    
    
	XBYTE[0x8000]=0xf0;  //相当于两句代码	selectHC(4);P0=0xf0;//低四位亮
	delay(60000);
	delay(60000);
	XBYTE[0x8000]=0x0f;  //  P0=0x0f;//高四位亮
	delay(60000);
	delay(60000);
	XBYTE[0x8000]=0xff;  //	P0=0xff;  //全部熄灭
	delay(60000);
	delay(60000);
}

void smgRun()
{
    
    
	unsigned char i;
	for(i=0;i<8;i++)
	{
    
    
		
		XBYTE[0xc000]=0x01<<i; //位选
		XBYTE[0xe000]=0x00;    //段选
		delay(60000);
		delay(60000);
  }
	XBYTE[0xe000]=0xff;
	delay(60000);
	delay(60000);
}

猜你喜欢

转载自blog.csdn.net/z3447643805/article/details/113799876