打印

数码管同时闪烁问题请教

[复制链接]
2394|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
HLHG|  楼主 | 2019-12-16 08:18 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
用定时器实现两个数码管同时点亮的程序:


if(smgtime==10)  
      {
          smg_show(10);
        WE_1=1;
        WE_2=0;
        smg_show(data/10);
      }
      if(smgtime==20)
      {   smg_show(10);
        WE_1=0;
        WE_2=1;
        smg_show(data%10);
        smgtime=0;

      }


现在想让数码管实现闪烁的功能,两个数码管按照一定的频率闪烁,在同时点亮的基础上加了一个关闭数码管的功能,我是这样编写的,
if(smgtime==10)  
      {
          smg_show(10);
        WE_1=1;
        WE_2=0;
        smg_show(data/10);
      }
      if(smgtime==20)
      {   smg_show(10);
        WE_1=0;
        WE_2=1;
        smg_show(data%10);

      }
      if(smgtime==30)
      {
          smg_show(10);
          smgtime=0;
      }


出现的问题是,第二个数码管的亮度比第一个数码管亮度明显,第一个数码管出现明显的闪烁,第二个数码管闪烁不明显。硬件电路是这样设计的,
74HC573驱动段选,数码管是共阴极的,单片机通过三极管来控制公共端。
现在问题不知道出现在哪里,请大家帮我分析一下,谢谢。

使用特权

评论回复

相关帖子

沙发
ayb_ice| | 2019-12-16 08:32 | 只看该作者
做个显示驱动 ,在定时器中完成显示,从缓冲区取数据显示,主循环控制缓冲区待显示的内容即可,实际项目都是这样的

使用特权

评论回复
板凳
HLHG|  楼主 | 2019-12-16 08:59 | 只看该作者
ayb_ice 发表于 2019-12-16 08:32
做个显示驱动 ,在定时器中完成显示,从缓冲区取数据显示,主循环控制缓冲区待显示的内容即可,实际项目都 ...

您的意思是 数码管常亮和闪烁放在一个函数里,需要常亮的时候就显示常亮,需要闪烁的时候,就闪烁?我也是这样做的,出现的问题就是两个数码管不同时闪烁,一个闪烁明显,一个闪烁不明显呢。

使用特权

评论回复
地板
mcu5i51| | 2019-12-16 09:13 | 只看该作者
HLHG 发表于 2019-12-16 08:59
您的意思是 数码管常亮和闪烁放在一个函数里,需要常亮的时候就显示常亮,需要闪烁的时候,就闪烁?我也 ...

你还没有听懂人家说什么

使用特权

评论回复
评论
HLHG 2019-12-16 10:33 回复TA
请您指教一下可以吗 
5
xch| | 2019-12-16 10:42 | 只看该作者
if(smgtime==30)
      {
          smg_show(10);
        
    WE_1=0;//关闭显示
       WE_2 =0;
      }
if(smgtime==30000) //关闭显示要足够长时间才能“闪”
{
smgtime =0
}

使用特权

评论回复
6
gx_huang| | 2019-12-16 11:04 | 只看该作者
正常的电路,2个以上数码管显示,是采用动态扫描方式,首先要知道显示原理,才可以编写正确的软件。
假设2个数码管,刷新周期10ms,每个数码管显示5ms。
正常显示:数码管1显示5ms,数码管2显示5ms,一直循环。
需要闪烁,比如数码管1,1S闪烁一次,则0.5S内显示,0.5S内不显示即可,需要增加一个闪烁的计数标志位,用于判断是否需要显示。
不需要显示时,可以控制段码,也可以控制位码。

使用特权

评论回复
评论
HLHG 2019-12-18 08:36 回复TA
非常感谢,好像有点启发 ,谢谢了。 
7
ayb_ice| | 2019-12-16 11:43 | 只看该作者
HLHG 发表于 2019-12-16 08:59
您的意思是 数码管常亮和闪烁放在一个函数里,需要常亮的时候就显示常亮,需要闪烁的时候,就闪烁?我也 ...

不是这样的
实际项目软件都要分层的,利于维护,
显示只管显示,要显示什么内容是由具体的任务决定的,闪烁其实就是定时送不同的数据去显示。。。

使用特权

评论回复
8
dog_xin| | 2019-12-16 12:08 | 只看该作者
每个数字的显示时间是相等的,亮度才能一样。每个数字是循环的,不分前后。闪烁的根本原因是刷新时间太短

使用特权

