当前位置:   article > 正文

stm32使用四位数码管制作简易时钟(库函数版)_四位数码管时钟

四位数码管时钟

1.数码管情况介绍

数码管接线引脚:

 

 段码与上图情况,位选为:1-PB0,2-PB12,3-PB13,4-PB14。

本项目使用5461BS-1共四位数码管,为共阳型。

 2.程序部分

Timer定时器:

  1. #include "stm32f10x.h" // Device header
  2. void Timer_Init(void){
  3. //1.开启时钟RCC
  4. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//TIM2
  5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  6. //2.选择时基单元时钟
  7. TIM_InternalClockConfig(TIM2);//内部时钟
  8. //3.配置时基单元
  9. TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
  10. TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;//选择时钟分频
  11. TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//计数器模式(向上/向下/3种中央对齐模式)
  12. TIM_TimeBaseInitStruct.TIM_Period=10000-1;//ARR自动重装器的值(0-65535)
  13. TIM_TimeBaseInitStruct.TIM_Prescaler=7200-1;//PSC预分频器的值(0-65535);定时频率=72M/(PSC+1)/(ARR+1);72000
  14. TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;//重复计数器的值(高级计数器才有)
  15. TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
  16. TIM_ClearFlag(TIM2,TIM_FLAG_Update);//将更新中断标志位清除,避免初始化完就进中断
  17. //4.使能更新中断
  18. TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
  19. //5.配置NVIC
  20. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  21. NVIC_InitTypeDef NVIC_InitStruct;
  22. NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn;//选择通道
  23. NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;//指定中断通道是使能/失能
  24. NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;//设置先占(抢占)优先级
  25. NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;//设置从占(响应)优先级
  26. NVIC_Init(&NVIC_InitStruct);
  27. //6.启动定时器
  28. TIM_Cmd(TIM2,ENABLE);
  29. }

SMG数码管

  1. #include "stm32f10x.h" // Device header
  2. #include "Delay.h"
  3. //5461BS-1为共阳型
  4. u16 seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳
  5. //u16 seg[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴
  6. extern u16 tim4Cnt;
  7. void SMG_Init(void){
  8. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //开启GPIOA的外设时钟
  9. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  10. //配置端口模式
  11. GPIO_InitTypeDef GPIO_InitStructureA;//定义结构体变量
  12. GPIO_InitStructureA.GPIO_Pin=GPIO_Pin_All; //选择你要设置的IO口
  13. GPIO_InitStructureA.GPIO_Mode=GPIO_Mode_Out_PP; //设置推挽输出模式
  14. GPIO_InitStructureA.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率为50MHZ
  15. GPIO_Init(GPIOA,&GPIO_InitStructureA); /* 初始化GPIO */
  16. //配置端口模式
  17. GPIO_InitTypeDef GPIO_InitStructureB;//定义结构体变量
  18. GPIO_InitStructureB.GPIO_Pin=GPIO_Pin_All; //选择你要设置的IO口
  19. GPIO_InitStructureB.GPIO_Mode=GPIO_Mode_Out_PP; //设置推挽输出模式
  20. GPIO_InitStructureB.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率为50MHZ
  21. GPIO_Init(GPIOB,&GPIO_InitStructureB); /* 初始化GPIO */
  22. GPIO_SetBits(GPIOA,GPIO_Pin_All);
  23. }
  24. void SMG_clean(){
  25. GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_RESET);
  26. GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_RESET);
  27. GPIO_WriteBit(GPIOB,GPIO_Pin_13,Bit_RESET);
  28. GPIO_WriteBit(GPIOB,GPIO_Pin_14,Bit_RESET);
  29. Delay_ms(2);
  30. }
  31. //选择第w位,显示数字num
  32. void SMG_Light(uint16_t w,uint16_t num){
  33. SMG_clean();
  34. //位选
  35. switch(w){
  36. case 0:
  37. GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_SET);
  38. GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_RESET);
  39. GPIO_WriteBit(GPIOB,GPIO_Pin_13,Bit_RESET);
  40. GPIO_WriteBit(GPIOB,GPIO_Pin_14,Bit_RESET);
  41. break;
  42. case 1:
  43. GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_SET);
  44. GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_RESET);
  45. GPIO_WriteBit(GPIOB,GPIO_Pin_13,Bit_RESET);
  46. GPIO_WriteBit(GPIOB,GPIO_Pin_14,Bit_RESET);
  47. break;
  48. case 2:
  49. GPIO_WriteBit(GPIOB,GPIO_Pin_13,Bit_SET);
  50. GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_RESET);
  51. GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_RESET);
  52. GPIO_WriteBit(GPIOB,GPIO_Pin_14,Bit_RESET);
  53. break;
  54. case 3:
  55. GPIO_WriteBit(GPIOB,GPIO_Pin_14,Bit_SET);
  56. GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_RESET);
  57. GPIO_WriteBit(GPIOB,GPIO_Pin_13,Bit_RESET);
  58. GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_RESET);
  59. break;
  60. }
  61. //段码
  62. GPIO_Write(GPIOA,seg[num]);
  63. Delay_ms(2);
  64. }

main主函数

  1. #include "stm32f10x.h" // Device header
  2. #include "Delay.h"
  3. #include "Key.h"
  4. #include "SMG.h"
  5. #include "Timer.h"
  6. uint16_t i,Tim2Num,miao,shi,fen;
  7. int main(void){
  8. Key_Init();
  9. SMG_Init();
  10. Timer_Init();
  11. while(1){
  12. //时钟
  13. miao=Tim2Num%60;
  14. SMG_Light(0,miao%10);//ge
  15. SMG_Light(1,miao/10);//shi
  16. fen=Tim2Num%3600/60;
  17. SMG_Light(2,fen%10);//ge
  18. SMG_Light(3,fen/10);//shi
  19. shi=Tim2Num%(24*3600)/3600;
  20. }
  21. }
  22. //每秒计时
  23. void TIM2_IRQHandler(void){
  24. if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET){//更新中断
  25. Tim2Num++;
  26. TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除标志位
  27. }
  28. }

资料参考:

(75条消息) STM32F103C8T6 I/O口驱动4位共阳数码管_io口控制数码管_seaup2011的博客-CSDN博客

四位一体数码管LG5641BH共阳极引脚图,怎么读的?_百度知道 (baidu.com)

单片机数码管显示,看完这篇就够了 (zhihu.com)

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

闽ICP备14008679号