打印

动态扫描数码管,怎么克服LED闪的现象。。

[复制链接]
10675|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
isbit|  楼主 | 2008-8-22 12:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
conwh| | 2008-8-22 12:59 | 只看该作者

使用中断能够准确一点

使用特权

评论回复
板凳
isbit|  楼主 | 2008-8-22 18:20 | 只看该作者

不想放在中断里,中断做更重要的事

 除了放在中断里处理,能解决这个问题,
还没有其他好的方法?
请高手指点,谢谢!

使用特权

评论回复
地板
天雨粟| | 2008-8-22 19:15 | 只看该作者

是不是这样?

用的几个管子,如果多于12个,要用字段扫描法,前几天有人讨论过,如果用字位扫描法,可能有亮度不匀的问题。
如果用动态扫描,则编程时应不断刷新,不管你执行的是什么任务(中断除外),在此之前,首要的任务就是刷新显示。
所以你的问题1,根本不是多长时间调一次显示的问题,而是无时不刻不在调显示。
问题2,1毫秒是标准用法,我试过,无任何问题!

使用特权

评论回复
5
农民讲习所| | 2008-8-22 19:21 | 只看该作者

放不放中断中,你的根据和理由是什么?

根据农民理论,设计分三个层次:非实时、弱实时、强实时,分别对应着非中断处理,可被嵌套中断处理,嵌套中断处理。

你算算你的LED显示处理属于哪个层次?

使用特权

评论回复
6
农民讲习所| | 2008-8-22 19:23 | 只看该作者

不要说你想放哪里就放哪里,设计都是有目的和依据的

使用特权

评论回复
7
taoest| | 2008-8-22 23:10 | 只看该作者

你保持1毫秒的想法是没错的。
闪是因为你这个1毫秒并不精确。时长时短。所以会看到闪烁。而不是因为频率低。
将显示放到中断里控制,是很好的做法。实际效果也很好。

使用特权

评论回复
8
lhb8605| | 2008-8-23 15:35 | 只看该作者

动态扫描数码管,怎么克服LED闪的现象。。

楼上说的没错,数码管闪烁:一是因为你设置的延迟时间太长,被人眼判断出来。二就是由于主程序执行不同任务,使得程序的时间不固定。用中断是好方法。不过如果主程序不多,用低延迟就可以了。

使用特权

评论回复
9
平常人| | 2008-8-23 21:31 | 只看该作者

尽量保持扫描的频率稳定并且足够地快

使用特权

评论回复
10
czh| | 2008-8-24 00:23 | 只看该作者

保证刷新所有LED的频率在50HZ以上就可以了,多了也没用

另外软件不行就用硬件解决

使用特权

评论回复
11
koolean| | 2008-8-24 23:46 | 只看该作者

楼主,你用示波器看下该LED的驱动端,是否准确1ms就行了

如题

使用特权

评论回复
12
iammercy| | 2008-8-25 08:59 | 只看该作者

問題點

假如你是放主函數刷新

主函數最大可能的執行時間大于1ms
LED根據1ms標記刷新一次,LED模塊在一個主函數輪循只執行一次

那么,就會有閃爍的現象

使用特权

评论回复
13
isbit|  楼主 | 2008-8-25 09:03 | 只看该作者

谢谢,

1:每一位数码管的点亮保持时间1ms是固定的!

2:display_led(),调用的时间不匀的原因吧,因为跑一圈的时间不能保证 
   固定,因为放在主函数里。

3:看来大家的处理方法一直以为放中断里好些,那我就放中断里,
   保证每位数码管在50hz左右吧!

4:谢谢大家的指点!

使用特权

评论回复
14
iammercy| | 2008-8-25 09:42 | 只看该作者

可以這樣做

例如程序最大可能跑一圈要2ms
而LED程序則根據1ms標記跑一次

可以放多幾次,使得在一個Main循環執行多次LED刷新模塊


void ISR_Timer() interrupt x
{
  ...
  gb1ms = 1;      //設置1ms標記
  ...
}


main()
{
  ...
  ...
  while(1)
  {
    喂狗
    LED_Display();   
    func1();        //其它程序模塊
    func2();        //其它程序模塊
    func3();        //其它程序模塊
    func4();        //其它程序模塊
    func5();        //其它程序模塊
    func6();        //其它程序模塊
    func7();        //其它程序模塊
    func8();        //其它程序模塊
    LED_Display();       
    func9();        //其它程序模塊
    func10();       //其它程序模塊
    func11();       //其它程序模塊
    func12();       //其它程序模塊
  }
}

void LED_Display()
{
   if(_testbit_(gb1ms))
   {
     ...
     ...
   }
}

使用特权

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

本版积分规则

194

主题

963

帖子

1

粉丝