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

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

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:387
  • 最近打卡:2025-05-02 10:19:07
已绑定手机

8

主题

137

回帖

1049

积分

金牌会员

积分
1049
发表于 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. }
复制代码


回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:387
  • 最近打卡:2025-05-02 10:19:07
已绑定手机

8

主题

137

回帖

1049

积分

金牌会员

积分
1049
发表于 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. }
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 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, 2025-5-3 22:18 , Processed in 0.210404 second(s), 66 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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