实现过程
74HC138译码器(38译码器)——>74HC02或非门——>74HC573锁存器
三八译码器
三个输入控制八路互斥的低有效输出(三个P2口控制8个Y口,控制Y4输出低电平)
74HC02或非门
Y4输出低电平后,通过或非门,此时WR是低电平(使用I/O扩展的方式),Y4C输入高电平,即LE为高电平(相当于使锁存器工作),LED才能发光,至于P0口的编码形式就不写了(这很简单)
74HC573锁存器
- OE:输出使能(Output Enable)
- LE:锁存使能(Latch Enable)
(这两个还没学过,不影响学习)
来更新了,
D端是输入端,Q为输出端
注意OE上有横杠,表示低电平有效(即低电平的时候,电路才会工作),所以OE接的是GND端
当由Y4C输入高电平时,即LE为高电平,这个时候Q端的状态由D端的状态决定;当LE为低电平时,这个时候,无论D是什么状态,Q都保持上一次的数据状态。
如图所示:
- 74HC573锁存器
- 74HC138译码器(38译码器)和 74HC02或非门
J5,J2,J13跳线帽的不同的引脚接法(关于引脚接法,后期学深了会更新的)
跳线帽接法(这个程序的接法):J5接KBD端 J13接I/O口 J2接2-4 1-3端
代码如下:
#include <reg52.h>
//sbit HC138_C=P2^7;
//sbit HC138_B=P2^6;
//sbit HC138_A=P2^5;
void Delay(unsigned int t){//延时函数
while(t--);
while(t--);
}
void LEDrunning()//LED灯闪烁三次,再以流水灯形式走一遍,不断重复以上操作
{
unsigned char i;
// HC138_C=1;
//HC138_B=0;
// HC138_A=0;
//注释的代码和打开寄存器,关闭寄存器的代码效果是一样的
P2 = (P2&0x1F|0x80);//打开寄存器
for(i=0;i<3;i++)
{
P0=0x00;//led灯全开
Delay(60000);
Delay(60000);
P0=0xff;//led灯全关
Delay(60000);
Delay(60000);
}
//下面两个for循环,构成了led灯流水灯形式
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);
}
P2 &= 0x1F;//关闭寄存器
}
void cls_buzz(void)//关闭蜂鸣器
{
P2 = (P2&0x1F|0xA0);
P0 = 0x00;
P2 &= 0x1F;
}
void main()
{
cls_buzz();
while(1){
LEDrunning();
}
}
基本就是这样控制LED灯的显示,后期学深了会更新。
来更新了,
关闭外设
void cls_buzz(void)//关闭蜂鸣器
{
P2 = (P2&0x1F|0xA0);
P0 = 0x00;
P2 &= 0x1F;
}
-
P2 = (P2&0x1F|0xA0);
0x1F写成二进制是0001 1111。P2口的默认状态是1111 1111。P2&0x1f是为了把高三位清0,因为我们在目前这个寄存器来看,我们只需要控制P7-5这三个端口,0xA0 是1010 0000 ,这个代码是为了让Y5为低电平,通过或非门是Y5C输入为高电平,来控制Y5C锁存器(如图所示) -
P0 = 0x00;
ULN2003,相当于一个非门,来关闭蜂鸣器和继电器(详细见这个专栏的蜂鸣器和继电器) -
P2 &= 0x1F;
关闭,这个寄存器的使用就结束了
打开使用LED的寄存器
P2 = (P2&0x1F|0x80);//打开寄存器
这个是打开Y4C锁存器
P2 &= 0x1F;//关闭寄存器
关闭Y4C锁存器