|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
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楼: | >>参与讨论 |
作者: 兰天白云 于 2005/7/29 19:41:00 发布:
这么长的代码你们也能忍受? |
3楼: | >>参与讨论 |
作者: hotpower 于 2005/7/29 23:19:00 发布:
这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 于 2005/7/30 3:57:00 发布:
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楼: | >>参与讨论 |
作者: 兰天白云 于 2005/7/30 9:33:00 发布:
先谢了 我试试 |
6楼: | >>参与讨论 |
作者: bolofeng 于 2005/7/30 13:38:00 发布:
晕死,这么长的代码也敢用???俺也贴一个 经过验证,转汇编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; } } |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |