P0为复用端口,可以有效减少IO口数量
74HC138译码器的使用:
下面实现一个程序功能,对LED的控制
使LED灯闪烁8次,然后从左到右依次点亮LED,再依次关闭(根据原理图可知高电平熄灭,低电平点亮)
#include "reg52.h"
//void Delay(unsigned char t)
//{
// while(t--);
// while(t--);
//}
void Delay(unsigned int xms) //@12.000MHz
{
while(xms--)
{
unsigned char i, j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
}
void LED()
{
unsigned char i;
P2=(P2&0x1F)|0x80; //选中Y4
for(i=0;i<8;i++)
{
P0=0x00;
Delay(500);
P0=0xff;
Delay(500);
}
for(i=1;i<=8;i++)
{
P0=0xff<<i;
Delay(500);
}
for(i=1;i<=8;i++)
{
P0=~(0xff<<i);
Delay(500);
}
}
void Initsys() //系统初始化,关闭外设
{
P2=(P2&0x1F)|0xa0; //选中Y5
P0=0x00;
}
void main()
{
Initsys();
while(1)
{
LED();
}
}
在了解74HC138译码器后,可以编写一个选择函数方便使用
void Select_74HC(unsigned char n)
{
switch(n)
{
case 4:
P2=(P2&0x1f)|0x80; //选择Y4,控制LED
break;
case 5:
P2=(P2&0x1f)|0xa0; //Y5控制外设
break;
case 6:
P2=(P2&0x1f)|0xc0; //Y6
break;
case 7:
P2=(P2&0x1f)|0xe0; //Y7
break;
}
}