收藏 分享(赏)

PIC单片机应用开发典型模块_第八章程序.docx

上传人:海外认知 文档编号:21764335 上传时间:2024-04-24 格式:DOCX 页数:34 大小:36.86KB
下载 相关 举报
PIC单片机应用开发典型模块_第八章程序.docx_第1页
第1页 / 共34页
PIC单片机应用开发典型模块_第八章程序.docx_第2页
第2页 / 共34页
PIC单片机应用开发典型模块_第八章程序.docx_第3页
第3页 / 共34页
PIC单片机应用开发典型模块_第八章程序.docx_第4页
第4页 / 共34页
PIC单片机应用开发典型模块_第八章程序.docx_第5页
第5页 / 共34页
亲,该文档总共34页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、编号:时间:2021年x月x日书山有路勤为径,学海无涯苦作舟页码:第34页 共34页(1)1616位定点数加、减法程序LISTp=16f877INCLUDEp16f877.incACCALOEQU20;存放加数或减数低8位ACCAHIEQU21 ;存放加数或减数高8位ACCBLOEQU23 ;存放被加数或被减数低8位ACCBHIEQU24 ;存放被加数或被减数高8位ORG0X0000STARTGOTOMAIN;*双字节减法子程序,入口地址ACCB-ACCA,出口地址ACCB*D_subCALLNEG_A ;求ACCA的补码;双字节加法子程序,入口地址ACCB+ACCA,出口地址ACCBD_ad

2、dMOVFACCALO,0 ;ACCB和ACCA低半字节相加ADDWFACCBLOBTFSCSTATUS, C ;有进位否?INCFACCBHI ;有,ACCB高字节加1,再加ACCAHIMOVFACCAHI,0 ;ACCA、ACCB高半字节相加ADDWFACCBHIRETURN ;子程序返回;ACCA取补子程序NEG_ACOMFACCALO;ACCALO取反加1INCFACCALOBTFSCSTATUS,Z;低8位有进位吗?DECFACCAHI ;有,ACCAHI减1,再取反COMFACCAHI ;否则ACCAHI直接取反RETURN ;子程序返回(2)1616位定点数乘法程序LISTp=1

3、6f877INCLUDEp16f877.incACCALOEQU20;存放乘数低8位ACCAHIEQU21;存放乘数高8位ACCBLOEQU23 ;存放被乘数低8位和乘积第1623位ACCBHIEQU24 ;存放被乘数高8位和乘积第2431位ACCCLOEQU26 ;存放乘积低8位ACCCHIEQU27 ;存放乘积高8位ACCDLOEQU28;临时寄存器ACCDHIEQU29;临时寄存器TEMPEQU2A;临时寄存器SIGNEQU2B ;存放乘积的符号ORG0X0000STARTGOTOMAINORG0X0100D_mpyCALLS_SIGN ;求取乘积的符号,并对负数取补CALLSETUP

4、;调用子程序,将ACCB的值送ACCDINCFTEMPCLRFACCCHI;清ACCCCLRFACCCLOMLOOPBCFSTATUS,C;清进位位RRFACCDHI;ACCD右移RRFACCDLOBTFSCSTATUS,C;判断是否需要相加CALLD_add ;加乘数至ACCB,见加法程序BCFSTATUS,C;清进位位RRFACCBHI ;右移部分乘积RRFACCBLORRFACCCHIRRFACCCLODECFSZTEMP;乘法完成否?GOTOMLOOP;否,继续求乘积BTFSSSIGN,7 ;是,确定乘积的符号GOTOOVER ;为正,乘法结束COMFACCCLO ;为负,乘积取补IN

5、CFACCCLOBTFSCSTATUS,ZDECFACCCHICOMFACCCHIBTFSCSTATUS,ZNEG_BDECFACCBLOCOMFACCBLOBTFSCSTATUS,ZDECFACCBHICOMFACCBHIOVERRETURN;子程序返回SETUPMOVLW15;初始化TEMP寄存器MOVWFTEMPMOVFACCBHI,0 ;ACCB送ACCDMOVWFACCDHIMOVFACCBLO,0MOVWFACCDLOCLRFACCBHI;清ACCBCLRFACCBLORETURN;子程序返回S_SIGNMOVFACCAHI,0;ACCAHI异或ACCBHI,结果送SIGN单元XO

