打印
[ZLG-MCU]

有关数码显示,帮我看看问题出在哪儿

[复制链接]
4093|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
frankeng|  楼主 | 2009-2-12 10:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我是个初学者,用LPC931做一个很简单的数码管显示的累加实验。程序和电路图如下所示,现在问题如下:如果P0、P2口设为开漏或准双向口,最后一个数码管特别亮,其它正常,如果屏蔽掉最后一个,倒数第二个又变成特亮了。如果把P0、P2口设开推挽的话,整个显示都不正常了,所有数码管同时显示相同的字段,我把延迟时间放的很慢,发现三极管的集电极始终处于高电平,按照道理应该设置成推输出。我想了很长时间都没把问题想出来,请哪位高手指点。

#include<reg931.h>
#define uchar unsigned char
unsigned char data dis_buf[6];  // dis_buf 显于缓冲区基地址

unsigned char tab[6]={0xfb,0xfd,0xfe,0x7f,0xbf,0xf7};
unsigned char code dis_code[11]={

0x28,               /*0*/
0xEB,        /*1*/
0x32,        /*2*/
0x62,        /*3*/
0xE1,        /*4*/
0x64,        /*5*/
0x24,        /*6*/
0xEA,        /*7*/
0x20,        /*8*/
0x60,        /*9*/
0xff            /*null*/
                                };

long int Num=0;
uchar k;

void delay(uchar i)
{uchar j;
  while(i--)   
  {
  for(j=0;j<50;j++);    
   }
}



void time() interrupt 1 using 1    
{    k++;
    TH0=0xec;
    TL0=0x78;

    if(k==100){k=0;Num++;}
}

void disp(void)
{     uchar j;
     dis_buf[5]=Num%10;
    dis_buf[4]=Num/10%10;
    dis_buf[3]=Num/100%10;
    dis_buf[2]=Num/1000%10;
    dis_buf[1]=Num/10000%10;
    dis_buf[0]=Num/100000%10;
    for(j=0;j<6;j++)
    {
    P0=tab[j];
    P2=dis_code[dis_buf[j]];
    delay(5);
    
    }
    
}
main()
{
      P0M1=0x00;        
     P0M2=0xff;        

    P2M1=0x00;        
    P2M2=0xff;        
    P0=1;
    P2=0;

    TMOD=0x01;
    TH0=0xec;
    TL0=0x78;
    TR0=1;
    ET0=1;
    EA=1;

while(1)
    
   {
disp();
    } 

}



相关帖子

来自 2楼
xwj| | 2009-2-12 17:08 | 只看该作者

顺便帮你改了下程序,希望你能学会这种思路

至于是定时器刷新还是主循环刷新,系统空闲时是没区别的


#include<reg931.h>
#define uchar unsigned char
unsigned char data dis_buf[6];  // dis_buf 显于缓冲区基地址

unsigned char tab[6]={0xfb,0xfd,0xfe,0x7f,0xbf,0xf7};
unsigned char code dis_code[11]={

    0x28,        /*0*/
    0xEB,        /*1*/
    0x32,        /*2*/
    0x62,        /*3*/
    0xE1,        /*4*/
    0x64,        /*5*/
    0x24,        /*6*/
    0xEA,        /*7*/
    0x20,        /*8*/
    0x60,        /*9*/
    0xff         /*null*/
};

long int Num=0;
uchar k;
uchar disp_com;        //老x增加的

void delay(uchar i)
{
    uchar j;
    while(i--)
    {
        for(j=0;j<50;j++);
    }
}

void time() interrupt 1 using 1
{
    k++;
    TH0=0xec;
    TL0=0x78;

    if(k==100){k=0;Num++;}
}

void disp(void)
{
    dis_buf[5]=Num%10;
    dis_buf[4]=Num/10%10;
    dis_buf[3]=Num/100%10;
    dis_buf[2]=Num/1000%10;
    dis_buf[1]=Num/10000%10;
    dis_buf[0]=Num/100000%10;
}

void refur_disp(void)        //老x增加的,每次刷新显示1位,准备下一位
{                            //每次刷新显示的时间都是一样的哦
    P0=tab[disp_com];
    P2=dis_code[dis_buf][disp_com]];
    disp_com++;
    if(disp_com>=6)
        disp_com=0;        //最后1位其实会多一条指令,不过影响微小,无所谓:-)
                        //如果是4/8等2的N次方,那就不用if... ,
                        //用disp_com&=0x03;/disp_com&=0x07即可,那时间就是完全一样的了
}

void main(void)
{
    P0M1=0x00;
    P0M2=0xff;

    P2M1=0x00;
    P2M2=0xff;
    P0=1;
    P2=0;

    TMOD=0x01;
    TH0=0xec;
    TL0=0x78;
    TR0=1;
    ET0=1;
    EA=1;

    disp();                    //老x调整的
    while(1)
    {
        refur_disp();        //老x调整的
        delay(5);
    }
}

//这样,修改显示内容和刷新显示是完全分开的,
//每次刷新显示的时间也就都是一样的了哦

//本程序由xwj设计的UltraEdit脚本加亮显示,如需要脚本访问我的Blog 或发送邮件至:xwjfile@21cn.com

使用特权

评论回复
板凳
zlgmcu| | 2009-2-12 11:51 | 只看该作者

可以参考这里的例子

周立功单片机(www.ZLGMCU.com)首页左边 → Luminary Micro 32位ARM系列 → 开发工具及开发指南
Ctrl+F,搜索“动态数码管”

使用特权

评论回复
地板
frankeng|  楼主 | 2009-2-12 16:38 | 只看该作者

没理解很透彻

还是没找出自己的问题所以,郁闷中...

使用特权

评论回复
5
xwj| | 2009-2-12 16:59 | 只看该作者

因为最后一位是多执行了一大堆指令,当然会更亮一些

这都是比其他位多出来的时间哦:
void disp(void)
{     uchar j;
     dis_buf[5]=Num%10;
    dis_buf[4]=Num/10%10;
    dis_buf[3]=Num/100%10;
    dis_buf[2]=Num/1000%10;
    dis_buf[1]=Num/10000%10;
    dis_buf[0]=Num/100000%10;


使用特权

评论回复
6
computer00| | 2009-2-12 17:02 | 只看该作者

显示一次后就关掉...或者干脆开定时器刷新,这样轻松多了

使用特权

评论回复
7
frankeng|  楼主 | 2009-2-13 10:58 | 只看该作者

谢谢各位,现在茅塞顿开,真是感激不尽。

使用特权

评论回复
8
lhj200304| | 2009-2-13 11:11 | 只看该作者

注意学习老大的分层的程序设计思想

注意学习老大的分层的程序设计思想,这才是最重要的

使用特权

评论回复
9
frankeng|  楼主 | 2009-2-13 11:54 | 只看该作者

好的,感谢师傅们的教诲,弟子铭记心中,以后请多多指教

使用特权

评论回复
10
xiaoxin1986| | 2009-2-16 20:58 | 只看该作者

六楼强悍,学到了不少东西

使用特权

评论回复
11
hong6xing| | 2009-2-24 18:41 | 只看该作者

ok

ok

使用特权

评论回复
12
avocationA| | 2009-2-26 15:03 | 只看该作者

P2=dis_code[dis_buf][disp_com]];

P2=dis_code[dis_buf][disp_com]];

使用特权

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

本版积分规则

4

主题

14

帖子

0

粉丝