为什么数码管个位显示始终为0,怎么不加?前面三位都正常

[复制链接]
 楼主| 444745317 发表于 2013-3-1 13:21 | 显示全部楼层 |阅读模式
#include<reg52.h>  
#include<intrins.h>
#define uint unsigned int   
#define uchar unsigned char  
sbit dula=P2^6;      
sbit wela=P2^7;      
uchar ge,shi,bai,qian;
uint t,a;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void display(uchar,ucahr,uchar,uchar);
void delay(uint);
void main()
{
        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;
        t=0;
        a=0;
        while(1)
        {
                if(a==10)
                {       
                        a=0;
                        t++;
                }
                qian=t/1000;
                bai=t/100%10;
                shi=t%100/10;
                ge=t%10;
        display(qian,bai,shi,ge);
        }
}       
void delay(uint z)      
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void exter0() interrupt 1   
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        a++;
}
void display(uchar qian,uchar bai,uchar shi,uchar ge)
{
        dula=1;
                P0=table[qian];   
                dula=0;
                P0=0xff;               
                wela=1;
                P0=0xfe;
                wela=0;
                delay(1);

                dula=1;
                P0=table[bai];
                dula=0;
                P0=0xff;
                wela=1;
                P0=0xfd;
                wela=0;
                delay(1);

                dula=1;
                P0=table[shi];
                dula=0;
                P0=0xff;
                wela=1;
                P0=0xfb;
                wela=0;
                delay(1);
               
                dula=1;
                P0=table[ge];
                dula=0;
                P0=0xff;
                wela=1;
                P0=0xf7;
                wela=0;
                delay(1);
}

dirtwillfly 发表于 2013-3-1 14:03 | 显示全部楼层
汗,一句注释都没有啊。估计没人爱读。
NE5532 发表于 2013-3-1 16:25 | 显示全部楼层
是啊,楼主把注视写上,估计自己都找到问题了。还不行的话,请到侃单片机版面精华帖内找“程序调试黑宝书”
 楼主| 444745317 发表于 2013-3-1 22:21 | 显示全部楼层
NE5532 发表于 2013-3-1 16:25
是啊,楼主把注视写上,估计自己都找到问题了。还不行的话,请到侃单片机版面精华帖内找“程序调试黑宝书” ...

呵呵,知道了,谢谢提醒!这是个好习惯啊!
sedatefire 发表于 2013-3-2 11:41 | 显示全部楼层
               if(a==10)
                {        
                        a=0;
                        t++;
                }
这样写危险,你自己思考看下为什么
sedatefire 发表于 2013-3-2 11:45 | 显示全部楼层
本帖最后由 sedatefire 于 2013-3-2 11:49 编辑
  1. if (a >= 10)  /* 这样才能避免万一a跑过头了 */
  2. {        
  3.     a -= 10;   /* 如此更精确 */
  4.     t ++;
  5.     qian = t/1000;
  6.     bai   = (t%1000)/100;  /*统一算法思路,避免突兀,导致可阅读性降低 */
  7.     shi   = (t%100)/10;
  8.     ge   = t%10;
  9.     display(qian, bai, shi, ge);
  10. }

sedatefire 发表于 2013-3-2 11:47 | 显示全部楼层
这样你认为如何,这样的话,按道理,delay不需要用到

如果没有特殊情况,避免做任何的“硬延时”,切忌
sedatefire 发表于 2013-3-2 11:53 | 显示全部楼层
本帖最后由 sedatefire 于 2013-3-2 12:10 编辑

实际上
a -= 10;
这个还是有些问题的
最好,你把a声明称
typedef  MCU_INT   xx;  /* xx取决于系统的mcu总线位数 */
volatile  MCU_INT  a;

或者还有一个办法

__disable_timer_int();
a -= 10;
__enable_timer_int();


但无论哪一种写法,volatile都是必须的,你思考下,为什么?
sedatefire 发表于 2013-3-2 11:54 | 显示全部楼层
程序,写出来容易
要写到无懈可击,才真正难

没有无懈可击的程序,同样的代码,在不同的条件下,不同平台,都会有一些异常
sedatefire 发表于 2013-3-2 11:56 | 显示全部楼层
本帖最后由 sedatefire 于 2013-3-2 12:10 编辑

等不及楼主到了,一些把“答案”都公布了,
楼主好好看看,思考下,为什么
sedatefire 发表于 2013-3-2 11:57 | 显示全部楼层
给你留个作业,我说,你下面这个写法,会导致定时器存在误差,你好好想一想

void exter0() interrupt 1   
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        a++;
}
sedatefire 发表于 2013-3-4 20:22 | 显示全部楼层
这就结了呀,不想说点什么啊
什么滔滔之水之类的啊
唉;P
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

60

帖子

0

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

14

主题

60

帖子

0

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