打印

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

[复制链接]
1945|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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
是啊,楼主把注视写上,估计自己都找到问题了。还不行的话,请到侃单片机版面精华帖内找“程序调试黑宝书” ...

呵呵,知道了,谢谢提醒!这是个好习惯啊!

使用特权

评论回复
5
sedatefire| | 2013-3-2 11:41 | 只看该作者
               if(a==10)
                {        
                        a=0;
                        t++;
                }
这样写危险,你自己思考看下为什么

使用特权

评论回复
6
sedatefire| | 2013-3-2 11:45 | 只看该作者
本帖最后由 sedatefire 于 2013-3-2 11:49 编辑
if (a >= 10)  /* 这样才能避免万一a跑过头了 */
{        
    a -= 10;   /* 如此更精确 */
    t ++;
    qian = t/1000;
    bai   = (t%1000)/100;  /*统一算法思路,避免突兀,导致可阅读性降低 */
    shi   = (t%100)/10;
    ge   = t%10;
    display(qian, bai, shi, ge);
}

使用特权

评论回复
7
sedatefire| | 2013-3-2 11:47 | 只看该作者
这样你认为如何,这样的话,按道理,delay不需要用到

如果没有特殊情况,避免做任何的“硬延时”,切忌

使用特权

评论回复
8
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都是必须的,你思考下,为什么?

使用特权

评论回复
9
sedatefire| | 2013-3-2 11:54 | 只看该作者
程序,写出来容易
要写到无懈可击,才真正难

没有无懈可击的程序,同样的代码,在不同的条件下,不同平台,都会有一些异常

使用特权

评论回复
10
sedatefire| | 2013-3-2 11:56 | 只看该作者
本帖最后由 sedatefire 于 2013-3-2 12:10 编辑

等不及楼主到了,一些把“答案”都公布了,
楼主好好看看,思考下,为什么

使用特权

评论回复
11
sedatefire| | 2013-3-2 11:57 | 只看该作者
给你留个作业,我说,你下面这个写法,会导致定时器存在误差,你好好想一想

void exter0() interrupt 1   
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        a++;
}

使用特权

评论回复
12
sedatefire| | 2013-3-4 20:22 | 只看该作者
这就结了呀,不想说点什么啊
什么滔滔之水之类的啊
唉;P

使用特权

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

本版积分规则

14

主题

60

帖子

0

粉丝