|
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
16進(jìn)制到10進(jìn)制,10進(jìn)制到16進(jìn)制轉(zhuǎn)換 |
作者:蘭天白云 欄目:單片機(jī) |
以下程序經(jīng)過測試,可直接使用 //----------------------------------------- //*把2字節(jié)16進(jìn)制數(shù)轉(zhuǎn)化成4位壓縮10進(jìn)制數(shù) //16進(jìn)制數(shù)在x中,10進(jìn)制數(shù)也在x中,當(dāng) //轉(zhuǎn)化成的10進(jìn)制數(shù)大于9999時(shí),置為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范圍的十進(jìn)制數(shù)轉(zhuǎn)化成2字節(jié)的十六進(jìn)制數(shù)*/ 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字節(jié)16進(jìn)制數(shù)轉(zhuǎn)化成4位壓縮10進(jìn)制數(shù) 208: //16進(jìn)制數(shù)在x中,10進(jìn)制數(shù)也在x中,當(dāng) 209: //轉(zhuǎn)化成的10進(jìn)制數(shù)大于9999時(shí),置為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 發(fā)布:
這么長的代碼你們也能忍受? |
3樓: | >>參與討論 |
作者: hotpower 于 2005/7/29 23:19:00 發(fā)布:
這2個(gè)程序試試(我沒調(diào)試) 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 發(fā)布:
16位二進(jìn)制數(shù)(FFFF)到5位十進(jìn)制數(shù)(65535)子程序 ;*******************************************************************; ; 16位二進(jìn)制數(shù)(FFFF)到5位十進(jìn)制數(shù)(65535)子程序 ; ;入口條件: 輸入16位二進(jìn)制數(shù)字,存放在 H_byte 和 L_byte ; ;出口條件: 輸出5位十進(jìn)制數(shù),存放在R0,R1,R2 = 06,55,35 ; ;*******************************************************************; HEX2BCD bcf STATUS,0 ;清除進(jìn)位標(biāo)志位 movlw .16 ;十進(jìn)制的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 ; 測試結(jié)果 > 7 movwf 0 ; 保存到 MSD movlw 30H addwf 0,W movwf TEMP btfsc TEMP,7 ; 測試結(jié)果 > 7 movwf 0 ; 保存到 MSD RETLW 0 |
5樓: | >>參與討論 |
作者: 蘭天白云 于 2005/7/30 9:33:00 發(fā)布:
先謝了 我試試 |
6樓: | >>參與討論 |
作者: bolofeng 于 2005/7/30 13:38:00 發(fā)布:
暈死,這么長的代碼也敢用???俺也貼一個(gè) 經(jīng)過驗(yàn)證,轉(zhuǎn)匯編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; } } |
免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號(hào) |