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条回答
millwood0
1楼-- · 2020-02-03 20:16
2、如果要求运行时简单,可以这样:


You can simplify it further by combining the two loops into one:
  1.     void BCDDataConversion(uint32 Bign)
  2.     {
  3.             unsigned char i = 8;                                //只填充前7个字符位置,因为第8个位置上至少要显示一个“0”,不需要进行预填充

  4.             do
  5.             {
  6.                     i = i-1;
  7.                     if(Bign) ledcache[i] = leddatacl[Bign%10];
  8.                     else ledcache[i] = leddatacl[_BLANK_];           //这里表示“空白”字符,即消隐控制码
  9.                     Bign /= 10;
  10.             }while(i);                                //防止传入的参数超过99,999,999而造成内存访问越界
  11.     }
复制代码
eduhf_123
2楼-- · 2020-02-03 23:33
millwood0 发表于 2012-11-9 02:37
You can simplify it further by combining the two loops into one:


您的代码在参数Bign值为0时无法正常工作——本应该显示“       0”而您的代码将显示“        ”。

基于运行时效率/Cache/流水线/编译器优化等因素,我个人习惯于不在短小的循环中使用分支。

空闲时想过这段代码的进一步优化:
  1. void BCDDataConversion(uint32 Bign)
  2. {
  3.         unsigned char i;

  4.         //从右端开始填充每个数位上的数值
  5.         i = 8;
  6.         do
  7.         {
  8.                 ledcache[--i] = leddatacl[Bign%10];
  9.                 Bign /= 10;
  10.         }while(Bign && i);

  11.         //如果有必要,继续填充左边的“空白”
  12.         while(i)
  13.         {
  14.                 ledcache[--i] = leddatacl[_BLANK_];           //这里表示“空白”字符,即消隐控制码
  15.         };
  16. }
复制代码
eduhf_123
3楼-- · 2020-02-03 23:47
millwood0 发表于 2012-11-9 02:37
You can simplify it further by combining the two loops into one:

不管怎么说,您有兴趣改良我随手写下的代码,我是深感荣幸的!
millwood0
4楼-- · 2020-02-04 00:19
That's easy to solve:
  1. void BCDDataConversion(uint32 Bign)
  2.     {
  3.             unsigned char i = 7;                                //只填充前7个字符位置,因为第8个位置上至少要显示一个“0”,不需要进行预填充

  4.             ledcache[i] = leddatacl[Bign%10];
  5.             Bign / = 10;
  6.             do
  7.             {
  8.                     i = i-1;
  9.                     if(Bign) ledcache[i] = leddatacl[Bign%10];
  10.                     else ledcache[i] = leddatacl[_BLANK_];           //这里表示“空白”字符,即消隐控制码
  11.                     Bign /= 10;
  12.             }while(i);                                //防止传入的参数超过99,999,999而造成内存访问越界
  13.     }
复制代码
eduhf_123
5楼-- · 2020-02-04 02:38
 精彩回答 2  元偷偷看……
xrydt
6楼-- · 2020-02-04 06:44
真的不错。感谢了。

一周热门 更多>