下面分享下自己在数据采集器项目时,需要较多的LED显示状态,但是单片机的IO口不够用,使用38译码器扩展单片机IO口。

单片机原理图

数据采集器项目,使用74HC138D芯片(38译码器)扩展IO口控制LED灯,原理图如下。使用74HC138D芯片的A0、A1、A3、E3与单片机(STM32F407)的GPIO_A2、GPIO_A3、GPIO_A4、GPIO_A0相连。由原理看出,低电平时LED导通。

单片机8位数码管显示特定数字(使用38译码器扩展单片机IO口)(1)

38译码器工作原理分析

通过74HC138D数据手册的真值表得出,控制原理,如下图所示。当E1、E2接低电平、E3接高电平时,可通过输入端(A2、A1、A0)实现输出端(Y0、Y1、Y2、Y3、Y4、Y5、Y6、Y7、Y8)的分别控制。

单片机8位数码管显示特定数字(使用38译码器扩展单片机IO口)(2)

A2、A1、A0均为低电平时,输出端Y0低电平,灯D1亮,其他灭。

A2低、A1低、A0高电平时,输出端Y1低电平,灯D2亮,其他灭。

A2低、A1高、A0低电平时,输出端Y2低电平,灯D3亮,其他灭。

A2低、A1高、A0高电平时,输出端Y3低电平,灯D4亮,其他灭。

A2高、A1低、A0低电平时,输出端Y4低电平,灯D5亮,其他灭。

A2高、A1低、A0高电平时,输出端Y5低电平,灯D6亮,其他灭。

A2高、A1高、A0低电平时,输出端Y6低电平,灯D7亮,其他灭。

A2高、A1高、A0高电平时,输出端Y7低电平,灯D8亮,其他灭。

测试代码分析

这里以8个LED灯实现流水灯的代码进行演示,代码如下。在主函数中调用led_74hc138()函数,即可实现流水灯程序。

void led_74hc138(void)

{

HAL_GPIO_WritePin( GPIOA, GPIO_PIN_0, GPIO_PIN_SET);//使能38控制器的控制端

//实现D1亮

Delay(0xFFFFFF);

HAL_GPIO_WritePin( GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);

HAL_GPIO_WritePin( GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);

HAL_GPIO_WritePin( GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);

//实现D2亮

Delay(0xFFFFFF);

HAL_GPIO_WritePin( GPIOA, GPIO_PIN_3, GPIO_PIN_SET);

HAL_GPIO_WritePin( GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);

HAL_GPIO_WritePin( GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);

//实现D3亮

Delay(0xFFFFFF);

HAL_GPIO_WritePin( GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);

HAL_GPIO_WritePin( GPIOA, GPIO_PIN_4, GPIO_PIN_SET);

HAL_GPIO_WritePin( GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);

//实现D4亮

Delay(0xFFFFFF);

HAL_GPIO_WritePin( GPIOA, GPIO_PIN_3, GPIO_PIN_SET);

HAL_GPIO_WritePin( GPIOA, GPIO_PIN_4, GPIO_PIN_SET);

HAL_GPIO_WritePin( GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);

//实现D5亮

Delay(0xFFFFFF);

HAL_GPIO_WritePin( GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);

HAL_GPIO_WritePin( GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);

HAL_GPIO_WritePin( GPIOA, GPIO_PIN_5, GPIO_PIN_SET);

//实现D6亮

Delay(0xFFFFFF);

HAL_GPIO_WritePin( GPIOA, GPIO_PIN_3, GPIO_PIN_SET);

HAL_GPIO_WritePin( GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);

HAL_GPIO_WritePin( GPIOA, GPIO_PIN_5, GPIO_PIN_SET);

//实现D7亮

Delay(0xFFFFFF);

HAL_GPIO_WritePin( GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);

HAL_GPIO_WritePin( GPIOA, GPIO_PIN_4, GPIO_PIN_SET);

HAL_GPIO_WritePin( GPIOA, GPIO_PIN_5, GPIO_PIN_SET);

//实现D8亮

Delay(0xFFFFFF);

HAL_GPIO_WritePin( GPIOA, GPIO_PIN_3, GPIO_PIN_SET);

HAL_GPIO_WritePin( GPIOA, GPIO_PIN_4, GPIO_PIN_SET);

HAL_GPIO_WritePin( GPIOA, GPIO_PIN_5, GPIO_PIN_SET);

}

void Delay(__IO uint32_t nCount) //简单的延时函数

{

for (; nCount != 0; nCount--);

}

,