C语言求助,这个函数能有简单点的写法吗?想蒙住了. 求指点.

2020-02-02 09:19发布

目的是用在单片机数码管显示,高位清零,本来的代码能用,但是一个数如果是980,转换后是00000980,就想把高位是零的消掉.这是很笨的办法.所以请教高手能否简化写法.
uint32 定义为 无符号32位整数.


void BCDDataConversion(uint32 Bign)
{


    if (0<=Bign<10){//
    ledcache[7]= leddatacl[Bign%10];   
    ledcache[6]= 0x00;
    ledcache[5]= 0x00;
    ledcache[4]= 0x00;
    ledcache[3]= 0x00;
    ledcache[2]= 0x00;
    ledcache[1]= 0x00;
    ledcache[0]= 0x00;
    }
    else if (10<=Bign<100){
    ledcache[7]= leddatacl[Bign%10];   
    ledcache[6]= leddatacl[Bign/10%10];
    ledcache[5]= 0x00;
    ledcache[4]= 0x00;
    ledcache[3]= 0x00;
    ledcache[2]= 0x00;
    ledcache[1]= 0x00;
    ledcache[0]= 0x00;
    } else if (100<=Bign<1000){
    ledcache[7]= leddatacl[Bign%10];   
    ledcache[6]= leddatacl[Bign/10%10];
    ledcache[5]= leddatacl[Bign/100%10];
    ledcache[4]= 0x00;
    ledcache[3]= 0x00;
    ledcache[2]= 0x00;
    ledcache[1]= 0x00;
    ledcache[0]= 0x00;
    }else if (1000<=Bign<10000){
    ledcache[7]= leddatacl[Bign%10];        
    ledcache[6]= leddatacl[Bign/10%10];
    ledcache[5]= leddatacl[Bign/100%10];
    ledcache[4]= leddatacl[Bign/1000%10];
    ledcache[3]= 0x00;
    ledcache[2]= 0x00;
    ledcache[1]= 0x00;
    ledcache[0]= 0x00;
    }else if (10000<=Bign<100000){
    ledcache[7]= leddatacl[Bign%10];        
    ledcache[6]= leddatacl[Bign/10%10];
    ledcache[5]= leddatacl[Bign/100%10];
    ledcache[4]= leddatacl[Bign/1000%10];
    ledcache[3]= leddatacl[Bign/10000%10];
    ledcache[2]= 0x00;
    ledcache[1]= 0x00;
    ledcache[0]= 0x00;
    }else if (100000<=Bign<1000000){
    ledcache[7]= leddatacl[Bign%10];   
    ledcache[6]= leddatacl[Bign/10%10];
    ledcache[5]= leddatacl[Bign/100%10];
    ledcache[4]= leddatacl[Bign/1000%10];
    ledcache[3]= leddatacl[Bign/10000%10];
    ledcache[2]= leddatacl[Bign/100000%10];
    ledcache[1]= 0x00;
    ledcache[0]= 0x00;
    }else if (1000000<=Bign<10000000){
    ledcache[7]= leddatacl[Bign%10];   
    ledcache[6]= leddatacl[Bign/10%10];
    ledcache[5]= leddatacl[Bign/100%10];
    ledcache[4]= leddatacl[Bign/1000%10];
    ledcache[3]= leddatacl[Bign/10000%10];
    ledcache[2]= leddatacl[Bign/100000%10];
    ledcache[1]= leddatacl[Bign/1000000%10];
    ledcache[0]= leddatacl[Bign/10000000%10];
    ledcache[0]= 0x00;
    }else if (10000000<=Bign<100000000){
    ledcache[7]= leddatacl[Bign%10];        
    ledcache[6]= leddatacl[Bign/10%10];
    ledcache[5]= leddatacl[Bign/100%10];
    ledcache[4]= leddatacl[Bign/1000%10];
    ledcache[3]= leddatacl[Bign/10000%10];
    ledcache[2]= leddatacl[Bign/100000%10];
    ledcache[1]= leddatacl[Bign/1000000%10];
    ledcache[0]= leddatacl[Bign/10000000%10];
    }   
    else Bign=0;
}


这个函数能有简单点的写法吗?想蒙住了.  求指点.
补上开发板图片
IMG_20121107_004248_0.jpg (740.3 KB, 下载次数: 0) 下载附件 2012-11-7 00:50 上传
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
28条回答
ijlc1314
1楼-- · 2020-02-02 11:26
用一个for或是while循环求出这个数有多少位,同时可以求出这个数的每一位,然后就可以实现了,个人看法
nihao_x
2楼-- · 2020-02-02 13:26
 精彩回答 2  元偷偷看……
eduhf_123
3楼-- · 2020-02-02 15:24
本帖最后由 eduhf_123 于 2012-11-7 01:47 编辑

LZ你是要代码写起来简单?还是要运行时简单?

1、如果要求写起来简单,可以使用sprintf库函数配合格式控制字符。
2、如果要求运行时简单,可以这样:
  1. void BCDDataConversion(uint32 Bign)
  2. {
  3.         unsigned char i = 6;                                //只填充前7个字符位置,因为第8个位置上至少要显示一个“0”,不需要进行预填充
  4.         do
  5.         {
  6.                 ledcache[i] = leddatacl[_BLANK_];           //这里表示“空白”字符,即消隐控制码
  7.         }while(i--);
  8.        
  9.         i = 7;
  10.         do
  11.         {
  12.                 ledcache[i] = leddatacl[Bign%10];
  13.                 Bign /= 10;
  14.         }while(Bign && i--);                                //防止传入的参数超过99,999,999而造成内存访问越界
  15. }
复制代码3、如果要两者的折中,那么可以在保证传入的参数不大于99,999,999的前提下使用itoa,然后用strlen得到长度,再用一个循环把字符串进行右对齐。
nihao_x
4楼-- · 2020-02-02 21:05
eduhf_123 发表于 2012-11-7 01:41
LZ你是要代码写起来简单?还是要运行时简单?

1、如果要求写起来简单,可以使用sprintf库函数配合格式控制 ...

谢谢,  你的代码思想不错.
amazing030
5楼-- · 2020-02-02 21:22

u32tostr.jpg (89.35 KB, 下载次数: 0)

下载附件

2012-11-7 11:29 上传


如果不是ASCII码的话就不要加0x30
BXAK
6楼-- · 2020-02-02 21:42
void cccc(uint32 Bign)
{
        unsigned char i,b0,dat;
        
        b0 = 0;
        for (i=7; i; )
        {
                i--;
                dat = Bign%10;
                Bign /= 10;
                if (dat || (i==0))  b0=1;                   //有效数开始标志
                if (b0) ledcache[i] = leddatacl[dat];
                else    ledcache[i] = 0xFF;                //有效数之前的 0 消隐
        }                        
}

一周热门 更多>