错误现象:0上正常 0下无法显示。。
如果将程序中的0下标志位去掉 则程序正常 加上 则过几秒 数码管显示乱码
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds=P2^2;
sbit dula=P2^6;
sbit wela=P2^7;
float f_temp;
uint temp;
bit flag=0;
unsigned char code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,
0xbf,0xb6,0xdb,0xcf,0xe6,0xed,
0xfd,0x87,0xff,0xef
};
void display(uchar num,uchar dat);
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void Delayus(uint x)
{
while(--x);
}
void dsrest()
{
ds = 1;
Delayus(8);
ds= 0;
Delayus(90);
ds = 1;
Delayus(8);
ds = 1;
}
uchar tempreadbit()
{
uchar i,dat=0;
ds = 1;
_nop_();
for(i=0;i<8;i++)
{
ds = 0;
dat >>= 1;
ds = 1;
_nop_();
_nop_();
if(ds)
dat |= 0X80;
Delayus(30);
ds = 1;
}
return dat;
}
void tempwritebyte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
ds = 0;
ds = dat& 0x01;
Delayus(5);
ds = 1;
dat >>= 1;
}
}
void tempchange()
{
dsrest();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0x44);
}
uint gettemp()
{
uchar a,b;
dsrest();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempreadbit();
b=tempreadbit();
if(a&0xf8==0xf8)
{
flag=1;
}
else
{
flag=0;
}
temp=b;
temp<<=8;
temp=temp|a;
if(flag==1)
{
temp=~temp+1;
f_temp=temp*0.0625;
temp=f_temp*10+0.5;
display(0,0x40);
}
else
{
f_temp=temp*0.0625;
temp=f_temp*10+0.5;
}
return temp;
}
void display(uchar num,uchar dat)
{
uchar i;
dula=0;
P0=table[dat];
dula=1;
dula=0;
wela=0;
i=0xff;
i=i&(~((0x01)<<(num)));
P0=i;
wela=1;
wela=0;
delay(5);
}
void distemp(uint t)
{
uchar i;
i=t/100;
display(1,i);
i=t%100/10;
display(2,i+10);
i=t%10;
display(3,i);
}
void main()
{
while(1)
{
tempchange();
distemp(gettemp());
}
} |