当前位置:   article > 正文

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

cubemx数码管

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

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

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

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

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

这里设置中断优先级 

选择需要的引脚并命名 

 

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

  1. HAL_GPIO_WritePin(C_GPIO_Port,C_Pin,GPIO_PIN_RESET);
  2. HAL_GPIO_WritePin(B_GPIO_Port,B_Pin,GPIO_PIN_RESET);
  3. HAL_GPIO_WritePin(A_GPIO_Port,A_Pin,GPIO_PIN_RESET);
  4. HAL_GPIO_WritePin(D1_GPIO_Port,D1_Pin,GPIO_PIN_RESET);

 

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

  1. HAL_GPIO_WritePin(D1_GPIO_Port,D1_Pin,GPIO_PIN_RESET);
  2. HAL_GPIO_WritePin(D2_GPIO_Port,D2_Pin,GPIO_PIN_RESET);
  3. HAL_GPIO_WritePin(D3_GPIO_Port,D3_Pin,GPIO_PIN_RESET);
  4. HAL_GPIO_WritePin(D4_GPIO_Port,D4_Pin,GPIO_PIN_RESET);
  5. HAL_GPIO_WritePin(C_GPIO_Port,C_Pin,GPIO_PIN_RESET);
  6. HAL_GPIO_WritePin(B_GPIO_Port,B_Pin,GPIO_PIN_RESET);
  7. HAL_GPIO_WritePin(A_GPIO_Port,A_Pin,GPIO_PIN_RESET);

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

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

 

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

  1. void num(int Location,int Number)
  2. {
  3. switch(Location)
  4. {
  5. case 1:
  6. HAL_GPIO_WritePin(D1_GPIO_Port,D1_Pin,GPIO_PIN_RESET);
  7. HAL_GPIO_WritePin(D2_GPIO_Port,D2_Pin,GPIO_PIN_SET);
  8. HAL_GPIO_WritePin(D3_GPIO_Port,D3_Pin,GPIO_PIN_SET);
  9. HAL_GPIO_WritePin(D4_GPIO_Port,D4_Pin,GPIO_PIN_SET);
  10. break;
  11. case 2:
  12. HAL_GPIO_WritePin(D1_GPIO_Port,D1_Pin,GPIO_PIN_SET);
  13. HAL_GPIO_WritePin(D2_GPIO_Port,D2_Pin,GPIO_PIN_RESET);
  14. HAL_GPIO_WritePin(D3_GPIO_Port,D3_Pin,GPIO_PIN_SET);
  15. HAL_GPIO_WritePin(D4_GPIO_Port,D4_Pin,GPIO_PIN_SET);
  16. break;
  17. case 3:
  18. HAL_GPIO_WritePin(D1_GPIO_Port,D1_Pin,GPIO_PIN_SET);
  19. HAL_GPIO_WritePin(D2_GPIO_Port,D2_Pin,GPIO_PIN_SET);
  20. HAL_GPIO_WritePin(D3_GPIO_Port,D3_Pin,GPIO_PIN_RESET);
  21. HAL_GPIO_WritePin(D4_GPIO_Port,D4_Pin,GPIO_PIN_SET);
  22. break;
  23. case 4:
  24. HAL_GPIO_WritePin(D1_GPIO_Port,D1_Pin,GPIO_PIN_SET);
  25. HAL_GPIO_WritePin(D2_GPIO_Port,D2_Pin,GPIO_PIN_SET);
  26. HAL_GPIO_WritePin(D3_GPIO_Port,D3_Pin,GPIO_PIN_SET);
  27. HAL_GPIO_WritePin(D4_GPIO_Port,D4_Pin,GPIO_PIN_RESET);
  28. break;
  29. }
  30. switch(Number)
  31. {
  32. case 1:
  33. HAL_GPIO_WritePin(B_GPIO_Port,B_Pin,GPIO_PIN_RESET);
  34. HAL_GPIO_WritePin(C_GPIO_Port,C_Pin,GPIO_PIN_RESET);
  35. HAL_GPIO_WritePin(A_GPIO_Port,A_Pin,GPIO_PIN_SET);
  36. HAL_GPIO_WritePin(D_GPIO_Port,D_Pin,GPIO_PIN_SET);
  37. HAL_GPIO_WritePin(F_GPIO_Port,F_Pin,GPIO_PIN_SET);
  38. HAL_GPIO_WritePin(E_GPIO_Port,E_Pin,GPIO_PIN_SET);
  39. HAL_GPIO_WritePin(G_GPIO_Port,G_Pin,GPIO_PIN_SET);
  40. HAL_GPIO_WritePin(DP_GPIO_Port,DP_Pin,GPIO_PIN_SET);
  41. break;
  42. case 2:
  43. HAL_GPIO_WritePin(A_GPIO_Port,A_Pin,GPIO_PIN_RESET);
  44. HAL_GPIO_WritePin(B_GPIO_Port,B_Pin,GPIO_PIN_RESET);
  45. HAL_GPIO_WritePin(D_GPIO_Port,D_Pin,GPIO_PIN_RESET);
  46. HAL_GPIO_WritePin(E_GPIO_Port,E_Pin,GPIO_PIN_RESET);
  47. HAL_GPIO_WritePin(G_GPIO_Port,G_Pin,GPIO_PIN_RESET);
  48. HAL_GPIO_WritePin(C_GPIO_Port,C_Pin,GPIO_PIN_SET);
  49. HAL_GPIO_WritePin(F_GPIO_Port,F_Pin,GPIO_PIN_SET);
  50. HAL_GPIO_WritePin(DP_GPIO_Port,DP_Pin,GPIO_PIN_SET);
  51. break;
  52. case 3:
  53. HAL_GPIO_WritePin(A_GPIO_Port,A_Pin,GPIO_PIN_RESET);
  54. HAL_GPIO_WritePin(B_GPIO_Port,B_Pin,GPIO_PIN_RESET);
  55. HAL_GPIO_WritePin(C_GPIO_Port,C_Pin,GPIO_PIN_RESET);
  56. HAL_GPIO_WritePin(D_GPIO_Port,D_Pin,GPIO_PIN_RESET);
  57. HAL_GPIO_WritePin(G_GPIO_Port,G_Pin,GPIO_PIN_RESET);
  58. HAL_GPIO_WritePin(F_GPIO_Port,F_Pin,GPIO_PIN_SET);
  59. HAL_GPIO_WritePin(E_GPIO_Port,E_Pin,GPIO_PIN_SET);
  60. HAL_GPIO_WritePin(DP_GPIO_Port,DP_Pin,GPIO_PIN_SET);
  61. break;
  62. case 4:
  63. HAL_GPIO_WritePin(C_GPIO_Port,C_Pin,GPIO_PIN_RESET);
  64. HAL_GPIO_WritePin(B_GPIO_Port,B_Pin,GPIO_PIN_RESET);
  65. HAL_GPIO_WritePin(F_GPIO_Port,F_Pin,GPIO_PIN_RESET);
  66. HAL_GPIO_WritePin(G_GPIO_Port,G_Pin,GPIO_PIN_RESET);
  67. HAL_GPIO_WritePin(A_GPIO_Port,A_Pin,GPIO_PIN_SET);
  68. HAL_GPIO_WritePin(D_GPIO_Port,D_Pin,GPIO_PIN_SET);
  69. HAL_GPIO_WritePin(E_GPIO_Port,E_Pin,GPIO_PIN_SET);
  70. HAL_GPIO_WritePin(DP_GPIO_Port,DP_Pin,GPIO_PIN_SET);
  71. break;
  72. case 5:
  73. HAL_GPIO_WritePin(A_GPIO_Port,A_Pin,GPIO_PIN_RESET);
  74. HAL_GPIO_WritePin(C_GPIO_Port,C_Pin,GPIO_PIN_RESET);
  75. HAL_GPIO_WritePin(D_GPIO_Port,D_Pin,GPIO_PIN_RESET);
  76. HAL_GPIO_WritePin(F_GPIO_Port,F_Pin,GPIO_PIN_RESET);
  77. HAL_GPIO_WritePin(G_GPIO_Port,G_Pin,GPIO_PIN_RESET);
  78. HAL_GPIO_WritePin(B_GPIO_Port,B_Pin,GPIO_PIN_SET);
  79. HAL_GPIO_WritePin(E_GPIO_Port,E_Pin,GPIO_PIN_SET);
  80. HAL_GPIO_WritePin(DP_GPIO_Port,DP_Pin,GPIO_PIN_SET);
  81. break;
  82. case 6:
  83. HAL_GPIO_WritePin(A_GPIO_Port,A_Pin,GPIO_PIN_RESET);
  84. HAL_GPIO_WritePin(C_GPIO_Port,C_Pin,GPIO_PIN_RESET);
  85. HAL_GPIO_WritePin(D_GPIO_Port,D_Pin,GPIO_PIN_RESET);
  86. HAL_GPIO_WritePin(F_GPIO_Port,F_Pin,GPIO_PIN_RESET);
  87. HAL_GPIO_WritePin(E_GPIO_Port,E_Pin,GPIO_PIN_RESET);
  88. HAL_GPIO_WritePin(G_GPIO_Port,G_Pin,GPIO_PIN_RESET);
  89. HAL_GPIO_WritePin(B_GPIO_Port,B_Pin,GPIO_PIN_SET);
  90. HAL_GPIO_WritePin(DP_GPIO_Port,DP_Pin,GPIO_PIN_SET);
  91. break;
  92. case 7:
  93. HAL_GPIO_WritePin(C_GPIO_Port,C_Pin,GPIO_PIN_RESET);
  94. HAL_GPIO_WritePin(B_GPIO_Port,B_Pin,GPIO_PIN_RESET);
  95. HAL_GPIO_WritePin(A_GPIO_Port,A_Pin,GPIO_PIN_RESET);
  96. HAL_GPIO_WritePin(D_GPIO_Port,D_Pin,GPIO_PIN_SET);
  97. HAL_GPIO_WritePin(F_GPIO_Port,F_Pin,GPIO_PIN_SET);
  98. HAL_GPIO_WritePin(E_GPIO_Port,E_Pin,GPIO_PIN_SET);
  99. HAL_GPIO_WritePin(G_GPIO_Port,G_Pin,GPIO_PIN_SET);
  100. HAL_GPIO_WritePin(DP_GPIO_Port,DP_Pin,GPIO_PIN_SET);
  101. break;
  102. case 8:
  103. HAL_GPIO_WritePin(B_GPIO_Port,B_Pin,GPIO_PIN_RESET);
  104. HAL_GPIO_WritePin(A_GPIO_Port,A_Pin,GPIO_PIN_RESET);
  105. HAL_GPIO_WritePin(C_GPIO_Port,C_Pin,GPIO_PIN_RESET);
  106. HAL_GPIO_WritePin(D_GPIO_Port,D_Pin,GPIO_PIN_RESET);
  107. HAL_GPIO_WritePin(F_GPIO_Port,F_Pin,GPIO_PIN_RESET);
  108. HAL_GPIO_WritePin(E_GPIO_Port,E_Pin,GPIO_PIN_RESET);
  109. HAL_GPIO_WritePin(G_GPIO_Port,G_Pin,GPIO_PIN_RESET);
  110. HAL_GPIO_WritePin(DP_GPIO_Port,DP_Pin,GPIO_PIN_SET);
  111. break;
  112. case 9:
  113. HAL_GPIO_WritePin(B_GPIO_Port,B_Pin,GPIO_PIN_RESET);
  114. HAL_GPIO_WritePin(A_GPIO_Port,A_Pin,GPIO_PIN_RESET);
  115. HAL_GPIO_WritePin(C_GPIO_Port,C_Pin,GPIO_PIN_RESET);
  116. HAL_GPIO_WritePin(D_GPIO_Port,D_Pin,GPIO_PIN_RESET);
  117. HAL_GPIO_WritePin(F_GPIO_Port,F_Pin,GPIO_PIN_RESET);
  118. HAL_GPIO_WritePin(G_GPIO_Port,G_Pin,GPIO_PIN_RESET);
  119. HAL_GPIO_WritePin(DP_GPIO_Port,DP_Pin,GPIO_PIN_SET);
  120. HAL_GPIO_WritePin(E_GPIO_Port,E_Pin,GPIO_PIN_SET);
  121. break;
  122. case 0:
  123. HAL_GPIO_WritePin(B_GPIO_Port,B_Pin,GPIO_PIN_RESET);
  124. HAL_GPIO_WritePin(A_GPIO_Port,A_Pin,GPIO_PIN_RESET);
  125. HAL_GPIO_WritePin(C_GPIO_Port,C_Pin,GPIO_PIN_RESET);
  126. HAL_GPIO_WritePin(D_GPIO_Port,D_Pin,GPIO_PIN_RESET);
  127. HAL_GPIO_WritePin(F_GPIO_Port,F_Pin,GPIO_PIN_RESET);
  128. HAL_GPIO_WritePin(E_GPIO_Port,E_Pin,GPIO_PIN_RESET);
  129. HAL_GPIO_WritePin(DP_GPIO_Port,DP_Pin,GPIO_PIN_SET);
  130. HAL_GPIO_WritePin(G_GPIO_Port,G_Pin,GPIO_PIN_SET);
  131. break;
  132. }
  133. }

 

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

  1. num(1,2);
  2. HAL_Delay(1);
  3. num(2,0);
  4. HAL_Delay(1);
  5. num(3,2);
  6. HAL_Delay(1);
  7. num(4,4);
  8. HAL_Delay(1);

