分别用IO扩展方式与存储器扩展方式,对LED灯和数码管进行基本的控制。
- 首先点亮LED灯的低四位,关闭高四位,延时片刻,点亮指示灯的高四位,关闭低四位,延时片刻,关闭所有LED灯。
- 然后依次逐个点亮数码管的所有段码,每次只点亮一个数码管。
- 循环执行上述功能。
外部资源的地址映射关系
0X8000:LED指示灯;
0Xa000:蜂鸣器与继电器
0Xc000:数码管位选
0Xe000:数码管段选
- 进行存储器映射扩展,需要将J13的1,2脚短接。
- 引入absacc.h头文件,通过XBYTE关键字来直接操作扩展资源(如点亮所有LED灯—XBYTE[0x8000]=0x00;)。
- 存储器映射扩展方式要占用单片机的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);
}