找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6936|回复: 0
打印 上一主题 下一主题
收起左侧

16进制数转换成8421BCD编码函数

[复制链接]
跳转到指定楼层
楼主
ID:26188 发表于 2015-2-18 01:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表