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--);
}