单片机控制数码管同时闪烁结果闪烁频率不一致

2020-03-11 19:35发布

用定时器实现两个数码管同时点亮的程序:


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);
        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);

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


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

 

19条回答
HLHG
1楼 · 2020-03-13 17:07.采纳回答


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


谢谢,非常感谢。

HLHG
2楼-- · 2020-03-13 18:00


不是这样的
实际项目软件都要分层的,利于维护,
显示只管显示,要显示什么内容是由具体的任务决定的,闪 ...


非常受教,谢谢您了。

一路向北lm
3楼-- · 2020-03-13 20:26
 精彩回答 2  元偷偷看……
叶春勇
4楼-- · 2020-03-13 21:18
再编个
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的频率闪烁了。


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


再编个
smg_show_with_flash(x,flag)
{


谢谢,非常感谢。

HLHG
7楼-- · 2020-03-14 05:40


你这个573驱动笔划段,三极管控制位选,首先得编写一个带合适刷新率的显示程序。
在合适的动态扫描频率下面 ...


学习了,谢谢。

一周热门 更多>