一、先前知识
74HC138译码器
74HC138译码器是一款高速CMOS器件,74HC138引脚兼容低功耗肖特基TTL(LSTTL)系列。74HC138译码器可接受3位二进制加权地址输入(A, B和C),并当使能时,提供8个互斥的低有效输出(Y0至Y7)。
74HC138特有3个使能输入端:两个低有效(G2A和G2B)和一个高有效(G1)。除非G2A和G2B置低且G1置高,否则74HC138将保持所有输出为高。
![](https://img-blog.csdnimg.cn/img_convert/7e043c67183255d773985873dafcf6c1.png)
图一、74HC138译码器模块
![](https://img-blog.csdnimg.cn/img_convert/f7cf16ff2d846c25cc9c785308367288.png)
图二、74HC138译码器输出经或非门
![](https://img-blog.csdnimg.cn/img_convert/a5e9cebe1126cdff8e04950049afc7a1.png)
图三、74HC138译码器功能表
74HC573锁存器
74HC573锁存器是八路三态输出的非反转透明锁存器。
当锁存器使能端LE为高时,这些器件的锁存对于数据是透明的(也就是说输出同步)。当锁存器使能变低时,符合建立时间和保持时间的数据会被锁存。
![](https://img-blog.csdnimg.cn/img_convert/218cca6e964437232c964074e5c066a4.png)
图四、74HC573锁存器模块
![](https://img-blog.csdnimg.cn/img_convert/5cb8aa716c41211d388b2485e6937181.png)
图五、74HC573锁存器功能表
LED模块
八个发光二极管的正极都经1K电阻接在一个上拉高电平VCC上。当负极输入低电平时,发光二极管导通点亮;当负极输入高电平时,发光二极管截止不会点亮。
![](https://img-blog.csdnimg.cn/img_convert/404f53538f15aa098616ae16040dfa98.png)
图六、LED灯模块
二、模块控制实现过程简述
要控制LED模块,就需要先往74HC138译码器中写入二进制数100(十进制数为4),输出就是Y4为低电平,经过一个或非门输出的Y4C就为高电平,再输入74HC573锁存器。然后控制LED灯的点亮。
三、所要实现的功能
让八个LED灯一起以1秒为间隔闪烁四次,接着依次点亮LED灯,再依次熄灭LED灯。程序循环实现上述功能。
四、代码实现
#include <STC15F2K60S2.H>
#include "Delay_ms.h"
// 引脚定义
sbit HC138_A = P2^5;
sbit HC138_B = P2^6;
sbit HC138_C = P2^7;
// HC138译码器状态初始化
void HC138_Init(void)
{
// 138译码器输出Y4为低电平,则输出的Y4C为高电平,573锁存器正常工作
HC138_C = 1;
HC138_B = 0;
HC138_A = 0;
}
// 点亮LED灯
void LED_Light(void)
{
int i;
// 闪四下
for( i=0 ; i<4 ; i++ )
{
P0 = 0x00; // 全部点亮
Delay_tms( 2000 );
P0 = 0xff; // 全部熄灭
Delay_tms( 2000 );
}
// LED按顺序点亮
for( i=1 ; i<=8 ; i++ ) // 亮
{
P0 = 0xff << i;
Delay_tms( 250 );
}
for( i=1 ; i<=8 ; i++ ) // 灭
{
P0 = ~( 0xff << i );
Delay_tms( 250 );
}
}
int main(void)
{
while(1)
{
HC138_Init(); // HC138译码器状态初始化
LED_Light(); // 点亮LED灯
}
}
void Delay_tms( unsigned int t ) // 延时函数
{
int i;
while( t-- )
{
for( i=115 ; i>0 ; i-- )
{
}
}
}
五、运行图片
![](https://img-blog.csdnimg.cn/img_convert/f229d790ec509ff48d304166dedc2c7b.jpeg)