微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 利用51单片驱动数码管显示0~9999

利用51单片驱动数码管显示0~9999

时间:10-02 整理:3721RD 点击:
利用51单片驱动数码管显示0~9999,程序如下,结果却只显示0~99,哪里出错了吗?
#include<reg52.h>
#define uchar unsigned char
void delay(uchar z);
void timer_init();
void display(int num);
sbit S1 = P3^5;
sbit S2 = P3^4;
sbit S3 = P3^3;
sbit S4 = P3^2;
uchar cunter;
int shu;
uchar code leddata[]={
                0xC0,  //"0"
                0xF9,  //"1"
                0xA4,  //"2"
                0xB0,  //"3"
                0x99,  //"4"
                0x92,  //"5"
                0x82,  //"6"
                0xF8,  //"7"
                0x80,  //"8"
                0x90   //"9"
                         };
int main(void)
{       
        timer_init();
        while(1)
        {       
                if(TF0 == 1)
                {
                        TF0 = 0;
                        TH0 = (65536 - 9216) / 256;
                        TL0 = (65536 - 9216) % 256;
                        cunter++;
                }
                if(cunter == 10)
                {
                        cunter = 0;
                        shu++;                               
                }
                if(shu == 9999)
                        shu = 0;
                display(shu);               
        }
        return 0;
}
void timer_init()
{
        TMOD = 0x01;
        TH0 = (65536 - 9216) / 256;
        TL0 = (65536 - 9216) % 256;
        TR0 = 1;
}
void delay(uchar z)
{
        uchar x , y;
        for(x = z; z > 0; z--)
                for(y = 116; y > 0; y--);
}
void display(int num)
{
        int ge , shi , bai , qian;
        qian = num / 1000;
        bai = num % 10 / 100;
        shi = num % 100 / 10;
        ge = num % 10;
       
        P0 = 0xff;
        P2 = 0xf7;
        P0 = leddata[ge];
        delay(1);
        P0 = 0xff;
        P2 = 0xfb;
        P0 = leddata[shi];
        delay(1);
        P0 = 0xff;
        P2 = 0xfd;
        P0 = leddata[bai];
        delay(1);
        P0 = 0xff;
        P2 = 0xfe;
        P0 = leddata[qian];
        delay(1);
}


bai = num % 1000 / 100;

眼力够好的,看来仔细看了,但是这样他的千位应该可以显示啊!

极有可能是百位、千位位选引脚虚焊。

bai = num % 10 / 100;不对外还要看位选信号对不对

一看这个电路图这么熟悉,和我淘宝买的单片机的商家带的图一样! qx-mini51

就是QX

P2就是位选

bai = num % 1000 / 100;和bai = num / 10 / 100;从数学角度来讲,结果是相同的,为什么显示结果却不同呢?

是可以显示的,只是,我总是没等到千位出现,就复位了,谢谢

不好意思,我没等得及千位出现,就复位了,在条件是对的的情况下,你的答案也是对的

嗯,我以后会注意,谢谢

谢谢大家的分享。

比如num等于1234,前一种方法算得2,后一种方法算得1,从数学角度也是错的。
另外由于51单片机中%求余需要耗费很多指令周期,你的shu还是定义为short比较合适,包括display函数的形参也定义为short,这样子只要计算16位,定义为int要计算32位。

我有一个疑问,就是51中四周期指令只有乘、除两条指令,为什么说%需要很多指令周期呢?

%的运算是用加减乘除组合实现的。

你不能这样理解,数学角度是可以带小数点的;而这里是取整

你不能这样理解,数学角度是可以带小数点的;而这里是取整

好的,谢谢,在书上都没有找到具体的答案,谢谢了

是的,没错,两边都得是整数

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top