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

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

ID:48386373

大小:12.91 KB

页数:7页

时间:2019-08-07

单片机实现的多数BCD码加法器源代码.doc_第1页
单片机实现的多数BCD码加法器源代码.doc_第2页
单片机实现的多数BCD码加法器源代码.doc_第3页
单片机实现的多数BCD码加法器源代码.doc_第4页
单片机实现的多数BCD码加法器源代码.doc_第5页
资源描述:

《单片机实现的多数BCD码加法器源代码.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、*************************************************************************;多位BCD码加法:BCDAN;入口:字节数在R7中,被加数在[R0],加数在[R1];出口:结果在[R0];使用寄存器:A,R7,R2,R1,C,R0;*************************************************************************BCDAN:MOVA,R7MOVR2,AADDA,R0MOVR

2、0,AMOVA,R2ADDA,R1MOVR1,ACLRC;指令1BCDAN1:DECR0;指令2DECR1;指令3MOVA,@R1ADDCA,@R0;指令6DAA;指令4MOV@R0,A;指令5DJNZR2,BCDAN1RET上述子程序出错的可能发生在子程序设计过程中,也可能发生在子程序调用时。现分别讨论如下:指令疏漏指令1最有可能被疏漏,此指令被疏漏的后果是该子程序的结果时对时错。错误的特征是比正确结果小1。尤其是当编写调试减法程序时,由于51单片机的减法指令只有SUBB是带进位减法,故在减法开始前不

3、使用CLRC指令将进位清除,会导致类似的错误,而且更不容易发现。2.位置不妥指令2、3最可能出现这种错误。显然程序设计的思想是BCD码的高位在低地址单元,低位在高地址单元,从高到低依次存放。因此相加时必须从低位加起,所以作为被加数、加数的指针R0、R1必须通过程序前的一段指令调整到指向低位,调整的方法是原指针加字节数。但实际上直接加字节数后使得R0、R1指到最低字节的后面一个字节去了,故必须首先将这1减掉,指向最低字节。从表面上看,指令2、3放在指令5后面似乎也实现了从低字节逐渐向高字节的推进作用,很多

4、开发者一不留神就想当然的这样做了,结果前面的一层作用被疏漏掉了,导致程序错误。3.指令不当例如指令6由于疏忽写成ADD指令,则结果无法正确。4.非法调用按照子程序的说明,调用该子程序是非常容易的。但有时由于疏忽,没有按照入口要求送数出现非法调用现象,导致出错。这类错误在调试时会使得开发者一时不知错在子程序还是调用它的程序。例如,在调用前R7必须按字节数目正确置数,如果忘了此步,显然结果是无法正常的。【例二】7135A/D转换结果读取中断子程序。;*****************************

5、********************************************;AD转换结果读取中断程序:(/INT0);万位引起中断:其它各位采用查询方式;结果暂存在AD单元中(3字节);*************************************************************************ICL7135:CLRIE0;因为是电平触发,故必软件清中断标志PUSHACC;保护现场PUSH02H;R2PUSH01H;R1PUSH00HPUSHDPLPUS

6、HDPHMOVDPTR,#I8155_PA;读8155A口的A/D结果MOVXA,@DPTRMOVR2,A;万位入R2ANLA,#0F0HJNZICL7135_0;POL,OV,UN各位非0,则说明结果不正常SJMPICL7135_1ICL7135_0:LJMPPRIICL7135_1:MOVR1,#AD;结果暂存单元(始地址)MOVA,R2ANLA,#01H;存万位XCHDA,@R1MOVA,R2ANLA,#00HSWAPAXCHDA,@R1MOV@R1,AINCR1WD4:MOVXA,@DPTR;读

7、千位JNBACC.7,WD4SWAPAMOV@R1,A;千存入WD3:MOVXA,@DPTR;读百位JNBACC.6,WD3XCHDA,@R1;百位存入INCR1WD2:MOVXA,@DPTR;读十位JNBACC.5,WD2SWAPAMOV@R1,AWD1:MOVXA,@DPTR;读个位JNBACC.4,WD1XCHDA,@R1SETBEOC_AD;设置转换完成标志MOVR0,#AD_L;R0指向结果单元首址MOVR1,#AD;转存结果缓冲区MOVR2,#03HYL_0:MOVA,@R1MOV@R0,A

8、INCR0INCR1DJNZR2,YL_0SJMPPRIPRI:POPDPH;恢复现场POPDPLPOP00HPOP01HPOP02HPOPACCRETI;中断返回引用该子程序主要想讨论以下两个问题:中断程序的常规错误1)现场的保护与恢复该指令通过PUSH压栈指令将程序中用到的寄存器及其它资源保护起来,然后通过出栈指令按照“先进后出”原则在中断返回前依次恢复,避免干扰或破坏其它程序的正常执行。当然,工作寄存器的保存也可通过寄存器组切换的方式

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。