OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4704|回复: 5

两位数码管显示,个位数码管不亮或者亮度太暗

[复制链接]

0

主题

2

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2022-6-9
在线时间
0 小时
发表于 2022-6-9 09:44:19 | 显示全部楼层 |阅读模式
4金钱
本帖最后由 climberth 于 2022-6-9 09:46 编辑

1.我是用的正点原子NANO STM32F103RB板子实现代码的2.预期的功能是:
(1)通用定时器TIMx产生100ms的定时中断,驱动1个LED指示灯闪烁;(2)利用TIMx实现秒计时,最多计时59s,将当前的时间值显示在2位数码管上;按键1次,计时停止,再按键,计时从0开始。
3.存在的问题是:代码编译没有问题,但下载到板子上,两位数码管的个位不亮或者说亮度太暗。
备注:
我是在定时器中断里显示的数码管
timer.c文件代码
  1. #include "timer.h"
  2. #include "stdio.h"
  3. #include "led.h"
  4. #include "smg.h"
  5. #include  "key.h"

  6. //共阴数字数组
  7. //0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F, .,全灭
  8. u8 smg_num[] = {0xfc, 0x60, 0xda, 0xf2, 0x66, 0xb6, 0xbe, 0xe0, 0xfe, 0xf6, 0xee, 0x3e, 0x9c, 0x7a, 0x9e, 0x8e, 0x01, 0x00};
  9. u8 smg_wei = 0; //数码管位选
  10. u8 smg_duan = 0; //数码管段选
  11. int gewei=0;//数码管个位数值
  12. int shiwei=0;//数码管十位数值
  13. u8        t = 0;    //KEY0状态,0为未按,1为按下


  14. //通用定时器中断初始化
  15. //这里时钟选择为APB1的2倍,而APB1为36M
  16. //arr:自动重装值。
  17. //psc:时钟预分频数
  18. //这里使用的是定时器2!

  19. int times=0;//计算中断次数
  20. int sec=0;//计算时间
  21.        
  22. void TIM3_Init(u16 arr,u16 psc)
  23. {
  24.     RCC->APB1ENR|=1<<1;        //TIM2时钟使能   
  25.         TIM3->ARR=arr;          //设定计数器自动重装值
  26.         TIM3->PSC=psc;          //预分频器设置
  27.         TIM3->DIER|=1<<0;   //允许更新中断                               
  28.         TIM3->CR1|=0x01;    //使能定时器2
  29.           MY_NVIC_Init(0,3,TIM3_IRQn,2);//抢占0,子优先级3,组2               
  30.                                                          
  31. }

  32. //定时器2中断服务函数
  33. void TIM3_IRQHandler(void) //TIM2中断
  34. {
  35.         if(TIM3->SR&0X0001)//溢出中断
  36.         {
  37.                
  38.                 LED0=!LED0;
  39.                 t=KEY_Scan(1);
  40.                
  41.                 printf("\r\n按键:%d \n\r",t);
  42.                 if(t==0)
  43.                 {

  44.                         times=times+1;
  45.                         sec=(100*times)/1000;        //计算时间
  46.                         if(sec>=59)
  47.                         {                        //最大59
  48.                                 sec=59;
  49.                         }
  50.                 //                printf("\r\n时间:%d s\n\r",sec);                         //用于调试,最多59s
  51.                         gewei=sec%10;
  52.                         shiwei=sec/10;
  53.                         LED_Write_Data(smg_num[gewei],1);
  54.                         LED_Write_Data(smg_num[shiwei],0);
  55.                         LED_Refresh();//刷新显示
  56.                 }
  57.                 if(t==1)
  58.                 {
  59.                         LED_Write_Data(smg_num[gewei],1);
  60.                         LED_Write_Data(smg_num[shiwei],0);
  61.                         LED_Refresh();//刷新显示
  62.                 }
  63.                 if(t==2)
  64.                 {
  65.                         times=0;
  66.                         sec=0;
  67.                         gewei=0;
  68.                         shiwei=0;
  69.                         LED_Write_Data(smg_num[gewei],1);
  70.                         LED_Write_Data(smg_num[shiwei],0);
  71.                         LED_Refresh();//刷新显示
  72.                        
  73.                 }
  74.                
  75.         }                                  
  76.         TIM3->SR&=~(1<<0);//清除中断标志位
  77. }
