赞
踩
目标:点亮数码管并制作为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为现实时刻的时间,就可以当作时钟用了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。