6、RWFACCBHI,0MOVWFSIGNBTFSSACCBHI,7 ;ACCB为负吗?GOTOCHEK_A ;否,检查ACCACALLNEG_B ;是,求取ACCB绝对值CHEK_ABTFSCACCAHI,7;ACCA为负吗?CALLNEG_A ;ACCA为负,求取ACCA绝对值,RETURN ;ACCA和ACCB均为正,返回(3)1616位定点数除法程序LISTp=16f877INCLUDEp16f877.incACCALOEQU20;存放除数低8位ACCAHIEQU21;存放除数高8位ACCBLOEQU22 ;存放被除数和商的低8位ACCBHIEQU23 ;存放被除数和商的高8位ACCCL

7、OEQU24;存放余数低8位ACCCHIEQU25;存放余数高8位ACCDLOEQU26 ;临时寄存器ACCDHIEQU27 ;临时寄存器TEMPEQU28 ;临时寄存器SIGNEQU29;存放商的符号ORG0X0000STARTGOTOMAINORG0X0100D_divCALLS_SIGN;确定商的符号,并将负数取补CALLSETUP ;初始化TEMP,将被除数移至ACCDINCFTEMPCLRFACCCHI;清余数寄存器CLRFACCCLODLOOPBCFSTATUS,C ;清进位位RLFACCDLO ;被除数、余数左移1位RLFACCDHIRLFACCCLORLFACCCHIMOVFA

8、CCAHI,0 ;ACCCHI-ACCAHISUBWFACCCHI,0BTFSSSTATUS,Z;ACCCHI=ACCAHI?GOTONOCHKMOVFACCALO,0;是,ACCCLO-ACCALOSUBWFACCCLO,0NOCHKBTFSSSTATUS,C;ACCCACCA?GOTONOGOMOVFACCALO,0 ;是,余数减除数SUBWFACCCLOBTFSSSTATUS,CDECFACCCHIMOVFACCAHI,0SUBWFACCCHIBSFSTATUS,C ;置进位位NOGORLFACCBLO ;商左移1位RLFACCBHIDECFSZTEMP ;循环完毕?GOTODLOOPB

9、TFSSSIGN,7 ;是,确定商的符号GOTODIVOVER ;为正,除法结束,跳转到结束行COMFACCCLO ;为负,商和余数分别取补INCFACCCLOBTFSCSTATUS,ZDECFACCCHICOMFACCCHICALLNEG_B;见乘法程序中间NEG_BDIVOVERRETURN ;子程序返回S_SIGNMOVFACCAHI,0;ACCAHI异或ACCBHI,结果送SIGN单元XORWFACCBHI,0MOVWFSIGNBTFSSACCBHI,7 ;ACCB为负?GOTOCHEK_A ;否,检查ACCACOMFACCBLO ;是,ACCB取补INCFACCBLOBTFSCSTA

10、TUS,ZDECFACCBHICOMFACCBHICHEK_ABTFSCACCAHI,7;ACCA为负?CALLNEG_A ;ACCA为负,取补(NEG_A子程序请参见 ;1616位定点数乘法子程序NEG_A)RETURN ;ACCA和ACCB均为负,返回(4)浮点数加减法程序LISTp=16f877INCLUDEp16f877.incACCALOEQU20;存放加数或减数的尾数ACCAHIEQU21EXPAEQU22 ;存放加数或减数阶码ACCBLOEQU23 ;存放被加数或被减数尾数以及和或差ACCBHIEQU24EXPBEQU25 ;存放被加数或被减数阶码ACCCLOEQU26 ;临时寄

11、存器ACCCHIEQU27 ;临时寄存器ACCDLOEQU28 ;临时寄存器ACCDHIEQU29 ;临时寄存器TEMPEQU2A ;临时寄存器TEMP1EQU30 ;临时寄存器TIMESEQU31 ;临时寄存器ORG0X000STARTGOTOMAINORG0X0100F_subCALLNEG_A;求ACCA的补码,将减法转换为补码加法F_addCALLSUBADJ;调子程序判断EXPB和EXPA的大小BTFSCSTATUS,Z;参与运算的两个数阶码相等?GOTOPADD;是,求尾数的和BTFSCSTATUS,C;EXPBEXPA?CALLF_swap;是,ACCB与ACCA互换MOVFEX

