打印

征集优秀的BIN转BCD的C51程序

[复制链接]
6246|39
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ljm810010|  楼主 | 2008-11-20 22:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
ljm810010|  楼主 | 2008-11-20 23:20 | 只看该作者

我先来个不优秀的,各位继续

void BinToBCD(unsigned int Number) //Number <= 9999
{
  Dig[1] = Number % 10;
  Number /= 10;
  Dig[2] = Number % 10;
  Number /= 10;
  Dig[3] = Number % 10;
  Number /= 10;
  Dig[4] = Number;
}

使用特权

评论回复
板凳
wangkj| | 2008-11-21 08:34 | 只看该作者

% 运算量超大

加减移位速度快,代码量少。得从这方面考虑。

使用特权

评论回复
地板
wh6ic| | 2008-11-21 09:33 | 只看该作者

just try

1。16位除法开销大,改成8位除法
void BinToBCD(unsigned int Number) //Number <= 9999
{
 unsigned char dig0, dig1;
  dig0 = Number / 100;
  dig1 = Number % 100;
  Dig[0] = dig1 % 10;
  Dig[1] = dig1 / 10;
  Dig[2] = dig0 % 10;
  Dig[3] = dig0 / 10;
}

2。51的多字节除法开销比较大,试试乘法

3。加法和移位?推敲推敲。。。

4。咱是笨蛋?既然汇编好用,写个汇编的子函数给C51调用不就结了。非要写纯C的?OverShot!

使用特权

评论回复
5
winloop| | 2008-11-21 09:48 | 只看该作者

我的

BYTE DecimalToBCD(BYTE DEC_Byte)
{
    return (DEC_Byte/10)*16+DEC_Byte%10;
}

使用特权

评论回复
6
ljm810010|  楼主 | 2008-11-21 11:54 | 只看该作者

5楼,需要的是int类型不是char类型

使用特权

评论回复
7
ayb_ice| | 2008-11-21 21:33 | 只看该作者

直接用汇编写

C里调用即可

使用特权

评论回复
8
cheungman| | 2008-11-22 00:20 | 只看该作者

也来个不优秀的

void BinToBcd(BYTE *outPut,UINT inPut,BYTE count)
{
    while(count--)
    {
        *(outPut + count) = inPut % 10;
        inPut /= 10;
    }
}

BYTE buf[5];
UINT data = 12345;
BinToBcd(buf, data, 5);
buf[0] = 1;
buf[1] = 2;
buf[2] = 3;
buf[3] = 4;
buf[4] = 5;

使用特权

评论回复
9
耕在此行| | 2008-11-22 08:50 | 只看该作者

我的程序


void cal_dispcode( bin16 num )
    {
    bin08 i;
    for(i=0;i<4;i++)
        {
        word = num % 10;
        num /= 10;
        }
    }

使用特权

评论回复
10
ljm810010|  楼主 | 2008-11-22 09:10 | 只看该作者

目前4楼 wh6ic 的最快,只用两次16位除法.

8楼 cheungman 的要用10次16位除法(5位结果).
9楼 耕在此行  的要用8 次16位除法(4位结果).

51的MCU 做一次16位除法要一两百个时钟周期,要尽量避免16位的除法或求余.

使用特权

评论回复
11
耕在此行| | 2008-11-22 10:12 | 只看该作者

呵呵 没考虑速度

如果要代码与速率最优的话还是有汇编最好解决.
不过我到目前为止还是不知道KEIL C51里汇编怎么调用.
呵呵 惭愧了.上次不得已只好用C写了个接口程序.

使用特权

评论回复
12
mohanwei| | 2008-11-24 20:11 | 只看该作者

先用sprintf,实在不行再考虑其它办法吧……

sprintf和printf几乎完全一样,只是输出的目标不一样,大部分代码都是共用的。不管用多少,Flash大概占用1K,RAM大概占20多Byte(记不清了)。

