下面分享下自己在数据采集器项目时,需要较多的LED显示状态,但是单片机的IO口不够用,使用38译码器扩展单片机IO口。
单片机原理图数据采集器项目,使用74HC138D芯片(38译码器)扩展IO口控制LED灯,原理图如下。使用74HC138D芯片的A0、A1、A3、E3与单片机(STM32F407)的GPIO_A2、GPIO_A3、GPIO_A4、GPIO_A0相连。由原理看出,低电平时LED导通。
38译码器工作原理分析
通过74HC138D数据手册的真值表得出,控制原理,如下图所示。当E1、E2接低电平、E3接高电平时,可通过输入端(A2、A1、A0)实现输出端(Y0、Y1、Y2、Y3、Y4、Y5、Y6、Y7、Y8)的分别控制。
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--);
}
,