评论回复
9
xyz549040622| | 2019-12-16 14:42 | 只看该作者
本帖最后由 xyz549040622 于 2019-12-16 14:44 编辑

1.数码管的驱动原理是什么,这个要看电路图
2.动态扫还是静态扫,你要明白这两者的区别,以及你使用的是什么方式,从而加以改进。

使用特权

评论回复
10
叶春勇| | 2019-12-16 15:44 | 只看该作者

这个就是你的程序的意思吧。闪烁程序不是这么写得。

使用特权

评论回复
11
HLHG|  楼主 | 2019-12-18 08:35 | 只看该作者
叶春勇 发表于 2019-12-16 15:44
这个就是你的程序的意思吧。闪烁程序不是这么写得。

对对,我是这个意思。这样发现数码管并不会闪烁

使用特权

评论回复
12
HLHG|  楼主 | 2019-12-18 08:35 | 只看该作者
xyz549040622 发表于 2019-12-16 14:42
1.数码管的驱动原理是什么,这个要看电路图
2.动态扫还是静态扫,你要明白这两者的区别,以及你使用的是什 ...

动态扫描,原理都懂,但是写程序困难。

使用特权

评论回复
13
HLHG|  楼主 | 2019-12-18 08:36 | 只看该作者
dog_xin 发表于 2019-12-16 12:08
每个数字的显示时间是相等的,亮度才能一样。每个数字是循环的,不分前后。闪烁的根本原因是刷新时间太短 ...

恩,是的,现在就是程序问题。

使用特权

评论回复
14
HLHG|  楼主 | 2019-12-18 08:36 | 只看该作者
xch 发表于 2019-12-16 10:42
if(smgtime==30)
      {
          smg_show(10);

谢谢,非常感谢。

使用特权

评论回复
15
HLHG|  楼主 | 2019-12-18 08:37 | 只看该作者
ayb_ice 发表于 2019-12-16 11:43
不是这样的
实际项目软件都要分层的,利于维护,
显示只管显示,要显示什么内容是由具体的任务决定的,闪 ...

非**,谢谢您了。

使用特权

评论回复
16
一路向北lm| | 2019-12-18 09:45 | 只看该作者
延时时间过长

使用特权

评论回复
17
叶春勇| | 2019-12-18 10:01 | 只看该作者
再编个
smg_show_with_flash(x,flag)
{
     if(flag)
smg_show(10);

     else
smg_show(x);
}

然后定义flash_acc,flash_flag变量
在定时器中断加入
if(flash_acc<1000) flash_flag++;
else flash_flag=0;
flash_flag=(flash_acc>500);

然后你调用
smg_show_with_flash(x,flash_flag)
这样就可以按照flash_flash的频率闪烁了。


使用特权

评论回复
18
tianxj01| | 2019-12-18 16:24 | 只看该作者
你这个573驱动笔划段,三极管控制位选,首先得编写一个带合适刷新率的显示程序。
在合适的动态扫描频率下面,定时更新显示。鉴于动态扫描的特征,一般我们扫描频率定义在300Hz-1000KHz之间。
为了实现驱动的统一性,我们选择字符闪烁,其实不是在位扫描上面做**,这里显示函数是功能一样、确定的,只是需要闪烁的字符,将按照闪烁频率轮流显示空白和数字而已,比如我定义半秒闪烁,则0.25S显示欲显示的字符而0.25S显示空白。这样我们看见的实际效果,就是字符半秒周期的闪烁。
在实际显示函数,可以加一个闪烁参数传递,当需要闪烁,根据内部一个比如闪烁周期一一半的计时单元,为奇偶判断显示空白还是正常字符去查表驱动输出,这样就一个函数归一化实现了字符动态扫描+是否闪烁。
同理,多位动态扫描,数据显示的高位灭0,同样的也是驱动输出一个空白。而且该空白并不需要单独做,只需要把一个00(共阴)、或者FF(共阳),加在BCD-7段的驱动表格最末尾就可以了。

使用特权

评论回复
19
HLHG|  楼主 | 2019-12-20 08:22 | 只看该作者
叶春勇 发表于 2019-12-18 10:01
再编个
smg_show_with_flash(x,flag)
{

谢谢,非常感谢。

使用特权

评论回复
20
HLHG|  楼主 | 2019-12-20 08:23 | 只看该作者
tianxj01 发表于 2019-12-18 16:24
你这个573驱动笔划段,三极管控制位选,首先得编写一个带合适刷新率的显示程序。
在合适的动态扫描频率下面 ...

学习了,谢谢。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

70

帖子

0

粉丝