【STM32学习】(14)两个74HC595控制四个数码管显示

74HC595是在单片机系统中常用的芯片之一他的作用就是把串行的信号转为并行的信号,常用在各种数码管以及点阵屏的驱动芯片, 使用74HC595可以节约单片机mcu的io口资源,用3个io就可以控制8个数码管的引脚,他还具有一定的驱动能力,可以免掉三极管等放大电路,所以这块芯片是驱动数码管的神器.应用非常广泛。

【STM32学习】(14)两个74HC595控制四个数码管显示_第1张图片

74HC595引脚图

【STM32学习】(14)两个74HC595控制四个数码管显示_第2张图片

74HC595管脚功能

【STM32学习】(14)两个74HC595控制四个数码管显示_第3张图片

我选用的单片机型号为:STM32L052K8系列的低功耗芯片,其实与F4系列和F1系列都是一样使用。

下面来看一下接线:

【STM32学习】(14)两个74HC595控制四个数码管显示_第4张图片

可以从上图中清晰的看到与单片机的连线。

两个595通过级联的形式进行连接。

两个数码管为共阳极

那如何进行代码实现呢?

【STM32学习】(14)两个74HC595控制四个数码管显示_第5张图片

这样我们就可以写出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
  }

}

效果如图:

【STM32学习】(14)两个74HC595控制四个数码管显示_第6张图片

 

 

有一个小的提示:当有595级联的时候,如有两个快595级联。

HC595_Write_Data(0x01);	//	片选第一个数码管    先发的数据会级联到第二块595芯片中
HC595_Write_Data(0x99);    //    后发的这个数据才是第一块595芯片的数据
Disp_out();                 //    最后将数据传输到各自的端口,进行功能操作

   到这里就结束了,大家可以互相学习,提出建议。      

你可能感兴趣的:(单片机c语言)