找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6946|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

16進(jìn)制數(shù)轉(zhuǎn)換成8421BCD編碼函數(shù)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:26188 發(fā)表于 2015-2-18 01:18 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

.INCLUDE hardware.inc
.IRAM
_Led_Out:
.dw 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
_List_8421_Data: //16進(jìn)位數(shù)轉(zhuǎn)換成8421碼的位權(quán)表,萬(wàn)位每千位進(jìn)位,千位每百位進(jìn)位,百位每十位進(jìn)位
.dw 0xFFFF,0xEA60,0xC350,0x9C40,0x7530,0x4E20,0x2710
//60000-10000
.dw 0x2328,0x1F40,0x1B58,0x1770,0x1388,0x0FA0,0x0BB8,0x07D0,0x03E8
//9000-1000
.dw 0x0384,0x0320,0x02BC,0x0258,0x01F4,0x0190,0x012C,0x00C8,0x0064
//900-100
.dw 0x005A,0x0050,0x0046,0x003C,0x0032,0x0028,0x001E,0x0014,0x000A
//90-10
//.RAM
//.DATA
.code
//=========================================================================================
//函數(shù): hex_to_8421()
//語(yǔ)法:hex_to_8421(被轉(zhuǎn)換數(shù),符號(hào)標(biāo)記)
//描述:16進(jìn)位數(shù)轉(zhuǎn)換成8421碼,存放在C段中定義好的數(shù)組當(dāng)中
//須定義一個(gè)下標(biāo)8位的整數(shù)數(shù)組,C段中如下書寫
//extern int led_out [8]={0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0};
//參數(shù):被轉(zhuǎn)換數(shù)小于0xFFFF的數(shù),符號(hào)標(biāo)記0或非零的數(shù)
//返回:無(wú)
//=============================================================================================
.PUBLIC _hex_to_8421;
_hex_to_8421: .PROC
push bp to [sp];
bp=sp+1;                 //基址重定位,準(zhǔn)備取參數(shù)
r1=[bp+3];               //備轉(zhuǎn)換成8421碼的16進(jìn)位數(shù)字
r3=[bp+4];               //符號(hào)位標(biāo)志,為0,則做無(wú)符號(hào)整數(shù)處理,非1做有符號(hào)數(shù)處理
R4=_Led_Out;             //輸出數(shù)據(jù)的地址******************************可修改輸出名稱
bp=_List_8421_Data;      //基址定位到位權(quán)表頭**************************對(duì)應(yīng).IRAM段,可修改輸入名稱
//------------------------------------------
test R3,0xFFFF;          //檢查R3是否非0,如果非零,做有符號(hào)數(shù)處理,如果為0,做無(wú)符號(hào)數(shù)處理
    je _hex_loop0;       //為0,做無(wú)符號(hào)數(shù)處理,跳到_hex_loop0
  R3=0xF000;             //非0,做有符號(hào)數(shù)處理
  [R4]=r3;               //表的第1個(gè)單元高4字節(jié)存放符號(hào)標(biāo)記,F(xiàn)為負(fù),0為正
  R1-=0X0001;            //包括下1步,減1后反碼轉(zhuǎn)換成10進(jìn)位正數(shù)
  R1^=0xFFFF;
_hex_loop0:
    R2=0X0007;           //R2為進(jìn)位標(biāo)志,從9到1循環(huán),R2初置7,進(jìn)入循環(huán)后減1為6做初值
//------------------------------------------
_hex_loop1:              //位權(quán)表遍歷開(kāi)始標(biāo)記
CALL _Clear_WatchDog;            // 清看門狗
  BP+=0X0001;            //基址加1,定位到位權(quán)表第一個(gè)有效數(shù)字
  R2-=0X0001;            //位權(quán)減1,準(zhǔn)備輸出位權(quán)表第一個(gè)有效數(shù)字所對(duì)應(yīng)的位數(shù)字
  cmp r1,[bp];           //比較被轉(zhuǎn)換數(shù)和當(dāng)前位權(quán)的大小
     jb _hex_loop2;      //如果被轉(zhuǎn)換數(shù)小于當(dāng)前位權(quán),則跳到"_hex_loop1",繼續(xù)比較
   jmp _hex_loop3;       //如果被轉(zhuǎn)換數(shù)大于當(dāng)前位權(quán),則跳到"_hex_loop3",進(jìn)行轉(zhuǎn)換
     _hex_loop2:         //R2進(jìn)位循環(huán)處理的標(biāo)記
     CMP R2,0X0002;   
         JB _hex_loop4;  //包括上1步,如果R2小于2,跳到_hex_loop4,將R2置為10
       JMP _hex_loop1;   //如果R2大于等于2,跳到"_hex_loop1",繼續(xù)比較
         _hex_loop4:
         R2=0x000A;      //包括下1步,將R2置為10,跳到"_hex_loop1",繼續(xù)比較
         JMP _hex_loop1;
//------------------------------------------
_hex_loop3:              //判斷并輸出數(shù)據(jù)的標(biāo)記
cmp r1,0x2710;
jnb _hex_2710;           //包括上1步,如果R1大于等于0x2710(10000),跳到_hex_2710處理
cmp r1,0x03e8;
jnb _hex_03e8;           //包括上1步,如果R1大于等于0x03E8(1000),跳到_hex_03E8處理
cmp r1,0x0064;
jnb _hex_0064;           //包括上1步,如果R1大于等于0x0064(100),跳到_hex_0064處理
cmp r1,0x000a;
jnb _hex_000a;           //包括上1步,如果R1大于等于0x000A(10),跳到_hex_000A處理
//------------------------------------------
R3=R4+5;                //包括下2步,輸出10進(jìn)制第1位,跳到"_hex_000",結(jié)束轉(zhuǎn)換
[R3]=R1;
jmp _hex_over;
_hex_2710:
     R3=R4+1;            //包括下3步,輸出10進(jìn)制第5位,被轉(zhuǎn)換數(shù)減位權(quán),做被轉(zhuǎn)換數(shù),跳到"_hex_loop1",繼續(xù)比較
     [R3]=R2;
     r1-=[bp];
     jmp _hex_loop1;
_hex_03e8:
     R3=R4+2;            //包括下3步,輸出10進(jìn)制第4位,被轉(zhuǎn)換數(shù)減位權(quán),做被轉(zhuǎn)換數(shù),跳到"_hex_loop1",繼續(xù)比較
     [R3]=R2;
     r1-=[bp];
     jmp _hex_loop1;
_hex_0064:
     R3=R4+3;            //包括下3步,輸出10進(jìn)制第3位,被轉(zhuǎn)換數(shù)減位權(quán),做被轉(zhuǎn)換數(shù),跳到"_hex_loop1",繼續(xù)比較
     [R3]=R2;
     r1-=[bp];
     jmp _hex_loop1;
_hex_000a:
     R3=R4+4;            //包括下3步,輸出10進(jìn)制第2位,被轉(zhuǎn)換數(shù)減位權(quán),做被轉(zhuǎn)換數(shù),跳到"_hex_loop1",繼續(xù)比較
     [R3]=R2;
     r1-=[bp];
     jmp _hex_loop1;
_hex_over:
pop bp from [sp];
RETF
.ENDP;
.PUBLIC _Clear_WatchDog;
_Clear_WatchDog: .PROC
  PUSH R1 TO [SP];
R1 = 0x0001;
  [ASM_Port_Watchdog_Clear] = R1;
  POP R1 FROM [SP];
RETF
.ENDP;


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表