由上图可以看到8个共阳LED灯接到了573输出口,而573输入接到单片机P0口上。当573 LE脚输入高电平时,输出随输入变化,当LE为低电平时,输出锁存。
由上图可以看到Y4C接到了或非门74HC02的输出端,而输入端为WR和138输出端Y4。现在我们把WR接地,通过控制138译码器即可控制Y4C。例:P25=0;P26=0;P27=1;则Y4=0;则Y4C=1;
void Set_Leds(unsigned char Leds)
{
//选中LED所在573,此时输出跟随输入变化
P25=0;P26=0;P27=1; //74HC138-->Y4=0,else=1-->Y4C=1,else=0
P0=Leds;
//锁存LED所在573
P25=0;P26=0;P27=0; //74HC138-->Y1=0,else=1
}
由上图我们可以看到蜂鸣器以及继电器都是低电平有效,接到了ULN2003输出端,ULN2003内部结构为输入先经过非门再接入达林顿管,如果ULN2003输入为0,则输出为1。所以解决办法就是我们上电先控制138选中Y5输出低电平,则Y5C为高电平,然后单片机P0输出低电平,则ULN2003输出高电平,蜂鸣器继电器关闭,然后再让Y5C为低电平锁存一下573即可。
示例代码:
#include "led.h"
void System_Init(void);
void main()
{
System_Init();
Set_Leds(0xEF); //点亮L5
while(1)
{
}
}
void System_Init()//系统上电初始化
{
//先锁存蜂鸣器,继电器所在573输出低电平,防止上电乱叫
P25=1;P26=0;P27=1; //74HC138-->Y5=0,else=1-->Y5C=1,else=0
P0=0x00; //ULN2003输入经过非门送入达林顿管,低电平有效
P25=0;P26=0;P27=0;//锁存数据
}