网站公告列表     本站全新改版正在建设中!  [admin  2007年10月22日]        
加入收藏
设为首页
联系站长
您现在的位置: 东方电子科技有限公司 >> 技术文章 >> EMC单片机更多 >> 文章正文
  [组图]EM78实用子程序集           ★★★ 【字体:
EM78实用子程序集
EM78实用子程序集
作者:佚名    文章来源:本站原创    点击数:    更新时间:2007-10-13    

    二进制数转换为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         ;a4

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                     ;0X304位换入A4

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                            ; 有进位则0x261

mov              a,0x20

add        a,0x22

mov              0x24,a                   ;低字节相加,结果送0x24

jbs         0x03,0

jmp      self                       ;无进位跳self

inc         0x25                            ;有进位0x251

jbc         0x03,0

inc         0x26                            ; 有进位0x261

self:               jmp         self

eop

 

    多字节二进制减法

       0x20,0x21中的二进制无符号数减0x22,0x23中的二进制无符号数, 低地址中放低字节数据。假设被减数大于减数。

注意:(1sub指令减出结果为正时,c标志置1

 2sub指令减出结果为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                     ;有借位则0x251

self:        jmp         self

eop

 

    二进制乘法运算

       EM78单片机没有乘法指令,所以乘法运算需要转化为加法运算。0X20单元数据乘以0X21单元数据,结果放在0X220X23中。

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            0x200x22内容相加

add         0x22,a

jbc          0x03,0

inc          0x23                     ;有进位0x231

djz          0x21                     ;0x21中次数减到0则结束

jmp         mul1              ;没减到0则继续

self:        jmp         self

eop

 

    二进制除法运算

多字节二进制除法

被除数为3个字节,在0x200x210x22单元中,0x22.7为最高位,0x20.0为最低位。

除数为2个字节,在0x300x31中。

算法:EM78单片机没有除法指令,而且本例中除法为多字节除法,可采用如下算法。

将被除数扩充一个字节0X230X230。被除数左移1位,0X230X22中数据减去0X310X30中数据,够减则减且0X20.01,减出结果存入0X230X22;不够减则0X230X22保持不变,0X20.00。然后被除数再左移1位,重复上述过程。共循环16次,最后0X230X22中得相减余数,0X210X20中得商。注意,若被除数左移后C标志为1,则不比较0X230X220X310X30数据大小关系而直接相减。

main           mov        a,@0x55        ;被除数赋值

mov        0x20,a

mov        0x21,a

mov        0x22,a

mov        a,@0x0          ;被除数扩充1字节并清0

mov        0x23,a

mov        a,@0x12        ;除数赋值

mov        0x30,a

mov        0x31,a

 

mov        a,@0x10        ;循环次数为16

mov        0x32,a

again:             call         rt_sub            ;调移位除法子程

djz          0x32                     ;16次循环完成则结束

jmp         again              ;未完成则继续

 

self:               jmp         self

 

rt_sub:

bc           0x03,0           ;c标志清0

rlc          0x20                     ;被除数左移1

rlc          0x21

rlc          0x22

rlc          0x23

jbc          0x03,0

jmp         rt3                 ;c标志为1则直接相减

mov        a,0x23            ;c标志为0则先比较大小

mov        0x25,a

mov        a,0x22

mov        0x24,a

mov        a,0x31            ;先比较高位

sub         0x25,a

jbc          0x03,2

jmp         rt1                 ;高位相等跳rt1比较低位

jmp         rt2                 ;高位不等跳rt2

rt1:                mov        a,0x30            ;比较低位

sub         0x24,a

jbc          0x03,2

jmp         rt3                 ;低位也相等则跳rt3,相减,1

rt2:                jbs          0x03,0

ret                               ;减数大则返回,减数小则相减,1

rt3:                bs           0x20,0           ;1

call         sub_2b           ;2字节减法子程

ret

 

sub_2b:

mov        a,0x31            ;高字节相减

sub         0x23,a

mov        a,0x30            ;低字节相减

sub               0x22,a

jbc          0x03,2

ret                               ;低字节相等,无借位,返回

jbc          0x03,0

ret                               ;无借位,返回

dec         0x23                     ;低字节相减有借位,高字节结果减1

ret

eop

 

    BCD数转换为二进制数

       两字节压缩BCD码转换为两字节二进制数。算法如下:

BCDabcd=1000a+100b+10c+d=10{10[10a+b]+c}+d,将各位BCD码分离出之后,即可根据此式转换为二进制数。涉及到乘法运算和多字节加法运算。

       0X200X21中为BCD码,0X214位为最高位。转换结果放在0X300X31中。

main           mov        a@0x79

mov              0x20,a

mov              a,@0x54

mov              0x21,a            ;赋值

mov              a,0x20

and        a,@0x0f

mov              0x22,a

swapa    0x20

and        a,@0x0f

mov              0x23,a

mov              a,0x21

and        a,@0x0f

mov              0x24,a

swapa    0x21

and        a,@0x0f

mov              0x25,a            ;BCD码展开后存于0X22,0X23,0X24,0X25

mov              a,0x25,           ;0X25为最高位

mov              0x30,a

mov              a,@0x0          ;多字节加法高位为0

mov              0x31,a

mov              a,0x24

mov              0x32,a

call         a_b         ;调子程

mov              a,0x23

mov              0x32,a

call         a_b

mov              a,0x22

mov              0x32,a

call         a_b

self:               jmp         self

 

a_b:

mov              a,@0x0          ;0X34,0X35存储中间结果

mov              0x34,a

mov              0x35,a

mov              a,@0x0a         ;实现乘10

mov              0x33,a

a1:                 mov        a,0x35            ;两字节二进制加法,在本例中高字节肯定无进位

add        a,0x31

mov              0x35,a

mov              a,0x34

add        a,0x30

mov              0x34,a

jbc         0x03,0

inc         0x35

djz         0x33

jmp        a1

mov              a,0x32

add        0x34,a

jbc         0x03,0

inc         0x35

mov              a,0x34

mov              0x30,a

mov              a,0x35

mov              0x31,a

ret

eop

 

    二进制数转换为BCD

       本例为单字节二进制数(0X20)转换为非压缩BCD,存在0X25,0X24,0X23,0X25为百位,0X23为个位。

main:       mov        a,@0xa4         ;赋值

mov        0x20,a

mov        0x21,a

mov        0x22,a

mov        a,@0x0          ;0x23,0x24,0x25单元清0

mov        0x23,a

mov        0x24,a

mov        0x25,a

mov        a,@0x64        ;100的个数计数

mov        0x26,a

mov        a,@0x25        ;百位存在0x25

mov        0x04,a

call         a0                  ;调计数子程

mov        a,@0x0a         ;10的个数计数

mov        0x26,a

dec         0x04                     ;个位存在0x24

call         a0

mov        a,0x22            ;除去百位,十位,余下的即个位,存入0x23

mov        0x23,a

self:        jmp         self

 

a0:                                             ;计数子程

mov        a,0x26

sub         0x22,a

jbs          0x03,2

jmp         a1

inc          0x00                     ;无余数则对应位加1

mov        a,@0x0          ;0x210x22在返回时应保持相同

mov        0x21,a

ret

a1:          jbs          0x03,0           ;小于则跳a2

jmp         a2

inc          0x00                     ;大于则计数值加1

mov        a,0x22

mov        0x21,a            ;0x22保存到0x21

jmp         a0                  ;跳回a0继续计数

a2:          mov        a,0x21            ;0x21中保存的减之前的数据,此时恢复到0x22

mov        0x22,a

ret

eop

 

文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口