12、PA,0;否,求取两者的差值SUBWFEXPBSCLOOPCALLSHFTSR;ACCB右移规格化INCFSZEXPB;EXPBEXPA?GOTOSCLOOP;否,继续右移MOVFEXPA,0;是,存和(差)的阶码MOVWFEXPBPADDMOVFACCAHI,0;ACCAHI或ACCBHIIORWFACCBHI,0MOVWFSIGN;存于SIGN寄存器MOVFACCBHI,0;暂存ACCBHIMOVWFEXPACALLD_add;尾数相加BTFSSSIGN,7;ACCA和ACCB有负数?BTFSCACCBHI,7;否,把和的最高位和次高位同时进位?GOTOADD2;否,转ADD2BTFSSA

13、CCAHI,7;ACCA为负吗?GOTOADD3;ACCA和ACCB不同时为负,转ADD3BTFSSEXPA,7;是,ACCB为负吗?GOTOADD3BSFSTATUS,C;ACCA和ACCB同为负,带负号右移RRFACCBHIRRFACCBLOINCFEXPBADD3CLRFACCCHI;和(差)规格化CLRFACCCLOCALLF_normRETURN;子程序返回ADD2BCFSTATUS,C;最高位次高位不同时进位,ACCB右移INCFEXPBGOTOSHFTRSHFTSRBCFSTATUS,C;ACCB带符号右移子程序BTFSCACCBHI,7BSFSTATUS,CSHFTRRRFAC

14、CBHIRRFACCBLORETURN;子程序返回F_swapMOVFACCAHI,0;ACCAHI、ACCBHI互换MOVWFTEMPMOVFACCBHI,0MOVWFACCAHIMOVFTEMP,0MOVWFACCBHIMOVFACCALO,0;ACCALO、ACCBLO互换MOVWFTEMPMOVFACCBLO,0MOVWFACCALOMOVFTEMP,0MOVWFACCBLOMOVFEXPA,0;EXPA、EXPB互换MOVWFTEMPMOVFEXPB,0MOVWFEXPAMOVFTEMP,0MOVWFEXPBRETURNSUBADJMOVFEXPA,0;EXPA异或EXPB,结果送C

15、_DIVXORWFEXPB,0MOVWFC_DIVMOVFEXPA,0;EXPB-EXPASUBWFEXPB,0BTFSSC_DIV,7;EXPA和EXPB同号?RETURN;是,进位位的值真确反映两者的大小,返回BTFSSSTATUS,C;否,进位位的值取反GOTOCHANGECBCFSTATUS,CRETURNCHANGECBSFSTATUS,CRETURNF_normMOVFACCBHI;ACCB0?BTFSSSTATUS,ZGOTOC_normMOVFACCBLOBTFSCSTATUS,ZRETURN;是,不需规格化,返回C_normBTFSCACCBHI,7;否。ACCB为负?GOT

16、OC_norm2C_norm1BTFSC ACCBHI,6;为正。规格化完毕?RETURN;ACCBHI.6=1,规格化结束CALLSHFTSL;否。ACCB左移DECFEXPB;EXPB减1GOTOC_norm1;重新判断规格化完毕否?C_norm2BTFSSACCBHI,6;ACCB为负。规格化完毕否?RETURN;ACCBHI.6=0,规格化结束BCFSTATUS,CCALLSHFTSL;否,ACCB左移BSFACCBHI,7;加符号DECFEXPB;EXPB减1GOTOC_norm2;重新判断规格化完毕否?SHFTSLBCFSTATUS,C;ACCB左移子程序RLFACCCLORLFA

17、CCCHIRLFACCBLORLFACCBHIRETURN(5)浮点数乘法程序LISTp=16f877INCLUDEp16f877.incACCALOEQU20;存放乘数尾数ACCAHIEQU21EXPAEQU22;存放乘数阶码ACCBLOEQU23 ;存放被乘数尾数和乘积高16位ACCBHIEQU24EXPBEQU25;存放被乘数阶码ACCCLOEQU26 ;存放乘积低16位ACCCHIEQU27ACCDLOEQU28;临时寄存器ACCDHIEQU29;临时寄存器TEMPEQU2A;临时寄存器TEMP1EQU30;临时寄存器TIMESEQU31;临时寄存器SIGNEQU2B;存放乘积符号CO

18、UNTEQU2F ;临时寄存器ACCEHIEQU30;临时寄存器ACCELOEQU31;临时寄存器ORG0X0000STARTGOTOMAINORG0X0100F_mpyCALLS_SIGN;求取乘积的符号,并对负数取补CALLSETUP ;调用子程序将ACCB的值送ACCDCLRFACCCHI ;清ACCCCLRFACCCLOMLOOPBCFSTATUS,C;清进位位RRFACCDHI;ACCD右移RRFACCDLOBTFSCSTATUS,C ;判断是否需要相加CALLD_add ;加乘数至ACCBBCFSTATUS,C;清进位位RRFACCBHI;右移部分乘积RRFACCBLORRFACC

