74HC595是在單片機系統中常用的芯片之一他的作用就是把串行的信號轉爲並行的信號,常用在各種數碼管以及點陣屏的驅動芯片, 使用74HC595可以節約單片機mcu的io口資源,用3個io就可以控制8個數碼管的引腳,他還具有一定的驅動能力,可以免掉三極管等放大電路,所以這塊芯片是驅動數碼管的神器.應用非常廣泛。
74HC595引腳圖
74HC595管腳功能
我選用的單片機型號爲:STM32L052K8系列的低功耗芯片,其實與F4系列和F1系列都是一樣使用。
下面來看一下接線:
可以從上圖中清晰的看到與單片機的連線。
兩個595通過級聯的形式進行連接。
兩個數碼管爲共陽極
那如何進行代碼實現呢?
這樣我們就可以寫出595的驅動程序,如下:
/**********************************/
/** 函數名稱:void HC595_Write_Data(unsigned char dis_data) **/
/** 輸入參數:unsigned char dis_data 需要輸入的數據 */
/** 函數功能:將數據寫進74HC595中*/
/** ****************************** **/
void HC595_Write_Data(unsigned char dis_data)
{
unsigned char i;
unsigned char temp;
temp = dis_data;
for(i=0;i<8;i++) // 循環將一個字節的八位依次寫入到寄存器
{
HAL_GPIO_WritePin(SRCLK_GPIO_Port,SRCLK_Pin,GPIO_PIN_RESET);// SRCLK低電平
if(temp & 0X80)
{
HAL_GPIO_WritePin(DATA_GPIO_Port,DATA_Pin,GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(DATA_GPIO_Port,DATA_Pin,GPIO_PIN_RESET);
}
temp = temp<<1;
HAL_GPIO_WritePin(SRCLK_GPIO_Port,SRCLK_Pin,GPIO_PIN_RESET); // SRCLK低電平
HAL_GPIO_WritePin(SRCLK_GPIO_Port,SRCLK_Pin,GPIO_PIN_SET); // SRCLK高電平
}
}
/****************************************/
/**函數名稱:void Disp_out(void)*/
/**函數參數:無參*/
/**函數功能:將寫入到寄存器的數據輸出到端口顯示*/
/****************************************/
void Disp_out(void)
{
HAL_GPIO_WritePin(RCLK_GPIO_Port,RCLK_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(RCLK_GPIO_Port,RCLK_Pin,GPIO_PIN_SET);
}
IO口初始化函數爲: 都設置成推完輸出,無上拉就行
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, SRCLK_Pin|DATA_Pin, GPIO_PIN_SET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(RCLK_GPIO_Port, RCLK_Pin, GPIO_PIN_SET);
/*Configure GPIO pins : SRCLK_Pin DATA_Pin */
GPIO_InitStruct.Pin = SRCLK_Pin|DATA_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pin : RCLK_Pin */
GPIO_InitStruct.Pin = RCLK_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(RCLK_GPIO_Port, &GPIO_InitStruct);
}
現在要動態顯示1234
主函數代碼爲:
int main(void)
{
MX_GPIO_Init();
while (1)
{
HC595_Write_Data(0x01); // 片選第一個數碼管
HC595_Write_Data(0x99);
Disp_out();
HAL_Delay(2); // 延時2ms
HC595_Write_Data(0x02); // 片選第二個數碼管
HC595_Write_Data(0xb0);
Disp_out();
HAL_Delay(2); // 延時2ms
HC595_Write_Data(0x04); // 片選第三個數碼管
HC595_Write_Data(0xa4);
Disp_out();
HAL_Delay(2); // 延時2ms
HC595_Write_Data(0x08); // 片選第四個數碼管
HC595_Write_Data(0xf9); //
Disp_out();
HAL_Delay(2); // 延時2ms
}
}
效果如圖:
有一個小的提示:當有595級聯的時候,如有兩個快595級聯。
HC595_Write_Data(0x01); // 片選第一個數碼管 先發的數據會級聯到第二塊595芯片中
HC595_Write_Data(0x99); // 後發的這個數據纔是第一塊595芯片的數據
Disp_out(); // 最後將數據傳輸到各自的端口,進行功能操作
到這裏就結束了,大家可以互相學習,提出建議。