目标:点亮数码管并制作为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为现实时刻的时间,就可以当作时钟用了