19、CHIRRFACCCLODECFSZTEMP;乘法完成否?GOTOMLOOP;否,继续循环MOVFEXPA,0 ;是,乘数与被乘数阶码相加,得积的阶码ADDWFEXPBMOVFACCBHI;ACCBHI=0?BTFSSSTATUS,ZGOTOFINUP;否,转FINUPMOVFACCBLO;ACCB0?BTFSSSTATUS,ZGOTOSHFT08 ;否,只有ACCBHI=0,转SHFT08MOVFACCCHI,0 ;ACCB=0,将乘积左移15位MOVWFACCBHIMOVFACCCLO,0MOVWFACCBLOBCFSTATUS,CRRFACCBHIRRFACCBLOMOVLW.15;乘积

20、阶码减15(十进制数)SUBWFEXPBGOTOFINUPSHFT08MOVFACCBLO,0;只有ACCBHI0,乘积左移7位MOVWFACCBHIMOVFACCCHI,0MOVWFACCBLOBCFSTATUS,CRRFACCBHIRRFACCBLOMOVLW.7;乘积阶码减7SUBWFEXPBFINUPCALLF_norm ;对乘积进行规格化BTFSSSIGN,7;确定乘积的符号GOTOOVER ;为正,乘法结束COMFACCCLO;为负,乘积取补INCFACCCLOBTFSCSTATUS,ZDECFACCCHICOMFACCCHIBTFSCSTATUS,ZNEG_BDECFACCBLO

21、COMFACCBLOBTFSCSTATUS,ZDECFACCBHICOMFACCBHIOVERRETURN;乘法结束,子程序返回S_SIGNMOVFACCAHI,0 ;ACCAHI异或ACCBHI,结果送SIGNXORWFACCBHI,0MOVWFSIGNBTFSSACCBHI,7;ACCB为负?GOTOCHEK_A;否,检查ACCACOMFACCBLO;是,ACCB取补INCFACCBLOBTFSCSTATUS,ZDECFACCBHICOMFACCBHICHEK_ABTFSCACCAHI,7;ACCA为负?CALLNEG_A;ACCA取补RETURN ;返回F_normMOVFACCBHI;

22、ACCB0?BTFSSSTATUS,ZGOTOC_normMOVFACCBLOBTFSCSTATUS,ZRETURN ;是,不需规格化,返回C_normBTFSCACCBHI,7;否。ACCB为负?GOTOC_norm2C_norm1BTFSCACCBHI,6;为正。规格化完毕?RETURN ;ACCBHI.6=1,规格化结束CALLSHFTSL;否。ACCB左移DECFEXPB ;EXPB减1GOTOC_norm1 ;重新判断规格化完毕否?C_norm2BTFSSACCBHI,6;ACCB为负。规格化完毕否?RETURN ;ACCBHI.6=0,规格化结束BCFSTATUS,CCALLSHF

23、TSL ;否,ACCB左移BSFACCBHI,7 ;加符号DECFEXPB ;EXPB减1GOTOC_norm2 ;重新判断规格化完毕否?SHFTSLBCFSTATUS,C;ACCB左移子程序RLFACCCLORLFACCCHIRLFACCBLORLFACCBHIRETURN(6)浮点数除法程序LISTp=16f877INCLUDEp16f877.incACCALOEQU20;存放除数的尾数ACCAHIEQU21EXPAEQU22;存放除数的阶码ACCBLOEQU23 ;存放被除数的尾数和商的尾数ACCBHIEQU24EXPBEQU25 ;存放被除数和商的阶码ACCCLOEQU26 ;存放余数ACCCHIEQU27ACCDLOEQU28;临时寄存器ACCDHIEQU29 ;临时寄存器TEMPEQU2A ;临时寄存器TEMP1EQU30 ;临时寄存器TIMESEQU31 ;临时寄存器SIGNEQU2B ;存放商的符号COUNTEQU2F;临时寄存器ACCEHIEQU30;临时寄存器ACCELOEQU31;临时寄存器ORG0X000

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 经管营销 > 公共管理

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:文库网官方知乎号:文库网

经营许可证编号: 粤ICP备2021046453号世界地图

文库网官网©版权所有2025营业执照举报