下面分享下自己在數據采集器項目時,需要較多的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--);
}
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!