打印
[51单片机]

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

[复制链接]
2265|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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;}
void time5msint()
{
    TMOD = 0x01;
    TH0 = 0x0D4;
    TL0 = 0x0CD;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}

void Timer0Interrupt(void) interrupt 1
{
    TH0 = 0x0D4;
    TL0 = 0x0CD;
        times[0]--;
        times[1]--;
        times[2]--;               
}

//////////////////////
/* 闪烁 */
void falsh()
{
  unsigned char temp[4],i ;
//  unsigned char i;
  for(i=0;i<3;i++){DspBuf[i]=temp[i];}
  if(times[2]<100){for(i=0;i<3;i++){DspBuf[i]=0x0;}TM1629_DEMO2(); }
  if(times[2]==0){times[2]=200;for(i=0;i<3;i++){DspBuf[i]=temp[i];}TM1629_DEMO2(); }

}

相关帖子

沙发
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   和 送数值。。。。

使用特权

评论回复
5
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();
        }



}

使用特权

评论回复
6
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 了,,,只是我需要的时候赋值就可以了。。。。会自动--

使用特权

评论回复
7
ayb_ice| | 2013-8-29 17:03 | 只看该作者
本来还想继续说的,
算了吧

使用特权

评论回复
8
aimie|  楼主 | 2013-8-30 10:06 | 只看该作者
ayb_ice 发表于 2013-8-29 17:03
本来还想继续说的,
算了吧

好吧,不知道哪里得罪了。。

使用特权

评论回复
9
tergy2012| | 2013-8-30 11:35 | 只看该作者
谢谢分享啊

使用特权

评论回复
10
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();//关闭显示

程序前面加标志位。。。
也行算法不是最好的,但是可以用

使用特权

评论回复
11
杨爱林林| | 2013-8-30 16:43 | 只看该作者
c语言基础太差

使用特权

评论回复
12
aimie|  楼主 | 2013-8-30 18:52 | 只看该作者
杨爱林林 发表于 2013-8-30 16:43
c语言基础太差

这个确实,,,正在 死补烂补中

使用特权

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

本版积分规则

16

主题

123

帖子

2

粉丝