微控梦想

搜索:
您的位置: 首页 > 单片机 > » 正文

EM78系列单片机的数值转换子程序简介

时间:   来源:嵌入网   作者:佚名   阅读:

一 二进制数转换为ASCⅡ码
 将一个字节的二进制数转换为两位16进制数的ASCⅡ码
 main: mov a,@0x9f ;二进制数为0x9f
 mov 0x30,a ;二进制数存入0x30
 mov a,@0x02
 mov 0x10,a ;0x10中存放转换次数
 mov a,@0x31
 mov 0x04,a ;0x04中为转换后数据存放地址
 mov a,0x30
 B1: and a,@0x0f ;取a低4位
 mov 0x00,a
 sub a,@0x09 ;低4位大于9跳往B2
 jbs 0x03,0
 jmp B2
 mov a,0x00 ;低4位不大于9则加0x30
 add a,@0x30
 mov 0x00,a ;将ASCⅡ码存入0X04所指单元
 jmp B3
 B2: mov a,0x00 ;大于9则加0X37
 add a,@0x37
 mov 0x00,a
 B3: swapa 0x30 ;将0X30高4位换入A低4位
 inc 0x04 ;存储地址加1
 djz 0x10 ;循环次数减1,为0则返回
 jmp B1 ;不为0继续转换
 self: jmp self
 eop

 二 多字节二进制加法
 0X20,0X21中的二进制无符号数与0X22,0X23中的二进制无符号数相加,结果放在0X24,0X25,0X26中,低地址中放低字节数据。
 Main: mov a,@0x78 ;赋值
 mov 0x20,a
 mov a,@0xc6
 mov 0x21,a
 mov a,@0x86
 mov 0x22,a
 mov a,@0x9e
 mov 0x23,a
 mov a,@0x0 ;0x26单元清0
 mov 0x26,a
 mov a,0x21
 add a,0x23
 mov 0x25,a ;高字节相加,结果送0x25
 jbc 0x03,0
 inc 0x26 ; 有进位则0x26加1
 mov a,0x20
 add a,0x22
 mov 0x24,a ;低字节相加,结果送0x24
 jbs 0x03,0
 jmp self ;无进位跳self
 inc 0x25 ;有进位0x25加1
 jbc 0x03,0
 inc 0x26 ; 有进位0x26加1
 self: jmp self
 eop
 三 多字节二进制减法
 0x20,0x21中的二进制无符号数减0x22,0x23中的二进制无符号数,
 低地址中放低字节数据。假设被减数大于减数。
 注意:(1)sub指令减出结果为正时,c标志置1。
 (2)sub指令减出结果为0时,c标志也置1。
 即,sub指令执行后,c标志清0表示结果为负。
 main: mov a,@0x67 ;赋值
 mov 0x20,a
 mov a,@0xff
 mov 0x21,a
 mov a,@0xe8
 mov 0x22,a
 mov a,@0x44
 mov 0x23,a ; 高字节相减
 sub a,0x21
 mov 0x25,a ;结果存0x25
 mov a,0x22 ;低字节相减
 sub a,0x20
 mov 0x24,a
 jbs 0x03,0
 dec 0x25 ;有借位则0x25减1
 self: jmp self
 eop
 四 二进制乘法运算
 EM78单片机没有乘法指令,所以乘法运算需要转化为加法运算。0X20单元数据乘以0X21单元数据,结果放在0X22,0X23中。
 main: mov a,@0x0 ;0x22,0x23单元清0
 mov 0x22,a
 mov 0x23,a
 mov a,@0x3f ;赋值
 mov 0x20,a
 mov a,@0x22
 mov 0x21,a
 mul1: mov a,0x20 ;0x20与0x22内容相加
 add 0x22,a
 jbc 0x03,0
 inc 0x23 ;有进位0x23加1
 djz 0x21 ;0x21中次数减到0则结束
 jmp mul1 ;没减到0则继续
 self: jmp self
 eop
 五 二进制除法运算
 多字节二进制除法
 被除数为3个字节,在0x20、0x21、0x22单元中,0x22.7为最高位,0x20.0为最低位。
 除数为2个字节,在0x30、0x31中。
 算法:EM78单片机没有除法指令,而且本例中除法为多字节除法,可采用如下算法。
 将被除数扩充一个字节0X23,0X23清0。被除数左移1位,0X23、0X22中数据减去0X31、0X30中数据,够减则减且0X20.0置1,减出结果存入0X23、0X22;不够减则0X23、0X22保持不变,0X20.0清0。然后被除数再左移1位,重复上述过程。共循环16次,最后0X23、0X22中得相减余数,0X21、0X20中得商。注意,若被除数左移后C标志为1,则不比较0X23、0X22与0X31、0X30数据大小关系而直接相减。
 main: mov a,@0x55 ;被除数赋值
------------ ---------- ----------- ---------- --------- -------- ------- ------ ----- ---- --- -- -  -  -