使用STM32 HAL库实现三位数码管显示,包括74HC595、按键和蜂鸣器

实现目标

1、加强数码管学习,实现数码显示变量数据(三位数的显示);

2、3位数码+2个按键+蜂鸣器实现模拟电磁炉功率调节及显示;


一、前期基础说明

关于74HC595的STM32F103的驱动以及数码的显示等请查阅我写的上一篇博客:https://blog.csdn.net/luojuan198780/article/details/136653377

二、原理图设计

三、STM32CubeMX 配置

1.管脚配置

四、程序设计

1、数码管码表及全局变量

//共阳数码管码表
char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

int num = 210;//电磁炉开机功率初始值

2、函数声明(74HC595驱动函数及自定义延时函数)

void HC595_Send_Byte(unsigned  char byte);	
void for_delay_us(uint32_t nus);

3、按键处理、数码显示程序

  while (1)
  {
		if (HAL_GPIO_ReadPin(GPIOB, K1_Pin)==0)		
		{
				while(!HAL_GPIO_ReadPin(GPIOB, K1_Pin));
			
			  HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_SET);
			  HAL_Delay(150);
			  HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_RESET);
			  HAL_Delay(150);	
		     if(num >= 210)
				 {
				      num = 210;
							HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_SET);
							HAL_Delay(100);
							HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_RESET);
							HAL_Delay(100);						 					 
				 }
				 else 
					 num  = num + 20;//  num  += 20
		
		}
		if (HAL_GPIO_ReadPin(GPIOB, K2_Pin)==0)		
		{
				while(!HAL_GPIO_ReadPin(GPIOB, K2_Pin));
			  HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_SET);
			  HAL_Delay(150);
			  HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_RESET);
			  HAL_Delay(150);							
		     if(num <= 10)
				 {					 
				      num = 10;
							HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_SET);
							HAL_Delay(100);
							HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_RESET);
							HAL_Delay(100);						  
				 }
				 else 
					 num  -= 20;//   num  = num - 20;
		}		
		
		HAL_GPIO_WritePin(GPIOA, SEG1_Pin, GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOA, SEG2_Pin, GPIO_PIN_RESET);		
		HAL_GPIO_WritePin(GPIOB, SEG3_Pin, GPIO_PIN_RESET);		
		HC595_Send_Byte(table[num/100]);//百位			
    for_delay_us(5);	// 适当延时	
		HC595_Send_Byte(0xff);	//	消影
		
		HAL_GPIO_WritePin(GPIOA, SEG2_Pin, GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOA, SEG1_Pin, GPIO_PIN_RESET);		
		HAL_GPIO_WritePin(GPIOB, SEG3_Pin, GPIO_PIN_RESET);		
		HC595_Send_Byte(table[num/10%10]);//十位			
    for_delay_us(5);	// 适当延时	
		HC595_Send_Byte(0xff);//	消影	
		
		HAL_GPIO_WritePin(GPIOA, SEG2_Pin, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOA, SEG1_Pin, GPIO_PIN_RESET);		
		HAL_GPIO_WritePin(GPIOB, SEG3_Pin, GPIO_PIN_SET);		
		HC595_Send_Byte(table[num%10]);//个位				
    for_delay_us(5);	// 适当延时	
		HC595_Send_Byte(0xff);//	消影
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

4、74HC595驱动函数及自定义延时函数

/* USER CODE BEGIN 4 */

void HC595_Send_Byte(unsigned  char byte)
{
	unsigned  char i;
	for (i = 0; i < 8; i ++)  //一个字节8位,传输8次,一次一位,循环8次,刚好移完8位
	{
	  /****  步骤1:将数据传到DS引脚    ****/
		if (byte & 0x80)        //先传输高位,通过与运算判断第八是否为1
		  HAL_GPIO_WritePin(GPIOA, DATA_Pin, GPIO_PIN_SET); //如果第八位是1,则与 595 DS连接的引脚输出高电平
		else                    //否则输出低电平
		  HAL_GPIO_WritePin(GPIOA, DATA_Pin, GPIO_PIN_RESET);		
			
		/*** 步骤2:SHCP每产生一个上升沿,当前的bit就被送入移位寄存器 ***/
      HAL_GPIO_WritePin(GPIOA, SHCP_Pin, GPIO_PIN_RESET);	 // SHCP拉低	          
      for_delay_us(5);	// 适当延时	
		
      HAL_GPIO_WritePin(GPIOA, SHCP_Pin, GPIO_PIN_SET);		// SHCP拉高, SHCP产生上升沿	
      for_delay_us(5);				
		  byte <<= 1;		// 左移一位,将低位往高位移,通过	if (byte & 0x80)判断低位是否为1
	}
	
	/**  步骤3:STCP产生一个上升沿,移位寄存器的数据移入存储寄存器  **/ 
   HAL_GPIO_WritePin(STCP_GPIO_Port, STCP_Pin, GPIO_PIN_RESET);	// 将STCP拉低
   for_delay_us(5);		
   HAL_GPIO_WritePin(STCP_GPIO_Port, STCP_Pin, GPIO_PIN_SET);// 再将STCP拉高,STCP即可产生一个上升沿	
   for_delay_us(5);	
}

/*
for循环实现延时us
*/
void for_delay_us(uint32_t nus)
{
	 uint32_t Delay = nus * 168/4;
	 do
	 {
	 }
	 while (Delay --);
}

/* USER CODE END 4 */

五、实验现象

实验效果参考下面网址视频:

shttps://live.csdn.net/v/370142

六、仿真实现


总结

作者:面包板扎

物联沃分享整理
物联沃-IOTWORD物联网 » 使用STM32 HAL库实现三位数码管显示,包括74HC595、按键和蜂鸣器

发表评论