单片机实现的多数BCD码加法器源代码.docxVIP

  • 20
  • 0
  • 约4.11千字
  • 约 7页
  • 2019-09-27 发布于广东
  • 举报

单片机实现的多数BCD码加法器源代码.docx

;多位BCD码加法:BCD AN ;入口:字节数在R7中,被加数在[R0],加数在[R1] ;岀口:结果在[R0] ;使用寄存器:A,R7,R2,R1,C,RO BCDAN:MOV A, R7 MOV R2, A ADD A, RO MOV RO, A MOV A, R2 ADD A, R1 MOVR1,A CLRC;指令1 BCDAN1: DEC RO;指令 2 DECR1;指令 3 MOV A, @R1 ADDCA, @R0;指令 6 DAA;指令4 MOV @R0,A;指令 5 DJNZ R2, BCDAN1 RET 上述子程序出错的可能发生在子程序设计过程屮,也可能发牛在子程序调用时。现分别讨 论如下: 指令疏漏 指令1最有可能被疏漏,此指令被疏漏的后果是该了程序的结呆吋对时错。错误的特征是 比正确结果小1。尤其是当编写调试减法程序时,由于5 1单片机的减法指令只有SUBB是带 进位减法,故在减法开始而不使用CLRC指令将进位清除,会导致类似的错误,而且更不容易 发现。 2?位置不妥 指令2、3最可能出现这种错误。显然程序设计的思想是BCD码的高位在低地址单元,低 位在高地址单元,从高到低依次存放。因此相加时必须从低位加起,所以作为被加数、加数的 指针RO、R 1必须通过程序前的一段指令调整到指向低位,调整的方法是原指针加字节数。 但实际上直接加字节数后使得RO、R 1指到最低字节的后而一个字节去了,故必须 首先将这1减掉,指向最低字节。从表血上看,指令2、3放在指令5后血似乎也实现了 从低字节逐渐向高字节的推进作用,很多开发者一不留神就想当然的这样做了,结果前面的一 层作用被疏漏掉了,导致程序错误。 3 .指令不当 例如指令6由丁?疏忽写成A D D指令,则结果无法正确。 4.非法调用 按照了程序的说明,调用该了程序是非常容易的。但有时由于疏忽,没有按照入口要求送 数出现非法调用现象,导致出错。这类错误在调试时会使得开发者一时不知错在子程序还是调 用它的程序。例如,在调用前R 7必须按字节数口止确置数,如果忘了此步,显然结果是无法 正常的。 【例二】7 1 3 5 A/ D转换结杲读取中断子程序。 ;AD转换结果读取中断程序:(/INT0) :万位引起中断:其它各位采川查询方式 ;结果暂存在AD单元中(3字节) ?士 ?卜 叶屯 , ICL7135: CLR IEO;因为是电平触发,故必软件清屮断标志 PUSH ACC :保护现场 PUSH 02H ; R2 PUSH01H : R1 PUSH 00H PUSH DPL PUSH DPH MOV DPTR, #I8155_PA;读 8155A 口的 A/D 结果 MOVX A, @DPTR MOV R2, A ;万位入 R2 ANL A, #0F0H JNZ ICL7135_0 ; POL,OV,UN各位非0,则说明结果不正常 SJMP ICL7135_1 ICL7135_0: LJMP PRI ICL7135_1: MOV Rl, #AD ;结果暂存单元(始地址) MOV A, R2 ANL A, #01H;存万位 XCHD A, @R1 MOV A, R2 ANL A, #00H SWAP A XCHD A, @R1 MOV @R1,A INCR1 WD4: MOVX A, @DPTR:读千位 JNB ACC.7, WD4 SWAP A MOV@R1,A;千存入 WD3: MOVX A, @DPTR ;读百位 JNB ACC.6, WD3 XCHD A, @R1 ;百位存入 INCR1 WD2: MOVX A, @DPTR ;读十位 JNB ACC.5, WD2 SWAP A MOV @R1,A WD1: MOVX A, @DPTR ;读个位 JNB ACC.4, WD1 XCHD A, @R1 SETB EOC_AD ;设置转换完成标志 MOV RO, #AD_L; RO指向结果单元首址 MOVR1,#AD;转存结果缓冲区 MOV R2, #03H YL_0: MOV A, @R1 MOV @R0,A INC RO INCR1 DJNZ R2, YL_O SJMP PR1 PRI:POPDPH;恢复现场 POP DPL POP OOH POPOIH POP 02H POP ACC RETI;中断返回 弓I用该了程序主要想讨论以下两个问题: 中断程序的常规错误 1) 现场的保护与恢复 该指令通过PUSH压栈指令将程序中用到的寄存器及其它资源保护起來,然后通过出栈指 令按照“先进后出”原则在中断返回]逬依次恢复,避免干扰或破坏其它程序的止常执行。 当然,工作寄存器的保存也可通过寄存器组切换的方式更为便捷地实现。由于屮断的不可 预测性,因此现场保护显得尤为重要,否则

文档评论(0)

1亿VIP精品文档

相关文档