STM32CubeMx+MDK5------点亮数码管并制作为时钟

目标:点亮数码管并制作为24小时制时钟,且第二个点会每秒闪烁

由原理图可以看出要点亮的数码管是共阳极的

所以当给D1~D4,A~G低点评时,才能点亮数码管 

首先是cube里的设置,(除引脚设置外,其余与点亮LED相同)

这里是调整后期要用的定时器中断,定时时间为每1秒执行一次中断 

这里设置中断优先级 

选择需要的引脚并命名 

 

当我们写下如下代码时则点亮了第一个位置的数码管 

      HAL_GPIO_WritePin(C_GPIO_Port,C_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(B_GPIO_Port,B_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(A_GPIO_Port,A_Pin,GPIO_PIN_RESET);
      HAL_GPIO_WritePin(D1_GPIO_Port,D1_Pin,GPIO_PIN_RESET);

 

当我们把D1~D4都置为低电平的时候,四个位置的灯都能亮,但会出现同一个数字 

            HAL_GPIO_WritePin(D1_GPIO_Port,D1_Pin,GPIO_PIN_RESET);
			HAL_GPIO_WritePin(D2_GPIO_Port,D2_Pin,GPIO_PIN_RESET);	
			HAL_GPIO_WritePin(D3_GPIO_Port,D3_Pin,GPIO_PIN_RESET);	
			HAL_GPIO_WritePin(D4_GPIO_Port,D4_Pin,GPIO_PIN_RESET);
            HAL_GPIO_WritePin(C_GPIO_Port,C_Pin,GPIO_PIN_RESET);
	        HAL_GPIO_WritePin(B_GPIO_Port,B_Pin,GPIO_PIN_RESET);
	        HAL_GPIO_WritePin(A_GPIO_Port,A_Pin,GPIO_PIN_RESET);

 那么为了实现显示不同的数字

跟据视觉暂留效应,我们可以使不同位置 点亮的位置不同并快速反复,就实现了如下效果

 

但如果要一直显示不同数字,且数字还需要变化,一直反复写类似的代码显然是困难的,所以可以写一个函数,传入想点亮的位置以及数字就可以点亮

void num(int Location,int Number)
{
	switch(Location)
	{	
		case 1:
			HAL_GPIO_WritePin(D1_GPIO_Port,D1_Pin,GPIO_PIN_RESET);
			HAL_GPIO_WritePin(D2_GPIO_Port,D2_Pin,GPIO_PIN_SET);	
			HAL_GPIO_WritePin(D3_GPIO_Port,D3_Pin,GPIO_PIN_SET);	
			HAL_GPIO_WritePin(D4_GPIO_Port,D4_Pin,GPIO_PIN_SET);			
		break;
		
		case 2:
			HAL_GPIO_WritePin(D1_GPIO_Port,D1_Pin,GPIO_PIN_SET);
			HAL_GPIO_WritePin(D2_GPIO_Port,D2_Pin,GPIO_PIN_RESET);	
			HAL_GPIO_WritePin(D3_GPIO_Port,D3_Pin,GPIO_PIN_SET);	
			HAL_GPIO_WritePin(D4_GPIO_Port,D4_Pin,GPIO_PIN_SET);		
		break;
		
		case 3:
			HAL_GPIO_WritePin(D1_GPIO_Port,D1_Pin,GPIO_PIN_SET);
			HAL_GPIO_WritePin(D2_GPIO_Port,D2_Pin,GPIO_PIN_SET);	
			HAL_GPIO_WritePin(D3_GPIO_Port,D3_Pin,GPIO_PIN_RESET);	
			HAL_GPIO_WritePin(D4_GPIO_Port,D4_Pin,GPIO_PIN_SET);	
		break;
		
		case 4:
			HAL_GPIO_WritePin(D1_GPIO_Port,D1_Pin,GPIO_PIN_SET);
			HAL_GPIO_WritePin(D2_GPIO_Port,D2_Pin,GPIO_PIN_SET);	
			HAL_GPIO_WritePin(D3_GPIO_Port,D3_Pin,GPIO_PIN_SET);	
			HAL_GPIO_WritePin(D4_GPIO_Port,D4_Pin,GPIO_PIN_RESET);			
		break;
	}
	
	switch(Number)
	{
		case 1:
	  HAL_GPIO_WritePin(B_GPIO_Port,B_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(C_GPIO_Port,C_Pin,GPIO_PIN_RESET);

	  HAL_GPIO_WritePin(A_GPIO_Port,A_Pin,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(D_GPIO_Port,D_Pin,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(F_GPIO_Port,F_Pin,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(E_GPIO_Port,E_Pin,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(G_GPIO_Port,G_Pin,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(DP_GPIO_Port,DP_Pin,GPIO_PIN_SET);			
		break;
		
		case 2:
	  HAL_GPIO_WritePin(A_GPIO_Port,A_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(B_GPIO_Port,B_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(D_GPIO_Port,D_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(E_GPIO_Port,E_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(G_GPIO_Port,G_Pin,GPIO_PIN_RESET);

	  HAL_GPIO_WritePin(C_GPIO_Port,C_Pin,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(F_GPIO_Port,F_Pin,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(DP_GPIO_Port,DP_Pin,GPIO_PIN_SET);		
		break;
		
		case 3:
	  HAL_GPIO_WritePin(A_GPIO_Port,A_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(B_GPIO_Port,B_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(C_GPIO_Port,C_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(D_GPIO_Port,D_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(G_GPIO_Port,G_Pin,GPIO_PIN_RESET);

	  HAL_GPIO_WritePin(F_GPIO_Port,F_Pin,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(E_GPIO_Port,E_Pin,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(DP_GPIO_Port,DP_Pin,GPIO_PIN_SET);		
		break;
		
		case 4:
	  HAL_GPIO_WritePin(C_GPIO_Port,C_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(B_GPIO_Port,B_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(F_GPIO_Port,F_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(G_GPIO_Port,G_Pin,GPIO_PIN_RESET);

	  HAL_GPIO_WritePin(A_GPIO_Port,A_Pin,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(D_GPIO_Port,D_Pin,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(E_GPIO_Port,E_Pin,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(DP_GPIO_Port,DP_Pin,GPIO_PIN_SET);		
		break;
		
		case 5:
	  HAL_GPIO_WritePin(A_GPIO_Port,A_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(C_GPIO_Port,C_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(D_GPIO_Port,D_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(F_GPIO_Port,F_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(G_GPIO_Port,G_Pin,GPIO_PIN_RESET);

	  HAL_GPIO_WritePin(B_GPIO_Port,B_Pin,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(E_GPIO_Port,E_Pin,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(DP_GPIO_Port,DP_Pin,GPIO_PIN_SET);		
		break;
		
		case 6:
	  HAL_GPIO_WritePin(A_GPIO_Port,A_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(C_GPIO_Port,C_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(D_GPIO_Port,D_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(F_GPIO_Port,F_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(E_GPIO_Port,E_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(G_GPIO_Port,G_Pin,GPIO_PIN_RESET);

	  HAL_GPIO_WritePin(B_GPIO_Port,B_Pin,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(DP_GPIO_Port,DP_Pin,GPIO_PIN_SET);		
		break;
		
		case 7:
	  HAL_GPIO_WritePin(C_GPIO_Port,C_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(B_GPIO_Port,B_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(A_GPIO_Port,A_Pin,GPIO_PIN_RESET);

	  HAL_GPIO_WritePin(D_GPIO_Port,D_Pin,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(F_GPIO_Port,F_Pin,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(E_GPIO_Port,E_Pin,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(G_GPIO_Port,G_Pin,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(DP_GPIO_Port,DP_Pin,GPIO_PIN_SET);		
		break;
		
		case 8:
	  HAL_GPIO_WritePin(B_GPIO_Port,B_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(A_GPIO_Port,A_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(C_GPIO_Port,C_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(D_GPIO_Port,D_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(F_GPIO_Port,F_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(E_GPIO_Port,E_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(G_GPIO_Port,G_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(DP_GPIO_Port,DP_Pin,GPIO_PIN_SET);		
		break;
		
		case 9:
	  HAL_GPIO_WritePin(B_GPIO_Port,B_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(A_GPIO_Port,A_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(C_GPIO_Port,C_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(D_GPIO_Port,D_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(F_GPIO_Port,F_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(G_GPIO_Port,G_Pin,GPIO_PIN_RESET);
		
	  HAL_GPIO_WritePin(DP_GPIO_Port,DP_Pin,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(E_GPIO_Port,E_Pin,GPIO_PIN_SET);
	  
		break;
		
		case 0:
	  HAL_GPIO_WritePin(B_GPIO_Port,B_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(A_GPIO_Port,A_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(C_GPIO_Port,C_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(D_GPIO_Port,D_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(F_GPIO_Port,F_Pin,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(E_GPIO_Port,E_Pin,GPIO_PIN_RESET);

	  HAL_GPIO_WritePin(DP_GPIO_Port,DP_Pin,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(G_GPIO_Port,G_Pin,GPIO_PIN_SET);
		break;
	}
}

 

写下下面格式的代码就可以实现 展示不同数字了

      num(1,2);
	  HAL_Delay(1);
	  
	  num(2,0);
	  HAL_Delay(1);
	  
	  num(3,2);
	  HAL_Delay(1);
	  
	  num(4,4);
	  HAL_Delay(1);

接下来要实现时钟功能

首先要先理解定时器中断(即有一个时钟一直在计时,每一秒钟会打断原有函数进程,执行中断函数) 下图是开始计时

以下是中断回调函数,HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

根据24小时制写进位 

int num1=0,num2=0,num3=0,num4=0,n=1,count1=0,count;
//count1是秒计数,n用作点的闪烁
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{	
	count1++;
	count=count1%60;
	if(count==0)
	{
		if(num4==9)
		  {
				num4=0;
				if(num3==5)
				{
					num3=0;									
					if(num2==9 && num1!=2)
					{
						num2=0;
						num1++;
					}
					else if(num1==2 && num2==3)
					{
						num1=0;
						num2=0;
					}
					else num2++;											
				}
				else num3++;				
		  }
		else num4++;			 	  
	}
	 n*=-1;
}

最后修改主函数,就实现时钟功能并且第二个点每秒闪烁一次

      num(1,num1);
	  HAL_Delay(1);
	  
	  num(2,num2);
	  if(n==1)
	  {HAL_GPIO_WritePin(DP_GPIO_Port,DP_Pin,GPIO_PIN_RESET);}
	  HAL_Delay(1);
	  
	  num(3,num3);
	  HAL_Delay(1);
	  
	  num(4,num4);
	  HAL_Delay(1);

可以在回调函数中调整num1~num4为现实时刻的时间,就可以当作时钟用了 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值