.INCLUDE hardware.inc
.IRAM
_Led_Out:
.dw 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
_List_8421_Data: //16進位數轉換成8421碼的位權表,萬位每千位進位,千位每百位進位,百位每十位進位
.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
//=========================================================================================
//函數: hex_to_8421()
//語法:hex_to_8421(被轉換數,符號標記)
//描述:16進位數轉換成8421碼,存放在C段中定義好的數組當中
//須定義一個下標8位的整數數組,C段中如下書寫
//extern int led_out [8]={0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0};
//參數:被轉換數小于0xFFFF的數,符號標記0或非零的數
//返回:無
//=============================================================================================
.PUBLIC _hex_to_8421;
_hex_to_8421: .PROC
push bp to [sp];
bp=sp+1; //基址重定位,準備取參數
r1=[bp+3]; //備轉換成8421碼的16進位數字
r3=[bp+4]; //符號位標志,為0,則做無符號整數處理,非1做有符號數處理
R4=_Led_Out; //輸出數據的地址******************************可修改輸出名稱
bp=_List_8421_Data; //基址定位到位權表頭**************************對應.IRAM段,可修改輸入名稱
//------------------------------------------
test R3,0xFFFF; //檢查R3是否非0,如果非零,做有符號數處理,如果為0,做無符號數處理
je _hex_loop0; //為0,做無符號數處理,跳到_hex_loop0
R3=0xF000; //非0,做有符號數處理
[R4]=r3; //表的第1個單元高4字節存放符號標記,F為負,0為正
R1-=0X0001; //包括下1步,減1后反碼轉換成10進位正數
R1^=0xFFFF;
_hex_loop0:
R2=0X0007; //R2為進位標志,從9到1循環,R2初置7,進入循環后減1為6做初值
//------------------------------------------
_hex_loop1: //位權表遍歷開始標記
CALL _Clear_WatchDog; // 清看門狗
BP+=0X0001; //基址加1,定位到位權表第一個有效數字
R2-=0X0001; //位權減1,準備輸出位權表第一個有效數字所對應的位數字
cmp r1,[bp]; //比較被轉換數和當前位權的大小
jb _hex_loop2; //如果被轉換數小于當前位權,則跳到"_hex_loop1",繼續比較
jmp _hex_loop3; //如果被轉換數大于當前位權,則跳到"_hex_loop3",進行轉換
_hex_loop2: //R2進位循環處理的標記
CMP R2,0X0002;
JB _hex_loop4; //包括上1步,如果R2小于2,跳到_hex_loop4,將R2置為10
JMP _hex_loop1; //如果R2大于等于2,跳到"_hex_loop1",繼續比較
_hex_loop4:
R2=0x000A; //包括下1步,將R2置為10,跳到"_hex_loop1",繼續比較
JMP _hex_loop1;
//------------------------------------------
_hex_loop3: //判斷并輸出數據的標記
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進制第1位,跳到"_hex_000",結束轉換
[R3]=R1;
jmp _hex_over;
_hex_2710:
R3=R4+1; //包括下3步,輸出10進制第5位,被轉換數減位權,做被轉換數,跳到"_hex_loop1",繼續比較
[R3]=R2;
r1-=[bp];
jmp _hex_loop1;
_hex_03e8:
R3=R4+2; //包括下3步,輸出10進制第4位,被轉換數減位權,做被轉換數,跳到"_hex_loop1",繼續比較
[R3]=R2;
r1-=[bp];
jmp _hex_loop1;
_hex_0064:
R3=R4+3; //包括下3步,輸出10進制第3位,被轉換數減位權,做被轉換數,跳到"_hex_loop1",繼續比較
[R3]=R2;
r1-=[bp];
jmp _hex_loop1;
_hex_000a:
R3=R4+4; //包括下3步,輸出10進制第2位,被轉換數減位權,做被轉換數,跳到"_hex_loop1",繼續比較
[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;
|