基本功能:三次亮灭,依次从左往右增加一个点亮小灯,再依次从左往右逐渐一个熄灭小灯
首先根据CT107D单片机开发板原理图,操作LED需要使用P0端口,P2端口,74HC138译码器,74HC573锁存器。我们从LED开始分析,根据原理图可知,点亮LED需要低电平,则我们需要Q1-Q8输出低电平。
那我们先来了解74HC573
真值表
其中X为叉号,表示无关,
Z表示高阻,即输出开路
只有当OE端为低电平、LE端为高电平时,Q端的输出才会和D端的输入保持一致,
当OE端为高电平时,无论LE为何种电平,Q端都为高阻态,即无论此时D端如何变化,Q端总是保持当前状态,而不会随D端的数据变化而变化。
所以需要Q1-Q8输出低电平,我们要保证OE端为低电平、LE端为高电平,D1-D8为低电平,即P0端口全部为0,接下来我们一步步分析。OE已经接地,默认为低电平,这个条件已经满足。然后是LE端,我们看到它的网络标号是Y4C,我们需要它为高电平,而它的电平取决于74HC02四输入或非门,以下为或非门真值表
结合原理图分析,我们需要Y4C输出为高电平,那么得保证它的输入端都为0,WR我们可以理解低电平,那么我们需要保证Y4为低电平,而Y4的电平取决于74HC138译码器。
那我们来了解74HC138
真值表
H
代表高电平,L
代表低电平,X
代表随机电平(可高可低)(A0--A,A1--B,A2--C)
根据原理图和真值表可知,在74HC138的A,B,C端口状态未知时,Y0-Y7默认为高电平
我们要让Y4为低电平,则需要保证A=0,B=0,C=1,即需要P25=0,P26=0,P27=1
至此我们操控LED的模块全部弄好了,可以开始使用代码来点灯
#include<reg52.h>
sbit HC138_A=P2^5;
sbit HC138_B=P2^6;
sbit HC138_C=P2^7;
void main()
{
HC138_C=1;
HC138_B=0;
HC138_A=0;
P0=0x00;
}
我们可以看到灯全部点亮了,接下来实现基本功能:三次亮灭,依次从左往右增加一个点亮小灯,再依次从左往右逐渐一个熄灭小灯
#include<reg52.h>
#define uchar unsigned char
sbit HC138_A=P2^5;
sbit HC138_B=P2^6;
sbit HC138_C=P2^7;
void Delay(unsigned int t)
{
while(t--);
while(t--);
}
void LEDRunning()
{
uchar i;
HC138_C=1;
HC138_B=0;
HC138_A=0;
for(i = 0; i < 3; i++)
{
P0 = 0x00;
Delay(60000);
Delay(60000);
P0 = 0xff;
Delay(60000);
Delay(60000);
}
for(i = 1; i <= 8; i++)
{
P0 = 0xff << i;
Delay(60000);
Delay(60000);
}
for(i = 1; i <= 8; i++)
{
P0 = ~(0xff << i);
Delay(60000);
Delay(60000);
}
}
void main()
{
while(1)
{
LEDRunning();
}
}
是不是很简单,我们再来试试从右往左点灯,其他条件不变
#include<reg52.h>
#define uchar unsigned char
sbit HC138_A=P2^5;
sbit HC138_B=P2^6;
sbit HC138_C=P2^7;
void Delay(unsigned int t)
{
while(t--);
while(t--);
}
void LEDRunning()
{
uchar i;
HC138_C=1;
HC138_B=0;
HC138_A=0;
for(i = 0; i < 3; i++)
{
P0 = 0x00;
Delay(60000);
Delay(60000);
P0 = 0xff;
Delay(60000);
Delay(60000);
}
for(i = 1; i <= 8; i++)
{
P0=0Xff>>i;
Delay(60000);
Delay(60000);
}
for(i = 1; i <= 8; i++)
{
P0 = ~(0xff >> i);
Delay(60000);
Delay(60000);
}
}
void main()
{
while(1)
{
LEDRunning();
}
}
左移从低位开始补0,右移从高位开始补0,使LED点亮顺序发生改变