找回密码
 立即注册
查看: 240|回复: 3

高效的uint转bcd子程序,把uint转成0000-65535.

[复制链接]
  • TA的每日心情
    开心
    15 小时前
  • 签到天数: 135 天

    [LV.7]常住居民III

    4

    主题

    68

    回帖

    522

    积分

    高级会员

    积分
    522
    发表于 2023-12-14 15:40:24 | 显示全部楼层 |阅读模式

    分享一些好用的代码,挣点积分。
    这个方法比用除法取模快很多。
    1. void bin2bcd(unsigned int x,unsigned char *dst)
    2. //整数转BCD码子程序,分离各个数字位
    3. //参数1:要转换的整数,类型是unsigned int
    4. //参数2:转换得到的结果要存到的地方(数组)
    5. //输入参数:需要转换的整数,保存结果的数组
    6. {
    7.   unsigned char i,j,k;
    8.   k = x;
    9.   x = x >> 2;
    10.   i = x >> 8;
    11.   j = (i + i + i) << 1;
    12.   if (i > 41)
    13.     {
    14.         i++;
    15.         j+=6;
    16.         }
    17.   j = j + x;
    18.   if ((unsigned char)x > j )
    19.     {
    20.         i++;
    21.         j+=6;
    22.         }
    23.   if (j > 249)
    24.     {
    25.         i++;
    26.         j+=6;
    27.         }
    28.   dst[0] = i / 10;//分离得到的万(10000)位
    29.   dst[1] = B;//分离得到的千(1000)位
    30.   dst[2] = j / 25;//分离得到的百(100)位
    31.   dst[3] = (B<<2 | k&3) / 10;//分离得到的十(10)位
    32.   dst[4] = B;//分离得到的个(1)位
    33. }
    复制代码


    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    15 小时前
  • 签到天数: 135 天

    [LV.7]常住居民III

    4

    主题

    68

    回帖

    522

    积分

    高级会员

    积分
    522
     楼主| 发表于 2023-12-14 15:59:54 | 显示全部楼层
    编译完只占用这点资源
    Program Size: data=16.0 xdata=0 code=204
    转换一次仅花费159个指令周期。

    1. #include <reg52.h>
    2. void bin2bcd(unsigned int x,unsigned char *dst)
    3. //整数转BCD码子程序,分离各个数字位
    4. //参数1:要转换的整数,类型是unsigned int
    5. //参数2:转换得到的结果要存到的地方(数组)
    6. //输入参数:需要转换的整数,保存结果的数组
    7. {
    8.   unsigned char i,j,k;
    9.   k = x;
    10.   x = x >> 2;
    11.   i = x >> 8;
    12.   j = (i + i + i) << 1;
    13.   if (i > 41)
    14.     {
    15.         i++;
    16.         j+=6;
    17.         }
    18.   j = j + x;
    19.   if ((unsigned char)x > j )
    20.     {
    21.         i++;
    22.         j+=6;
    23.         }
    24.   if (j > 249)
    25.     {
    26.         i++;
    27.         j+=6;
    28.         }
    29.   dst[0] = i / 10;//分离得到的万(10000)位
    30.   dst[1] = B;//分离得到的千(1000)位
    31.   dst[2] = j / 25;//分离得到的百(100)位
    32.   dst[3] = (B<<2 | k&3) / 10;//分离得到的十(10)位
    33.   dst[4] = B;//分离得到的个(1)位
    34. }
    35. void main()
    36. {
    37.         unsigned char bcd_digit[5];
    38.         unsigned int x;
    39.         x=54215;
    40.         bin2bcd(x,bcd_digit);
    41.         while(1)
    42.         {
    43.                 ;
    44.         }
    45. }
    复制代码
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 03:54
  • 签到天数: 171 天

    [LV.7]常住居民III

    39

    主题

    911

    回帖

    4374

    积分

    荣誉版主

    积分
    4374
    发表于 2023-12-14 19:18:49 | 显示全部楼层
    这个代码思路确实新颖不错, 我改写的 51 可重入 printf 打印函数,  int 类型输出, 原型就是用这个代码, 改写的
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 03:54
  • 签到天数: 171 天

    [LV.7]常住居民III

    39

    主题

    911

    回帖

    4374

    积分

    荣誉版主

    积分
    4374
    发表于 2023-12-14 19:19:24 | 显示全部楼层
    1. $NOMOD51
    2. NAME        INTASCPUSH
    3. SP                DATA        081H
    4. DPL                DATA        082H
    5. DPH                DATA        083H
    6. ACC                DATA        0E0H
    7. B                DATA        0F0H
    8. PSW                DATA        0D0H
    9. F0                BIT        0D0H.5
    10. ?PR?_INTASCPUSH?INTASCPUSH               SEGMENT CODE
    11.         PUBLIC        _IntAscPush
    12. ;
    13. ; char IntAscPush(unsigned int x)
    14.         RSEG  ?PR?_INTASCPUSH?INTASCPUSH
    15. _IntAscPush:
    16. ; {                                        in         x;     // x(R6,R7)
    17. ;     unsigned char i,j,len;        // i(R6), j(R5), len(R4)
    18. ;     unsigned char data *p;        // p(R1)
    19. ;                                     out;                // R1(SP缓冲区首址),len(R7)
    20. ;
    21.                         POP                DPH
    22.                         MOV          R1,SP
    23.                         POP                DPL
    24. ;         j = (x>>8<<6 | (unsigned char)x>>2); // j(R5)
    25.                         MOV          A,R6
    26.                         SWAP         A
    27.                         RLC          A
    28.                         RLC          A
    29.                         ANL          A,#0C0H
    30.                         MOV          R5,A
    31.                         MOV          A,R7
    32.                         RRC          A
    33.                         RRC          A
    34.                         ANL          A,#03FH
    35.                         ORL          A,R5
    36.                         MOV          R5,A
    37. ;     i = x>>10;                          // i(R6),   i = (b15,b14,b13,b12,b11,b10)>>10
    38.                         MOV          A,R6
    39.                         RRC          A
    40.                         RRC          A
    41.                         ANL          A,#03FH
    42.                         MOV          R6,A
    43. ;     if (i > 41)        i++;       
    44.                         SETB         C
    45.                         SUBB         A,#41
    46.                         JC           $+3
    47.                         INC          R6
    48. ;     j += (i+i+i)*2;                 // j(R5),     j = i*6 + ((b9,b8,b7,b6,b5,b4,b3,b2)>>2)
    49.                         MOV          A,R6
    50.                         ADD          A,R6
    51.                         ADD          A,R6
    52.                         ADD          A,ACC
    53.                         ADD          A,R5
    54.                         MOV          R5,A
    55. ;     if (CY == 1) {i++; j += 6;}
    56.                         JNC          $+6
    57.                         INC          R6
    58.                         ADD          A,#6
    59.                         MOV          R5,A
    60. ;     if (j > 249) {i++; j += 6;}
    61.                         MOV          A,R5
    62.                         SETB         C
    63.                         SUBB         A,#249
    64.                         JC           $+7
    65.                         INC          R6
    66.                         MOV          A,#6
    67.                         ADD          A,R5
    68.                         MOV          R5,A
    69. ;         len=0,                          // len(R4)
    70.                         MOV          R4,#0
    71.                         MOV          A,R6
    72.                         MOV          B,#10
    73.                         DIV          AB
    74.                         MOV          @R1,A
    75. ;     *p = i / 10;            //万位
    76. ;     if(*p!=0)                {p++; len++;}
    77.                         JZ           INTASCPUSH_1
    78.                         ADD         A,#'0'
    79.                         PUSH        ACC
    80.                         INC          R1
    81.                         INC          R4
    82. INTASCPUSH_1:
    83. ;     *p = B;                 //千位
    84.                         MOV          A,B
    85.                         MOV          @R1,A
    86. ;         if(len || (*p!=0))        { p++; len++;}
    87.                         ORL          A,R4
    88.                         JZ                INTASCPUSH_2
    89.                         MOV          A,@R1
    90.                         ADD         A,#'0'
    91.                         PUSH        ACC
    92.                         INC          R1
    93.                         INC          R4
    94. INTASCPUSH_2:
    95. ;     *p = j / 25;            //百位
    96.                         MOV          A,R5
    97.                         MOV          B,#25
    98.                         DIV          AB
    99.                         MOV          @R1,A
    100. ;         if(len || (*p!='0'))        { p++; len++;}
    101.                         JZ                INTASCPUSH_3
    102.                         MOV          A,@R1
    103.                         ADD         A,#'0'
    104.                         PUSH        ACC
    105.                         INC          R1
    106.                         INC          R4
    107. INTASCPUSH_3:
    108. ;     *p = (B*4 | (unsigned char)x%4) / 10;  //十位
    109.                         MOV          A,R7
    110.                         ANL          A,#03H
    111.                         MOV          R7,A                    
    112.                         MOV          A,B
    113.                         ADD          A,ACC
    114.                         ADD          A,ACC
    115.                         ORL          A,R7
    116.                         MOV          B,#10
    117.                         DIV          AB
    118.                         MOV          @R1,A
    119. ;         if(len || (*p!='0'))        { p++; len++;}
    120.                         JZ                INTASCPUSH_4
    121.                         MOV          A,@R1
    122.                         ADD         A,#'0'
    123.                         PUSH        ACC
    124.                         INC          R1
    125.                         INC          R4
    126. INTASCPUSH_4:
    127. ;     *p = B;                 //个位
    128.                         MOV          A,B
    129.                         ADD         A,#'0'
    130.                         PUSH        ACC
    131. ;     p++; len++;
    132.                         INC          R1
    133.                         INC          R4
    134.                         CLR                A
    135.                         PUSH        ACC
    136. ;         return len;
    137.                         MOV          A,R1
    138.                         CLR                C
    139.                         SUBB          A,R4
    140.                         MOV          R1,A
    141.                         MOV          A,R4
    142.                         MOV          R7,A
    143. ; }
    144.                         PUSH        DPL
    145.                         PUSH        DPH
    146.                         RET         
    147. ; END OF _IntAscPush
    148.                         END
    复制代码


    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-6-14 16:12 , Processed in 0.060782 second(s), 40 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表