用1次可能浪费了,用多次就值得考虑一下。

使用特权

评论回复
13
耕在此行| | 2008-11-24 20:42 | 只看该作者

试了下

4楼的程序不错,比我的只多了十几个字节空间,速度当然快多了.

使用特权

评论回复
14
wh6ic| | 2008-11-25 14:59 | 只看该作者

无聊, 写个汇编的吧

c的调用示范
void    BinToBCD(unsigned int address);
unsigned char Dig[4];

{
    P0 = DPTR / P1;   //可能不需要
    BinToBCD(3456);
}


汇编子函数
extrn    code (?C?UIDIV)
    ;库中的 16/16 的无符号整数除法 [r6r7]/[r4r5] = [r6r7]...[r4r5], 高字节在前!
extrn    data (Dig)
public    _BinToBCD    
;带参数汇编子函数名前须加下画线, 本子函数有bug, 必须小于10000!
my_code    segment    code
    rseg    my_code
_BinToBCD:
    mov    r4, #0x00    ;参数就在[r6r7]中, 太幸福了
    mov    r5, #0x64    ;除100嘛
    lcall    ?C?UIDIV    ;结果余数在[r4r5], 商在[r6r7]
    mov    a, r7
    mov    b, #0x0a
    div    ab
    mov    Dig + 3, a
    mov    Dig + 2, b    ;除10得千百位
    mov    a, r5
    mov    b, #0x0a
    div    ab
    mov    Dig + 1, a
    mov    Dig, b        ;除10得个十位, 搞定
    ret
end

使用特权

评论回复
15
ljm810010|  楼主 | 2008-11-25 16:39 | 只看该作者

楼上(打错成楼主了)真不错,这样效率就高多了。

请教,C与汇编混合,参数传递有什么规则吗?汇编中要用到的寄存器,不会破坏原来C程序的数据完整性吗?另外程序中这两句是什么意思?
my_code    segment    code
    rseg    my_code

使用特权

评论回复
16
xhtxzxw| | 2008-11-25 16:50 | 只看该作者

嘿嘿

不做任何乘法,不做任何除法的,效率不见得高.
unsigned int  Right[]={1000, 100, 10};
unsigned char BCDID[4];
void Int_2_BCD(unsigned int x)
{
    unsigned char i;

    if(x > 9999) return;    //按LZ要求, 超过9999的数就不管了,呵呵

    for(i=0; i<3; i++)      //i=0,1,2:分别处理千,百,十位
    {
        BCDID = 0;       //各位的BCD初始值清0
        while(x >= Right)//当x的值足够减去一千(百,十)时,你就
        {
            x -= Right;  //一千(百,十)一千(百,十)地减
            BCDID++;     //减去一千(百,十), 千(百,十)位值增1就是了
        }
    }
    BCDID[3] = x;             //个位简单了,最后剩下就是它
}
//显然,在极端状态下(当x=9999时),需要做27次整数量减法运算和27次字节量增1运算.

使用特权

评论回复
17
ljm810010|  楼主 | 2008-11-25 17:44 | 只看该作者

16楼方法不错

不知效率高不高?用C来编,可能速度不会太高.
我用汇编写了个,执行时间才不到100时钟周期.

使用特权

评论回复
18
xhtxzxw| | 2008-11-25 19:40 | 只看该作者

嘿嘿

回LS:效率很低,显然,嘿嘿

使用特权

评论回复
19
耕在此行| | 2008-11-25 19:56 | 只看该作者

ljm810010

呵呵 你怎么也会有我同样的问题啰?
     我C51这几个月才开始用,胡晓柏老师给推荐了一本书,
    《单片机的C语言应用程序设计(第4版)》里面有讲混合编程的.我打算去买一本.

使用特权

评论回复
20
耕在此行| | 2008-11-26 10:02 | 只看该作者

我想了一个好的算法

这几天有点忙 有空的话用汇编写上来,给大家评评.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

1195

帖子

0

粉丝