[51单片机] 一个简单的数码管闪烁程序,就是出问题了,有经验的帮忙

[复制链接]
 楼主| aimie 发表于 2013-8-29 15:38 | 显示全部楼层 |阅读模式
本帖最后由 aimie 于 2013-8-29 16:00 编辑

或者有什么其他更好的实现方法

思路是先把显示数据缓存到temp里面,,送0x00(关闭显示),隔一段时间在把temp里面的值赋值到缓存里面 送显示,,,这样循环几次。。。。。。真是基础太差,有想法写不出来。

我下面的代码闪是闪了,,,但是似乎闪的不正常,,,本来定义了4个位闪的只有一个位闪,
我想是不是一下红色部分代码出问题了
void falsh()
{
  unsigned char temp[4],i ;
//  unsigned char i;
  for(i=0;i<3;i++){DspBuf=temp;}
  1. void time5msint()
  2. {
  3.     TMOD = 0x01;
  4.     TH0 = 0x0D4;
  5.     TL0 = 0x0CD;
  6.     EA = 1;
  7.     ET0 = 1;
  8.     TR0 = 1;
  9. }

  10. void Timer0Interrupt(void) interrupt 1
  11. {
  12.     TH0 = 0x0D4;
  13.     TL0 = 0x0CD;
  14.         times[0]--;
  15.         times[1]--;
  16.         times[2]--;               
  17. }

  18. //////////////////////
  19. /* 闪烁 */
  20. void falsh()
  21. {
  22.   unsigned char temp[4],i ;
  23. //  unsigned char i;
  24.   for(i=0;i<3;i++){DspBuf[i]=temp[i];}
  25.   if(times[2]<100){for(i=0;i<3;i++){DspBuf[i]=0x0;}TM1629_DEMO2(); }
  26.   if(times[2]==0){times[2]=200;for(i=0;i<3;i++){DspBuf[i]=temp[i];}TM1629_DEMO2(); }

  27. }
ayb_ice 发表于 2013-8-29 16:16 | 显示全部楼层
这样的程序怎么能行呢,在这里闪其它事情就不干了
ayb_ice 发表于 2013-8-29 16:20 | 显示全部楼层
设一时间标志,比如500MS,每500MS取反一次,

标志==1时发正常显示数据,==0时送0显示即可
 楼主| aimie 发表于 2013-8-29 16:28 | 显示全部楼层
ayb_ice 发表于 2013-8-29 16:20
设一时间标志,比如500MS,每500MS取反一次,

标志==1时发正常显示数据,==0时送0显示即可 ...

if(times[2]<100){for(i=0;i<3;i++){DspBuf=0x0;}TM1629_DEMO2(); }
if(times[2]==0){times[2]=200;for(i=0;i<3;i++){DspBuf=temp;}TM1629_DEMO2(); }

标志位就是定时器times【2】

到这个数值减少到一定时间的时候送0   和 送数值。。。。
ayb_ice 发表于 2013-8-29 16:36 | 显示全部楼层
void falsh()

{

  unsigned char temp[4],i ;               

//  unsigned char i;

        for(i=0;i<3;i++){
                DspBuf[i]=temp[i];        // temp没有赋值就使用,显示什么,只有上帝知道
        }

        if(times[2]<100){
                for(i=0;i<3;i++){
                        DspBuf[i]=0x0;
                }
                TM1629_DEMO2();
        }

        if(times[2]==0){        // 你凭什么保证此时times[2]==0
                times[2]=200;
                for(i=0;i<3;i++){
                        DspBuf[i]=temp[i];
                }
                TM1629_DEMO2();
        }



}
 楼主| aimie 发表于 2013-8-29 16:41 | 显示全部楼层
本帖最后由 aimie 于 2013-8-29 16:43 编辑

11.void Timer0Interrupt(void) interrupt 1

12.{

13.    TH0 = 0x0D4;

14.    TL0 = 0x0CD;

15.        times[0]--;

16.        times[1]--;

17.        times[2]--;
               

18.}

if(times[2]<100){for(i=0;i<3;i++){DspBuf=0x0;}TM1629_DEMO2(); }
if(times[2]==0){times[2]=200;for(i=0;i<3;i++){DspBuf=temp;}TM1629_DEMO2(); }

times 没有赋值 那么就是0,
不可能把整段程序都搬上来吧。。。。time初值,,但是初值肯定程序开始不久早就变成0 了,,,只是我需要的时候赋值就可以了。。。。会自动--

ayb_ice 发表于 2013-8-29 17:03 | 显示全部楼层
本来还想继续说的,
算了吧
 楼主| aimie 发表于 2013-8-30 10:06 | 显示全部楼层
ayb_ice 发表于 2013-8-29 17:03
本来还想继续说的,
算了吧

好吧,不知道哪里得罪了。。
tergy2012 发表于 2013-8-30 11:35 | 显示全部楼层
谢谢分享啊
 楼主| aimie 发表于 2013-8-30 16:36 | 显示全部楼层
  if(times[2]==0){times[2]=200;}
  if(times[2]>100){for(i=0;i<4;i++) {DspBuf[i]=0x3f];}TM1629_DEMO2(); } //送正常数据
  if(times[2]<100){for(i=0;i<4;i++) {DspBuf[i]=0x0;}TM1629_DEMO2();//关闭显示

程序前面加标志位。。。
也行算法不是最好的,但是可以用
杨爱林林 发表于 2013-8-30 16:43 | 显示全部楼层
c语言基础太差
 楼主| aimie 发表于 2013-8-30 18:52 | 显示全部楼层
杨爱林林 发表于 2013-8-30 16:43
c语言基础太差

这个确实,,,正在 死补烂补中
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

123

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部

16

主题

123

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部