怎么实现数码管显示0.0-999.9,整数时不显示小数点,比如3.0显示为3

我现在能实现0.1-9999,小数点部分应该怎么改


#include
#define uint unsigned int
#define uchar unsigned char
uchar a[]={0x05,0x7d,0x46,0x54,0x3c,0x94,0x84,0x5d,0x04,0x14};//
uchar b[]={0xf7,0xef,0xdf,0xbf};
uchar c[]={0x01,0x79,0x42,0x50,0x38,0x90,0x80,0x59,0x00,0x10};//


uint time=0;
uint i,j,w,a1,a2,a3,a4;
void delayms(uint xms);
void display();
void display1();
void math(uint w);

void Timer0Init(void);

void main()
{
    TMOD=0x01;
    TH0=(65536-45872)/256;
    TL0=(65536-45872)%256;
    EA=1;
    ET0=1;
    TR0=1;
    
    for(j=0;j<=9;)//小数循环
    {
        math(j);
        display1();
        //delayms(2);
        P0=0xff;
    }
    TMOD=0x01;
    TH0=(65536-45872)/256;
    TL0=(65536-45872)%256;
    EA=1;
    ET0=1;
    TR0=1;
    for(i=1;i<=9999;)//整数循环
    {
        math(i);
        display();
        //delayms(2);
    }
}
void T0_time() interrupt 1
{
    TH0=(65536-45872)/256;//50ms
    TL0=(65536-45872)%256;
    time++;//小数
    if(time==20)
    {
        j++;
        time=0;
    }
    i++;//整数
}


void delayms(uint xms)
{
    uint i,j;
    for(i=xms;i>0;i--)
        for(j=110;j>0;j--);
}
void math(uint w)
{
    if(w>1)
    {
        a1=w/1000;//千位
        a2=w%1000/100;//百位
        a3=w%100/10;//十位
        a4=w%10;//个位
    }
}
void display1()
{
                  P2=b[2];
              P0=c[0];
              delayms(2);
              P0=0xff;
          P2=b[3];
            P0=a[j];
            delayms(2);
            P0=0xff;
}
void display()
{
    
    if(a1>0)
    {
        
        P2=b[0];
        P0=a[a1];
        delayms(2);
        P0=0xff;
        
        P2=b[1];
        P0=a[a2];
        delayms(2);
        P0=0xff;
        
        P2=b[2];
        P0=a[a3];
        delayms(2);
        P0=0xff;
        
        P2=b[3];
        P0=a[a4];
        delayms(2);
        P0=0xff;
        
    }
    else 
    {
        if(a2>0)
        {
            P2=b[1];
        P0=a[a2];
        delayms(2);
        P0=0xff;
            
            P2=b[2];
        P0=a[a3];
        delayms(2);
        P0=0xff;
            
            P2=b[3];
        P0=a[a4];
        delayms(2);
        P0=0xff;
            
        }
        else
        {
            if(a3>0)
            {
                P2=b[2];
        P0=a[a3];
        delayms(2);
        P0=0xff;
                
                P2=b[3];
        P0=a[a4];
        delayms(2);
        P0=0xff;
            
        }
            else
            {
            P2=b[3];
         P0=a[a4];
         delayms(2);
         P0=0xff;
            }
        }
    }
}

1.将所有的数字(0-9、0.-9.)的段码使用一个数组保存起来;
2.将要显示的数值乘以10倍;
3.对放大倍数后的值每一位求余数;
4.显示每一位,注意这个时候的小数点是固定在倒数第二位的,这个时候倒数第二位的段码需要往后移动合适的值;
例如:

//保存8位数码管每一位需要显示的值
unsigned char segbuff[] ={10,10,10,10,10,10,10,10};
//保存数码管需要用到的所有段码的值
unsigned char segtab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,
0xc0&0x7f,0xf9&0x7f,0xa4&0x7f,0xb0&0x7f,0x99&0x7f,0x92&0x7f,0x82&0x7f,0xf8&0x7f,0x80&0x7f,0x90&0x7f,0xbf,0xff};
void segs();

int main(void)
{
  unsigned int i=0;
  //显示数值
  for(i=0;i<65535;i++)
  {
      i *= 10;
    segbuff[0] = i/10000;//显示千分位                 //或者此处使用11就可熄灭数码管的值
    segbuff[1] = i%10000/1000;//显示百分位            //或者此处使用11就可熄灭数码管的值
    segbuff[2] = i%10000%1000/100;//显示十分位        //或者此处使用11就可熄灭数码管的值
    segbuff[3] = i%10000%1000%100+12;//显示个位
    segbuff[4] = 10;//显示小数位
    segs();
    //合适的延时
  }  
}


void segs(){
    static unsigned char segaddr = 0;
    //消影
    P2 = P2&0x1f|0xe0;P0 = 0xff;P2 = P2&0x1f;
    //位选
    P2 = P2&0x1f|0xc0;P0 = 1<<segaddr;P2 = P2&0x1f;
    //段选
    P2 = P2&0x1f|0xe0;P0 = segtab[segbuff[segaddr]];P2 = P2&0x1f;
      if(++segaddr == 8) segaddr = 0;
}



你计数的实际上是0.1的倍数,所以如果计数是10的整数倍,就不显示小数点,且去掉最后的0就是了
不过你这个程序其实问题很多
1,unsigned int i=0;
//显示数值
for(i=0;i<65535;i++)
{
i *= 10;

i的类型是unsigned int,最大就是65535,乘以10的话,后面的数就肯定超范围了,而且我真没看懂为啥要乘以10
2,扫描显示函数也有问题。数据变一次就刷新一个位,这样的话,变化的位可能根本不能被立刻刷新。