利用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);
}
![](../imgqa/ele/mcu/mcu-3721rd.com-15413lszsdesk54f.png)
#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);
}
![](../imgqa/ele/mcu/mcu-3721rd.com-15413lszsdesk54f.png)
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中四周期指令只有乘、除两条指令,为什么说%需要很多指令周期呢?
%的运算是用加减乘除组合实现的。
你不能这样理解,数学角度是可以带小数点的;而这里是取整
你不能这样理解,数学角度是可以带小数点的;而这里是取整
好的,谢谢,在书上都没有找到具体的答案,谢谢了
是的,没错,两边都得是整数