登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

16进制到10进制,10进制到16进制转换

作者:兰天白云 栏目:单片机
16进制到10进制,10进制到16进制转换
以下程序经过测试,可直接使用

//-----------------------------------------
//*把2字节16进制数转化成4位压缩10进制数
//16进制数在x中,10进制数也在x中,当
//转化成的10进制数大于9999时,置为9999*/
unsigned int hex2bcd5(unsigned int x)
{
if(x<0x270f)
x=(((x/1000)%10)<<12)+(((x/100)%10)<<8)+(((x/10)%10)<<4)+(x%10);
else
x=0x9999;
return(x);
}
//-------------------------------------------------
//*把0-9999范围的十进制数转化成2字节的十六进制数*/
unsigned int bcd4hex2(unsigned int x)
{
if(x>0x9999)
{x=0x9999;}
else     
x=(x>>12)*1000+((x>>8)&0x000f)*100+((x>>4)&0x000f)*10+(x&0x000f);
return(x);
}

唯一不足的是编译后太占空间
大家看一看,太大了
206:               //-----------------------------------------
207:               //*把2字节16进制数转化成4位压缩10进制数
208:               //16进制数在x中,10进制数也在x中,当
209:               //转化成的10进制数大于9999时,置为9999*/
210:               unsigned int hex2bcd5(unsigned int x)
211:               {
212:                if(x<0x270f)
   384    3027     MOVLW 0x27
   385    1283     BCF 0x3, 0x5
   386    0241     SUBWF 0x41, W
   387    300F     MOVLW 0xf
   388    1903     BTFSC 0x3, 0x2
   389    0240     SUBWF 0x40, W
   38A    1803     BTFSC 0x3, 0
   38B    2C0D     GOTO 0x40d
213:                x=(((x/1000)%10)<<12)+(((x/100)%10)<<8)+(((x/10)%10)<<4)+(x%10);
   38C    30E8     MOVLW 0xe8
   38D    00DA     MOVWF 0x5a
   38E    3003     MOVLW 0x3
   38F    00DB     MOVWF 0x5b
   390    0841     MOVF 0x41, W
   391    00D9     MOVWF 0x59
   392    0840     MOVF 0x40, W
   393    00D8     MOVWF 0x58
   394    118A     BCF 0xa, 0x3
   395    273A     CALL 0x73a
   396    085C     MOVF 0x5c, W
   397    00D8     MOVWF 0x58
   398    085D     MOVF 0x5d, W
   399    00D9     MOVWF 0x59
   39A    300A     MOVLW 0xa
   39B    00DA     MOVWF 0x5a
   39C    3000     MOVLW 0
   39D    01DB     CLRF 0x5b
   39E    118A     BCF 0xa, 0x3
   39F    273A     CALL 0x73a
   3A0    0ED8     SWAPF 0x58, F
   3A1    0ED9     SWAPF 0x59, F
   3A2    30F0     MOVLW 0xf0
   3A3    05D9     ANDWF 0x59, F
   3A4    0858     MOVF 0x58, W
   3A5    390F     ANDLW 0xf
   3A6    04D9     IORWF 0x59, F
   3A7    30F0     MOVLW 0xf0
   3A8    05D8     ANDWF 0x58, F
   3A9    0858     MOVF 0x58, W
   3AA    00C2     MOVWF 0x42
   3AB    0859     MOVF 0x59, W
   3AC    00C3     MOVWF 0x43
   3AD    3064     MOVLW 0x64
   3AE    00DA     MOVWF 0x5a
   3AF    01DB     CLRF 0x5b
   3B0    0841     MOVF 0x41, W
   3B1    00D9     MOVWF 0x59
   3B2    0840     MOVF 0x40, W
   3B3    00D8     MOVWF 0x58
   3B4    118A     BCF 0xa, 0x3
   3B5    273A     CALL 0x73a
   3B6    085C     MOVF 0x5c, W
   3B7    00D8     MOVWF 0x58
   3B8    085D     MOVF 0x5d, W
   3B9    00D9     MOVWF 0x59
   3BA    300A     MOVLW 0xa
   3BB    00DA     MOVWF 0x5a
   3BC    3000     MOVLW 0
   3BD    01DB     CLRF 0x5b
   3BE    118A     BCF 0xa, 0x3
   3BF    273A     CALL 0x73a
   3C0    0842     MOVF 0x42, W
   3C1    07D8     ADDWF 0x58, F
   3C2    1803     BTFSC 0x3, 0
   3C3    0AD9     INCF 0x59, F
   3C4    0843&n
2楼: >>参与讨论
兰天白云
这么长的代码你们也能忍受?
 
3楼: >>参与讨论
hotpower
这2个程序试试(我没调试)
unsigned int hex2bcd5(unsigned int x)
{
unsigned int val = 0, TEMP;
  if (x > 9999) val = 0x9999;
  else {
    do {
      val >>= 4;
      TEMP = x % 10;
      val += TEMP << 12;
      x /= 10;
    }
    while(x != 0);
  }
  return val;  
}

unsigned int bcd4hex2(unsigned int x)
{
unsigned int val = 0;
unsigned int TEMP = 1;
  if (x > 0x9999) val = 0x9999;
  else {
    do {
      val += (x & 0x0f) * TEMP;
      TEMP *= 10;
      x >>= 4;
    }
    while (x != 0);
  }
  return val;  
}


4楼: >>参与讨论
netjackycn
16位二进制数(FFFF)到5位十进制数(65535)子程序
;*******************************************************************;
;    16位二进制数(FFFF)到5位十进制数(65535)子程序
;
;入口条件: 输入16位二进制数字,存放在 H_byte 和 L_byte
;
;出口条件: 输出5位十进制数,存放在R0,R1,R2 = 06,55,35
;
;*******************************************************************;
HEX2BCD
    bcf    STATUS,0    ;清除进位标志位
    movlw    .16        ;十进制的16
    movwf    count
    clrf    R0
    clrf    R1
    clrf    R2
loop16
    rlf    L_byte
    rlf    H_byte
    rlf    R2
    rlf    R1
    rlf    R0

    decfsz    count
    goto    adjDEC
    RETLW    0

adjDEC
    movlw    R2
    movwf    FSR
    call    adjBCD

    movlw    R1
    movwf    FSR
    call    adjBCD

    movlw    R0
    movwf    FSR
    call    adjBCD

    goto    loop16

adjBCD
    movlw    03H
    addwf    0,W        ;0:表示地址为0,即FSR单元所包含的地址
    movwf    TEMP
    btfsc    TEMP,3        ; 测试结果 > 7
    movwf    0        ; 保存到 MSD

    movlw    30H
    addwf    0,W
    movwf    TEMP
    btfsc    TEMP,7        ; 测试结果 > 7
    movwf    0        ; 保存到 MSD
    RETLW    0



5楼: >>参与讨论
兰天白云
先谢了
我试试

6楼: >>参与讨论
bolofeng
晕死,这么长的代码也敢用???俺也贴一个
经过验证,转汇编40行左右,速度也还可以。
bcd 到 bin 的自己想吧。
汇编的书上到处都是!
void Bin2Bcd5(unsigned int bin, unsigned CHAR *bcd)
{
    static const unsigned powTenTbl[] = {10000.html">10000,1000,100,10,1};

    unsigned int    powTen;
    unsigned CHAR     digit;
    unsigned CHAR     i;

    for (i = 0; i < 5; i++)
    {
        digit = 0;
        powTen = powTenTbl[i];

        while (bin >= powTen)
        {
            bin -= powTen;
            digit++;
        }

        *bcd++ = digit;
    }
}


参与讨论
昵称:
讨论内容:
 
 
相关帖子
PIC下载线
逻辑运算符&&,||与位运算符&,|的异同?发现一个惊人的相同点
请问版主及各位关于PIC的A/D转换时的滑动窗口滤波问题????
TO:fzj大侠,向你请教PWM的问题
请问一下,PIC16F77能否直接替换PIC16F877或PIC16F877A
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号