1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 转换8421码的程序c语言 16进制数转换成8421BCD编码函数

转换8421码的程序c语言 16进制数转换成8421BCD编码函数

时间:2022-12-23 06:46:32

相关推荐

转换8421码的程序c语言 16进制数转换成8421BCD编码函数

.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;

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。