接下来要实现时钟功能

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

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

根据24小时制写进位 

  1. int num1=0,num2=0,num3=0,num4=0,n=1,count1=0,count;
  2. //count1是秒计数,n用作点的闪烁
  3. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  4. {
  5. count1++;
  6. count=count1%60;
  7. if(count==0)
  8. {
  9. if(num4==9)
  10. {
  11. num4=0;
  12. if(num3==5)
  13. {
  14. num3=0;
  15. if(num2==9 && num1!=2)
  16. {
  17. num2=0;
  18. num1++;
  19. }
  20. else if(num1==2 && num2==3)
  21. {
  22. num1=0;
  23. num2=0;
  24. }
  25. else num2++;
  26. }
  27. else num3++;
  28. }
  29. else num4++;
  30. }
  31. n*=-1;
  32. }

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

  1. num(1,num1);
  2. HAL_Delay(1);
  3. num(2,num2);
  4. if(n==1)
  5. {HAL_GPIO_WritePin(DP_GPIO_Port,DP_Pin,GPIO_PIN_RESET);}
  6. HAL_Delay(1);
  7. num(3,num3);
  8. HAL_Delay(1);
  9. num(4,num4);
  10. HAL_Delay(1);

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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/708749
推荐阅读
相关标签
  

闽ICP备14008679号