复制代码


全部代码见附件,希望哪位兄弟姐妹可以帮忙解决,感激不尽!

test4.zip

1.14 MB, 下载次数: 5

最佳答案

查看完整内容[请看2#楼]

几个意见吧 1.乘除运算放到while(1)中去处理,中断直接调用结果. 2.我不知道你这个函数是什么意思?是不是个位暗,十位亮?不然感觉没天理啊. LED_Write_Data(smg_num[gewei],1); LED_Write_Data(smg_num[shiwei],0); 一般来说,2位的数码管,都是共用abcdefg端口的,然后一个公共脚区别. 所以你才把个位打开,然后立即关了去开十位,肯定是十位亮,个位看运气. 3.中断分次, 第一次点亮个位,十位的数据不管. 第二次,点亮十位,个位 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3345
金钱
3345
注册时间
2013-5-28
在线时间
468 小时
发表于 2022-6-9 09:44:20 | 显示全部楼层
几个意见吧
1.乘除运算放到while(1)中去处理,中断直接调用结果.
2.我不知道你这个函数是什么意思?是不是个位暗,十位亮?不然感觉没天理啊.
LED_Write_Data(smg_num[gewei],1);
LED_Write_Data(smg_num[shiwei],0);
一般来说,2位的数码管,都是共用abcdefg端口的,然后一个公共脚区别.
所以你才把个位打开,然后立即关了去开十位,肯定是十位亮,个位看运气.
3.中断分次,
第一次点亮个位,十位的数据不管.
第二次,点亮十位,个位的数据不管.
第三次开始循环第一次第二次.这样让人家都有导通时间
回复

使用道具 举报

2

主题

592

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1458
金钱
1458
注册时间
2019-7-28
在线时间
137 小时
发表于 2022-6-9 12:31:16 | 显示全部楼层
帮顶                 
回复

使用道具 举报

29

主题

492

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2016-4-7
在线时间
123 小时
发表于 2022-6-9 16:15:23 | 显示全部楼层
具体没看程序,一个太暗一个太亮我估计是2个数码管点亮的时间不一样,太暗的你点亮时间短,有个疑问,你个位和十位点亮时间不是应该一样的么,而且你处理程序最好放在WHILE里做,定时中断里不要做这么多处理,好久没搞过数码管,我记得看过文章是,我觉得应该是发一个段码,然后点亮个位,十位关闭,延时多少毫秒,然后再发一个段码个位关闭,十位点亮,延时多少毫秒,然后重复重复这个动作,视觉看起来就是显示多少,
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2022-6-9
在线时间
0 小时
 楼主| 发表于 2022-6-9 17:24:21 | 显示全部楼层
本帖最后由 climberth 于 2022-6-9 17:27 编辑
聚东风 发表于 2022-6-9 10:35
几个意见吧
1.乘除运算放到while(1)中去处理,中断直接调用结果.
2.我不知道你这个函数是什么意思?是不是 ...

问题解决了,感谢,使用了中断分次,虽然还是有点暗但比之前效果要好得多

IMG_4780.JPG
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2022-6-9
在线时间
0 小时
 楼主| 发表于 2022-6-9 17:28:21 | 显示全部楼层
xujian468 发表于 2022-6-9 16:15
具体没看程序,一个太暗一个太亮我估计是2个数码管点亮的时间不一样,太暗的你点亮时间短,有个疑问,你个 ...

好的,感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 23:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表