数码管同时闪烁问题请教
用定时器实现两个数码管同时点亮的程序: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
您的意思是 数码管常亮和闪烁放在一个函数里,需要常亮的时候就显示常亮,需要闪烁的时候,就闪烁?我也 ...
你还没有听懂人家说什么 if(smgtime==30)
{
smg_show(10);
WE_1=0;//关闭显示
WE_2 =0;
}
if(smgtime==30000) //关闭显示要足够长时间才能“闪”
{
smgtime =0
}
正常的电路,2个以上数码管显示,是采用动态扫描方式,首先要知道显示原理,才可以编写正确的软件。
假设2个数码管,刷新周期10ms,每个数码管显示5ms。
正常显示:数码管1显示5ms,数码管2显示5ms,一直循环。
需要闪烁,比如数码管1,1S闪烁一次,则0.5S内显示,0.5S内不显示即可,需要增加一个闪烁的计数标志位,用于判断是否需要显示。
不需要显示时,可以控制段码,也可以控制位码。 HLHG 发表于 2019-12-16 08:59
您的意思是 数码管常亮和闪烁放在一个函数里,需要常亮的时候就显示常亮,需要闪烁的时候,就闪烁?我也 ...
不是这样的
实际项目软件都要分层的,利于维护,
显示只管显示,要显示什么内容是由具体的任务决定的,闪烁其实就是定时送不同的数据去显示。。。 每个数字的显示时间是相等的,亮度才能一样。每个数字是循环的,不分前后。闪烁的根本原因是刷新时间太短 本帖最后由 xyz549040622 于 2019-12-16 14:44 编辑
1.数码管的驱动原理是什么,这个要看电路图
2.动态扫还是静态扫,你要明白这两者的区别,以及你使用的是什么方式,从而加以改进。
这个就是你的程序的意思吧。闪烁程序不是这么写得。
叶春勇 发表于 2019-12-16 15:44
这个就是你的程序的意思吧。闪烁程序不是这么写得。
对对,我是这个意思。这样发现数码管并不会闪烁 xyz549040622 发表于 2019-12-16 14:42
1.数码管的驱动原理是什么,这个要看电路图
2.动态扫还是静态扫,你要明白这两者的区别,以及你使用的是什 ...
动态扫描,原理都懂,但是写程序困难。 dog_xin 发表于 2019-12-16 12:08
每个数字的显示时间是相等的,亮度才能一样。每个数字是循环的,不分前后。闪烁的根本原因是刷新时间太短 ...
恩,是的,现在就是程序问题。 xch 发表于 2019-12-16 10:42
if(smgtime==30)
{
smg_show(10);
谢谢,非常感谢。 ayb_ice 发表于 2019-12-16 11:43
不是这样的
实际项目软件都要分层的,利于维护,
显示只管显示,要显示什么内容是由具体的任务决定的,闪 ...
非**,谢谢您了。 延时时间过长 再编个
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的频率闪烁了。
你这个573驱动笔划段,三极管控制位选,首先得编写一个带合适刷新率的显示程序。
在合适的动态扫描频率下面,定时更新显示。鉴于动态扫描的特征,一般我们扫描频率定义在300Hz-1000KHz之间。
为了实现驱动的统一性,我们选择字符闪烁,其实不是在位扫描上面做**,这里显示函数是功能一样、确定的,只是需要闪烁的字符,将按照闪烁频率轮流显示空白和数字而已,比如我定义半秒闪烁,则0.25S显示欲显示的字符而0.25S显示空白。这样我们看见的实际效果,就是字符半秒周期的闪烁。
在实际显示函数,可以加一个闪烁参数传递,当需要闪烁,根据内部一个比如闪烁周期一一半的计时单元,为奇偶判断显示空白还是正常字符去查表驱动输出,这样就一个函数归一化实现了字符动态扫描+是否闪烁。
同理,多位动态扫描,数据显示的高位灭0,同样的也是驱动输出一个空白。而且该空白并不需要单独做,只需要把一个00(共阴)、或者FF(共阳),加在BCD-7段的驱动表格最末尾就可以了。 叶春勇 发表于 2019-12-18 10:01
再编个
smg_show_with_flash(x,flag)
{
谢谢,非常感谢。 tianxj01 发表于 2019-12-18 16:24
你这个573驱动笔划段,三极管控制位选,首先得编写一个带合适刷新率的显示程序。
在合适的动态扫描频率下面 ...
学习了,谢谢。
页:
[1]