| 错误现象: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());
 }
 }
 |