版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PIC单片机应用开发典
型模块程序RevisedbyChenZhenin2021(1)16×16位定点数加、减法程序LISTp=16f877INCLUDE16fACCALOEQU20 ;存放加数或减数低8位ACCAHIEQU21 ;存放加数或减数高8位ACCBLOEQU23 ;存放被加数或被减数低8位ACCBHIEQU24 ;存放被加数或被减数高8位ORG0X0000STARTGOTOMAIN;***双字节减法子程序,入口地址ACCB-ACCA,出口地址ACCB***D_subCALLNEG_A;求ACCA的补码;双字节加法子程序,入口地址ACCB+ACCA,出口地址ACCBD_addMOVFACCALO,0 ;ACCB和ACCA低半字节相加ADDWFACCBLOBTFSCSTATUS,C;有进位否Incfaccbhi ;有,ACCB高字节力口1,再力口accahiMOVFACCAHI,0 ;ACCA、ACCB高半字节相力口ADDWFACCBHIRETURN ;子程序返回;ACCA取补子程序NEG_ACOMFACCALO;ACCALO取反力口1INCFACCALOBTFSCSTATUS,Z;低8位有进位吗DECFACCAHICOMFACCAHIRETURN;有,ACCAHI减1,再取反;否则ACCAHI直接取反;子程序返回16×16位定点数乘法程序LISTp=16f877INCLUDE16fACCALOEQU20ACCAHIEQU21ACCBLOEQU23ACCBHIEQU24ACCCLOEQU26ACCCHIEQU27ACCDLOEQU28ACCDHIEQU29TEMPEQU2ASIGNEQU2B;存放乘数低8位;存放乘数高8位;存放被乘数低8位和乘积第16〜23位;存放被乘数高8位和乘积第24〜31位;存放乘积低8位;存放乘积高8位;临时寄存器;临时寄存器;临时寄存器;存放乘积的符号ORG0X0000STARTGOTOMAINORG0X0100D_mpyCALLS_SIGNCALLSETUP;求取乘积的符号,并对负数取补;调用子程序,将ACCB的值送ACCDINCFTEMPCLRFACCCHI;清ACCCCLRFACCCLOMLOOPBCFSTATUS,C;清进位位RRFACCDHI ;ACCD右移RRFACCDLOBTFSCSTATUS,C ;判断是否需要相加CALLD_add;加乘数至ACCB,见加法程序BCFSTATUS,C ;清进位位RRFACCBHI ;右移部分乘积RRFACCBLORRFACCCHIRRFACCCLO
DECFSZTEMP
GOTOMLOOP
BTFSSSIGN,7
GOTOOVER
COMFACCCLO
INCFACCCLO;乘法完成否;否,继续求乘积;是,确定乘积的符号;为正,乘法结束;为负,乘积取补BTFSCSTATUS,ZDECFACCCHICOMFACCCHIBTFSCSTATUS,ZNEG_BDECFACCBLO
COMFACCBLO
BTFSCSTATUS,Z
DECFACCBHI
COMFACCBHI
OVERRETURN
SETUPMOVLW15
MOVWFTEMP;子程序返回;初始化TEMP寄存器MOVFACCBHI,0 ;ACCB送ACCDMOVWFACCDHIMOVFACCBLO,0MOVWFACCDLOCLRFACCBHI ;清ACCBCLRFACCBLORETURN ;子程序返回S_SIGNMOVFACCAHI,0;ACCAHI异或ACCBHI,结果送SIGN单元XORWFACCBHI,0MOVWFSIGNBTFSSACCBHI,7;ACCB为负吗GOTOCHEK_A ;否,检查ACCACALLNEG_B;是,求取ACCB绝对值CHEK_ABTFSCACCAHI,7;ACCA为负吗CALLNEG_A ;ACCA为负,求取ACCA绝对值,RETURN ;ACCA和ACCB均为正,返回16×16位定点数除法程序LISTp=16f877INCLUDE16fACCALOEQU20;存放除数低8位ACCAHIEQU21ACCBLOEQU22ACCBHIEQU23ACCCLOEQU24ACCCHIEQU25ACCDLOEQU26ACCDHIEQU27TEMPEQU28;存放除数高8位;存放被除数和商的低8位;存放被除数和商的高8位;存放余数低8位;存放余数高8位;临时寄存器;临时寄存器;临时寄存器SIGNEQU29ORG0X0000;存放商的符号STARTGOTOMAINORG0X0100D_divCALLS_SIGN ;确定商的符号,并将负数取补CALLSETUP ;初始化TEMP,将被除数移至ACCDINCFTEMPCLRFACCCHI ;清余数寄存器CLRFACCCLODLOOPBCFSTATUS,C
RLFACCDLO ;被除数、RLFACCDHI
RLFACCCLO
RLFACCCHI
MOVFACCAHI,0
SUBWFACCCHI,0
BTFSSSTATUS,Z
GOTONOCHK
MOVFACCALO,0
SUBWFACCCLO,0
NOCHKBTFSSSTATUS;清进位位余数左移1位;ACCCHI-ACCAHI;ACCCHI=ACCAHI;是,ACCCLO-ACCALOC;ACCC>ACCAGOTONOGOMOVFACCALO,0 ;是,余数减除数SUBWFACCCLOBTFSSSTATUS,CDECFACCCHIMOVFACCAHI,0SUBWFACCCHIBSFSTATUS,C ;置进位位NOGORLFACCBLO ;商左移1位RLFACCBHIDECFSZTEMP ;循环完毕GOTODLOOPBTFSSSIGN,7 ;是,确定商的符号GOTODIVOVER
COMFACCCLO
INCFACCCLO
BTFSCSTATUS,Z
DECFACCCHI
COMFACCCHI
CALLNEG_B
DIVOVERRETURN;为正,除法结束,跳转到结束行;为负,商和余数分别取补;见乘法程序中间NEG_B
;子程序返回S_SIGNMOVFACCAHI,0;ACCAHI异或ACCBHI,结果送SIGN单元XORWFACCBHI,0MOVWFSIGNBTFSSACCBHI,7 ;ACCB为负GOTOCHEK_A ;否,检查ACCACOMFACCBLO ;是,ACCB取补INCFACCBLOBTFSCSTATUS,ZDECFACCBHICOMFACCBHICHEK_ABTFSCACCAHI,7;ACCA为负CALLNEG_A ;ACCA为负,取补(NEG_A子程序请参见;16x16位定点数乘法子程序NEG_A)RETURN ;ACCA和ACCB均为负,返回(4)浮点数加减法程序LISTp=16f877INCLUDE16fACCALOEQU20;存放加数或减数的尾数ACCAHIEQU21EXPAEQU22;存放加数或减数阶码ACCBLOEQU23;存放被加数或被减数尾数以及和或差ACCBHIEQU24EXPBEQU25;存放被加数或被减数阶码ACCCLOEQU26;临时寄存器ACCCHIEQU27;临时寄存器ACCDLOEQU28;临时寄存器ACCDHIEQU29TEMPEQU2ATEMP1EQU30TIMESEQU31;临时寄存器;临时寄存器;临时寄存器;临时寄存器ORG0X000STARTGOTOMAINORG0X0100F_subCALLNEG_A;求ACCA的补码,将减法转换为补码加法F_addCALLSUBADJ;调子程序判断EXPB和EXPA的大小BTFSCSTATUS,Z;参与运算的两个数阶码相等GOTOPADD ;是,求尾数的和BTFSCSTATUS,C;EXPB>EXPACALLF_swap ;是,ACCB与ACCA互换MOVFEXPA,0 ;否,求取两者的差值SUBWFEXPBSCLOOPCALLSHFTSR;ACCB右移规格化INCFSZEXPBGOTOSCLOOPMOVFEXPA,0MOVWFEXPB;EXPB=EXPA;否,继续右移;是,存和(差)的阶码Paddmovfaccahi,ο;ACCAHI或ACCBHIIORWFACCBHI,0MOVWFSIGNMOVFACCBHI,0MOVWFEXPACALLD_addBTFSSSIGN,7BTFSCACCBHI,7GOTOADD2BTFSSACCAHI,7GOTOADD3BTFSSEXPA,7GOTOADD3BSFSTATUS,CRRFACCBHIRRFACCBLOINCFEXPBADD3CLRFACCCHICLRFACCCLOCALLF_normRETURNADD2BCFSTATUS,INCFEXPB;存于SIGN寄存器;暂存ACCBHI;尾数相加;ACCA和ACCB有负数;否,把和的最高位和次高位同时进位;否,转ADD2;ACCA为负吗;ACCA和ACCB不同时为负,转ADD3;是,ACCB为负吗;ACCA和ACCB同为负,带负号右移;和(差)规格化;子程序返回C;最高位次高位不同时进位,ACCB右移GOTOSHFTRShftsrbcfstatus,C;ACCB带符号右移子程序BTFSCACCBHI,7BsFsTATus,CsHFTRRRFACCBHIRRFACCBLORETuRN ;子程序返回F_swapMOVFACCAHI,0 ;ACCAHI、ACCBHI互换MOVWFTEMPMOVFACCBHI,0MOVWFACCAHIMOVFTEMP,0MOVWFACCBHImovfaccalo,o ;ACCALo、ACCBLO互换MOVWFTEMPMOVFACCBLO,0MOVWFACCALOMOVFTEMP,0MOVWFACCBLOMOVFEXPA,0;EXPA、EXPB互换MOVWFTEMPMOVWFEXPAMOVFTEMP,0MOVWFEXPBRETURNSUBADJMOVFEXPA;EXPA异或EXPB,结果送C_DIV,0XORWFEXPB,0MOVWFCDIVMOVFEXPA,0;EXPB-EXPASUBWFEXPB,0BTFSSCDIV,7;EXPA和EXPB同号RETURN;是,进位位的值真确反映两者的大小,返回BTFSSSTATUS,C;否,进位位的值取反GOTOCHANGECBCFSTATUS,CRETURNCHANGECBSFSTATUS,CRETURNFnormMOVFACCBHI;ACCB=OBTFSSSTATUS,ZGOTOCnormMOVFACCBLOBTFSCSTATUS,ZRETURN;是,不需规格化,返回CjormBTFSCACCBHI,7;否。ACCB为负GOTOC_norm2CnormIBTFSCACCBHI,6;为正。规格化完毕RETURN ;=1,CALLSHFTSL ;否。DECFEXPBGOTOC_norm1C_norm2BTFSSACCBHI,6RETURNBCFSTATUS,CCALLSHFTSLBSFACCBHI,7DECFEXPBGOTOC_norm2规格化结束ACCB左移;EXPB减1;重新判断规格化完毕否;ACCB为负。规格化完毕否;=0,规格化结束;否,ACCB左移;加符号;EXPB减1;重新判断规格化完毕否SHFTSLBCFSTATUS,C;ACCB左移子程序RLFACCCLORLFACCCHIRLFACCBLORLFACCBHIRETURN(5)浮点数乘法程序LISTp=16f877INCLUDE16fACCALOEQU20ACCAHIEQU21EXPAEQU22ACCBLOEQU23ACCBHIEQU24EXPBEQU25ACCCLOEQU26ACCCHIEQU27ACCDLOEQU28ACCDHIEQU29TEMPEQU2ATEMP1EQU30TIMESEQU31SIGNEQU2BCOUNTEQU2FACCEHIEQU30ACCELOEQU31ORG0X0000STARTGOTOMAINORG0X0100;存放乘数尾数;存放乘数阶码;存放被乘数尾数和乘积高16位;存放被乘数阶码;存放乘积低16位;临时寄存器;临时寄存器;临时寄存器;临时寄存器;临时寄存器;存放乘积符号;临时寄存器;临时寄存器;临时寄存器F_mpyCALLS_SIGNCALLSETUPCLRFACCCHICLRFACCCLOMLOOPBCFSTATUS,RRFACCDHIRRFACCDLOBTFSCSTATUS,CCALLD_addBCFSTATUS,CRRFACCBHIRRFACCBLORRFACCCHIRRFACCCLODECFSZTEMPGOTOMLOOPMOVFEXPA,0ADDWFEXPBMOVFACCBHIBTFSSSTATUS,ZGOTOFINUPMOVFACCBLO;求取乘积的符号,并对负数取补;调用子程序将ACCB的值送ACCD;清ACCCC;清进位位;ACCD右移;判断是否需要相加;加乘数至ACCB;清进位位;右移部分乘积;乘法完成否;否,继续循环;是,乘数与被乘数阶码相加,得积的阶码;ACCBHI=0;否,转FINUP;ACCB=OBTFSSSTATUS,ZGOTOSHFT08;否,只有ACCBHI=0,转SHFT08MOVFACCCHI,0;ACCB=0,将乘积左移15位MOVWFACCBHIMOVFACCCLO,0MOVWFACCBLOBCFSTATUS,CRRFACCBHIRRFACCBLOMOVLW.15SUBWFEXPBGOTOFINUPSHFT08MOVFACCBLO,0MOVWFACCBHIMOVFACCCHI,0MOVWFACCBLOBCFSTATUS,CRRFACCBHIRRFACCBLOMOVLW.7SUBWFEXPBFINUPCALLF_norm;乘积阶码减15(十进制数);只有ACCBHI=0,乘积左移7位;乘积阶码减7;对乘积进行规格化BTFSSSIGN,7GOTOOVERCOMFACCCLOINCFACCCLO;确定乘积的符号;为正,乘法结束;为负,乘积取补BTFSCSTATUS,ZDECFACCCHICOMFACCCHIBTFSCSTATUS,ZNEGBDECFACCBLOCOMFACCBLOBTFSCSTATUS,ZDECFACCBHICOMFACCBHIOVERRETURNS_SIGNMOVFACCAHI,0XORWFACCBHI,0MOVWFSIGNBTFSSACCBHI,7GOTOCHEK_ACOMFACCBLOINCFACCBLO;乘法结束,子程序返回;ACCAHI异或ACCBHI,结果送SIGN;ACCB为负;否,检查ACCA;是,ACCB取补BTFSCSTATUS,ZDECFACCBHICOMFACCBHICHEK_ABTFSCACCAHI,7;ACCA为负CALLNEG_A ;ACCA取补RETURN ;返回FnormMOVFACCBHI;ACCB=OBTFSSSTATUS,ZGOTOCnormMOVFACCBLOBTFSCSTATUS,ZRETURN;是,不需规格化,返回CnormBTFSCACCBHI,;否。ACCB为负7GOTOCnorm2C_norm1BTFSCACCBHI,6;为正。规格化完毕RETURN ;=1,规格化结束CALLSHFTSL ;否。ACCB左移Decfexpb ;EXPB减1GOTOC_norm1 ;重新判断规格化完毕否C_norm2BTFSSACCBHI,6 ;ACCB为负。规格化完毕否RETURN ;=0,规格化结束BCFSTATUS,CCALLSHFTSL;否,ACCB左移BSFACCBHI,7 ;加符号DECFEXPB ;EXPB减1GOTOC_norm2 ;重新判断规格化完毕否SHFTSLBCFSTATUS,C;ACCB左移子程序RLFACCCLORLFACCCHIRLFACCBLORLFACCBHIRETURN(6)浮点数除法程序LISTp=16f877INCLUDE16fACCALOEQU20ACCAHIEQU21EXPAEQU22ACCBLOEQU23ACCBHIEQU24EXPBEQU25ACCCLOEQU26ACCCHIEQU27ACCDLOEQU28ACCDHIEQU29;存放除数的尾数;存放除数的阶码;存放被除数的尾数和商的尾数;存放被除数和商的阶码;存放余数;临时寄存器;临时寄存器TEMPEQU2A ;临时寄存器TEMP1EQU30 ;临时寄存器TIMESEQU31 ;临时寄存器SIGNEQU2B ;存放商的符号COUNTEQU2FACCEHIEQU30ACCELOEQU31ORG0X0000STARTGOTOMAINORG0X0100F_divCALLS_SIGNCLRFACCCHICLRFACCCLOCALLF_normCLRFACCCLOCLRFACCCHICLRFTIMESMOVFACCAHIBTFSSSTATUS,ZGOTOFD0MOVFACCALO;临时寄存器;临时寄存器;临时寄存器;确定商的符号,;初始化ACCC寄存器;规格化ACCB;除数为零;否,求商并将负数取补BTFSCSTATUS,ZRETLW01;是,返回FD0CALLNEG_A;除数取补FD1MOVFACCBHI,0;ACCBHI送ACCDLOMOVWFACCDLOCALLD_add1BTFSSSTATUS,C;被除数尾数大于除数尾数GOTOFD2CRRF1BCFSTATUS,;是,被除数右移规格化,直到小于除数为止RRFACCBHIRRFACCBLOINCFTIMESRRFACCCHIBCFSTATUS,CGOTOFD1FD2CALLDDIV;否,调用双字节除法子程序,求商的尾数MOVFTIMES,0;根据右移规格化次数调整ACCB阶码ADDWFEXPBMOVFEXPA,0;求商的阶码SUBWFEXPBCALLF_normBTFSCSIGN,7CALLNEG_B;商规格化;商为负;是,取补CALLNEG_A;除数还原RETURNDDIVMOVLW0X0FMOVWFACCDHIDV1BCFSTATUS,CRLFACCCLORLFACCCHIRLFACCBLORLFACCBHIMOVFSTATUS,0MOVWFACCDLOMOVFACCBHI,0MOVWFTEMP1MOVFACCALO,0ADDWFACCBLO,0MOVWFTEMPBTFSCSTATUS,CINCFTEMP1MOVFACCAHI,0ADDWFTEMP1,0BTFSCACCDLO,0GOTODV2;浮点数除法完成,返回;初始化ACCDHI;左移商;左移余数;暂存STATUS寄存器;ACCBHI送TEMPI;ACCB-ACCA;左移余数时移出来的数为1TESTCBTFSSSTATUS,C;是,再判断ACCB尾数是否大于ACCAGOTODV3DV2MOVWFACCBHIMOVFTEMP,0MOVWFACCBLOINCFACCCLODV3DECFSZACCDHIGOTODV1MOVFACCCHI,0MOVWFACCBHIMOVFACCCLO,0MOVWFACCBLORETLW00D_add1MOVFACCALO,0;是,余数送ACCB;商加1;商求取完毕;是,将商送ACCB;加数、被加数低半字节相加ADDWFACCBLO,0BTFSCSTATUS,CINCFACCDLO;有进位;ACCD低半字节加1MOVFACCAHI,0ADDWFACCDLORETLW0;ACCAHI+ACCDLO;子程序返回SETUPMOVLW.15MOVFACCBHI,0MOVWFACCDHIMOVFACCBLO,0MOVWFACCDLOCLRFACCBHICLRFACCBLORETLW0NEG_ACOMFACCALOINCFACCALOBTFSCSTATUS,ZDECFACCAHI ;有,COMFACCAHI ;否,RETLW0NEG_BDECFACCBLOCOMFACCBLOBTFSCSTATUS,ZDECFACCBHI ;有,COMFACCBHI;ACCALO取反加1;低8位有进位吗ACCAHI减1,再取反ACCAHI直接取反;ACCBLO取反加1;低8位有进位吗ACCBHI减1,再取反;否,ACCBHI直接取反RETLW0S_SIGNMOVFACCAHI,0 ;ACCAHI异或ACCBHI,结果送SIGN单元XORWFACCBHI,0;ACCB为负;否,检查ACCA;是,ACCB取补BTFSSACCBHI,7GOTOCHEK_ACOMFACCBLOINCFACCBLOBTFSCSTATUS,ZDECFACCBHICOMFACCBHICHEK_ABTFSCACCAHI,7CALLNEG_ARETLW0F_normMOVFACCBHIBTFSSSTATUS,ZGOTOC_normMOVFACCBLOBTFSCSTATUS,ZRETLW0C_normBTFSCACCBHI,7GOTOC_norm2C_norm1BTFSCACCBHI,RETLW0CALLSHFTSL;ACCA为负;ACCA为负,取补;ACCA和ACCB均为负,返回;ACCB=O;是,不需规格化,返回;否。ACCB为负6 ;为正。规格化完毕;=1,规格化结束;否。ACCB左移DECFEXPB;EXPB减1GOTOC_norm1;重新判断规格化完毕否C_norm2BTFSSACCBHI,6 ;ACCB为负。规格化完毕否RETLW0 ;=0,规格化结束BCFSTATUS,CCALLSHFTSLBSFACCBHI,7DECFEXPBGOTOC_norm2SHFTSLBCFSTATUS,C;否,ACCB左移;加符号;EXPB减1;重新判断规格化完毕否;ACCB左移子程序RLFACCCLORLFACCCHIRLFACCBLORLFACCBHIRETLW0(7)定点数转化为浮点数程序LISTp=16f877INCLUDE16fACCBLOEQU23;存放定点整数和转换后浮点数的尾数ACCBHIEQU24EXPBEQU25;存放转换后浮点数的阶码ACCCLOEQU26;临时寄存器ACCCHIEQU27;临时寄存器ACCDLOEQU28 ;临时寄存器ACCDHIEQU29 ;临时寄存器SIGNEQU2B ;存放被转换数的符号ORG0X0000STARTGOTOMAINORG0X0100DtoFCLRFSIGN;根据被转换数确定结果的符号,对负数取补BTFSSACCBHI,7GOTOINTF1BSFSIGN,7CALLNEG_BINTF1MOVLW.15MOVWFEXPBCLRFACCCHICLRFACCCLO;初始化EXPBCALLFnorm;对ACCB进行规格化BTFSSSIGN,7;结果为负GOTODtoF1CALLNEG_BDtoF1RETURN;是,求补F_normMOVFACCBHI;ACCB=OBTFSSSTATUS,ZGOTOC_normMOVFACCBLOBTFSCSTATUS,ZRETLW0 ;是,不需规格化,返回CjormBTFSCACCBHI,7 ;否。ACCB为负GOTOC_norm2C_norm1BTFSCACCBHI,6;为正。规格化完毕RETLW0 ;=1,规格化结束CALLSHFTSL ;否。ACCB左移DECFEXPB ;EXPB减1GOTOC_norm1 ;重新判断规格化完毕否C_norm2BTFSSACCBHI,6 ;ACCB为负。规格化完毕否RETLW0 ;=0,规格化结束BCFSTATUS,CCALLSHFTSLBSFACCBHI,7DECFEXPBGOTOC_norm2;否,ACCB左移;加符号;EXPB减1;重新判断规格化完毕否SHFTSLBCFSTATUS,C;ACCB左移子程序RLFACCCLORLFACCBLORLFACCBHIRETLW0(8)3字节浮点数转换为定点整数程序FtoDCLRFSIGN ;清结果符号寄存器MOVFACCBHI,0BTFSSACCBHI,7 ;被转换数是否为负GOTOD1BSFSIGN,7 ;是,置1CALLNEG_B ;被转换数取补D1BTFSSEXPB,7 ;被转换数为正,再判阶码为负否GOTOD2CLRFACCBHI;为负,被转换数小于1,无法用定点数表示CLRFACCBLORETLW0D2MOVLW.16;被转换数阶码减16(十进制数)SUBWFEXPB,0BTFSSSTATUS,C;阶码小于16GOTOD3MOVLWOXFF ;阶码大于等于16,置ACCB为最大,返回MOVWFACCBHIRETLW01D3CALLFTOW3;调用子程序将浮点数转换为定点数BTFSCSIGN,7;定点数为负CALLNEGB;是,取补RETLW0;否,返回FTOW3MOVLW.15;EXPB=15(十进制数)SUBWFEXPB,0BTFSCSTATUS,ZRETLW0;是,返回BCFSTATUS,C;否,ACCB继续右移,EXPB加1RRFACCBHIRRFACCBLOINCFEXPBGOTOFTOW3;重新判断EXPB=15(9)双字节定点数至5位BCD码转换程序LISTp=16f877INCLUDE16fACCBLOEQU23;存放被转换的双字节整数低8位ACCBHIEQU24;存放被转换的双字节整数高8位ACCCLOEQU26;存放5位BCD码ACCCHIEQU27ACCDHIEQU29TEMPEQU2A;临时寄存器SIGNEQU2BORG0X0000STARTGOTOMAINORG0X0100BtoBCDCLRFSIGNBTFSSACCBHI,7GOTOLOOP1BSFSIGN,7CALLNEG_BLOOP1BCFSTATUS,CMOVLW.16MOVWFCOUNTCLRFACCCHICLRFACCCLOCLRFACCDHILOOP16RLFACCBLORLFACCBHI;被转换数符号寄存器;初始化符号寄存器;被转换数为负;否,转BtoBCD;是,存符号;ACCB取补;清进位位;移位计数器赋初值;初始化出口寄存器;ACCB左移一位至出口寄存器RLFACCDHIRLFACCCLODECFSZCOUNT;移位计数器=0GOTOADJDECRETLW0;是,ADJDECMOVLWACCDHIMOVWFFSRCALLADJBCDMOVLWACCCLOMOVWFFSRCALLADJBCDMOVLWACCCHIMOVWFFSRCALLADJBCDGOTOLOOP16ADJBCDMOVLW00X03ADDWFINDF,0MOVWFTEMPBTFSCTEMP,3MOVWFINDF ;是,MOVLW0X30 ;否,ADDWFINDF,0MOVWFTEMPBTFSCTEMP,7;否,转ADJDEC返回;指针指向ACCDHI;调用BCD码校正子程序;指针指向ACCCLO;LSD+3>7;调用BCD码校正子程序;指针指向ACCCHI;调用BCD码校正子程序;ACCB重新左移LSD=LSD+3MSD+3>7MOVWFINDF;是,MSD=MSD+3RETLW0 ;返回(10)浮点数至5位压缩BCD码转换程序LISTp=16f877INCLUDE16fACCALOEQU20 ;临时寄存器ACCAHIEQU21EXPAEQU22 ;临时寄存器ACCBLOEQU23;存放被转换浮点数尾数ACCBHIEQU24EXPBEQU25 ;存放被转换浮点数阶码ACCCLOEQU26;临时寄存器ACCCHIEQU27;临时寄存器ACCDLOEQU28;临时寄存器ACCDHIEQU29;临时寄存器TEMPEQU2A ;临时寄存器TEMP1EQU30 ;临时寄存器TIMESEQU31 ;临时寄存器SIGNEQU2B ;临时寄存器COUNTEQU2F ;临时寄存器C_DIVEQU2D;存放小数点位置FPOLEQU2E;存放被转换数的符号ORG0X0000STARTGOTOMAINORG0X0100FtoBCDCLRFCMUL;清小数点位置数寄存器CLRFCDIVCLRFACCAHI;求取结果符号,存于CALLSSIGNMOVFSIGN,0MOVWFFPOLMOVLW50;ACCA赋初值,ACCA=10(十进制)MOVWFACCAHICLRFACCALOMOVLW04MOVWFEXPAMUl5BTFSSEXPB,7;阶码EXPB<0GOTOMUl2;否,转MU12MUl1CALLF_mpy^ACCA×10INCFCMUL;小数点左移,寄存器加1GOTOMUl5;重新判断阶码是否小于零MUl2MOVLW.12;阶码EXPB<12SUBWFEXPB,0BTFSCSTATUS,CGOTOMUl4MUl3CALLF_mpyINCFC_MULGOTOMUL2;否,转MU14^ACCA×10;小数点左移,寄存器加1;重判阶码值MUl4MOVLW.16;阶码EXPB>16SUBWFEXPB,0BTFSSSTATUS,CGOTONEXT ;否,表示阶码12≤EXPB<16,求取BCD码值DIV1CALLFDIV出EXPB÷10INCFC_DIV ;小数点右移寄存器加1GOTOMUl4 ;重新判断阶码值NEXTCALLFTOW3;调子程序,将浮点数转换为定点数CALLBtoBCD ;调双字节数到BCD码子程序,求BCD码MOVFACCCHI ;ACCCHI=0BTFSSSTATUS,ZRETLW0 ;否,返回MOVLW04 ;是,结果左移4次,保证ACCCHI不为0MOVWFTIMESBCFSTATUS,CMUl6RLFACCDHIRLFACCCLORLFACCCHIDECFSZTIMESGOTOMUl6MOVFCDIV;C_DIV=0BTFSCSTATUS,ZGOTOTEMUL;是,转判断C_MULDECFCDIV;否,小数点右移,寄存器减1RETLW0TEMULINCFCMUL;小数点左移,寄存器加1RETLW0(11)进制码和BCD码转换程序LISTP=16F877INCLUDE“16F”#DEFINEBiTOBCD’YR2 EQU 0x20R1 EQU 0x2lR0 EQU 0x22BinH EQU 0x237CNTEQU0x25TMPEQU0x26BinBHEQU0x27BinBLEQU0x28; ORG0x00GOTOMAINORG0x10BiBCDMOVLWMOVWFBCFCLRFCLRFCLRFLOOPRLFRLF0x10;CNTSTATUS, CR0R1R2BinLBinH;移位次数RLF R0RLF R1RLF R2DECFSZ CNTGOTO ADJDECRETURNADJDECMOVLWR0;调整R0MOVWFFSRCALLADJBCDMOVLWR1;调整RlMOVWFFSRCALLADJBCDMOVLWR2;调整R2MOVWF FSRCALL ADJBCDGOTO LOOPADJBCDMOVLW0x3ADDWFINDF,WMOVWFTMPMOVWFINDF ;LSD=LSD+3MOVLW0x30ADDWFINDF,WMOVWFTMPMOVWFINDF ;MSD=MSD+3RETURNBCDBiCLRFBinHMOVFR2,WANDLW0x0FMOVWFBinLCALL MPY10A×10SWAPF RI,WCALLMPY10B[(Bin)+R1<74>]×10MOVFR1, WCALL MPY10B[(Bin)+R1<3:0>]*10SWAPF R0, WCALL MPY10B[(Bin)+R0<7:4>]*10MOVF R0, W(Bin)+R0<3:0>ANDLW0x0FADDWFBinLBTFSCSTATUS,CINCFBinHRETURNMPY10BANDLW0x0FADDWFBinL(BinL)=R2<3:0>;(Bin)=(Bin;(Bin)=;(Bin)=;(Bin)=;(Bin)=BTFSCSTATUS,CINCFBinHMPYl0ABCFSTATUS,CRLFBinL,WMOVWFBinBLRLFBinH,WMOVWFBinBH;(Bin)×2——(BinB)BCFSTATUS,CRLFBinLRLFBinHBCFSTATUS,CBCFSTATUS,CRLFBinLRLFBinH;(Bin)*8——(Bin)MOVFBinBL,WADDWFBinLBTFSCSTATUS, CINCFBinHMOVFBinBH, WADDWFBinHRETURNMAINORG0x100;主程序IFBiTOBCD=='Y’;二进制转换为BCD码MOVLW 0x7FMOVWF BinHMOVLW 0xFFMOVWF BinLCALLBiBCDENDIFIFBITOBCD=='N'MOVLW0x6MOVWFR2MOVLW0x55MOVWFR1MOVLW0x35MOVWFR0CALLBCDBiENDIFGOTO $END(12)定点数开方程序LISTp=16f877INCLUDE16fACCALOEQU0X20ACCAHIEQUACCALO+1;结果在R2,R1,R0中;BCD码转换为二进制数;结果在BinH、BinL中EXPAEQUACCALO+2ACCBLOEQUACCALO+3ACCBHIEQUACCALO+4EXPBEQUACCALO+5ACCCLOEQUACCALO+6ACCCHIEQUACCALO+7ACCDLOEQUACCALO+8ACCDHIEQUACCALO+9TEMPEQUACCDHI+1SIGNEQUACCDHI+2SQRTLOEQUACCALOSQRTHIEQUACCAHINUMLOEQUACCDHI+4NUMHIEQUACCDHI+5COUNTEQUACCDHI+6 ;此方法定义的数据块为连续层断,只要;将第一行改变,就可以将数据整块搬动到;新的地方,为调试带来方便,是比较推;崇的一种寄存器定义方法LUPCNTEQU.10*x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x*;****************************************ORG0X00GOTOMAINORG0X10*x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x*;****************************************INITMOVLWLUPCNTMOVWFCOUNTMOVFNUMHI,0MOVWFSQRTHIMOVFNUMLO,0MOVWFSQRTLOBCFSTATUS,CRRFSQRTHI,1RRFSQRTLO,1RETLW0DIV2BCFSTATUS,CRRFACCBHI,0MOVWFSQRTHIRRFACCBLO,0MOVWFSQRTLORETLW0SQRTCALLINITSLOOPMOVFNUMLO,0MOVFNUMHI,0MOVWFACCBHICALLD_DIVSCALLD_ADDCALLDIV2DECFSZCOUNT,1GOTOSLOOPRETURND_DIVSCALLSETUPCLRFACCCHICLRFACCCLODLOOPBCFSTATUS,CRLFACCDLORLFACCDHIRLFACCCLORLFACCCHIMOVFACCAHI,0SUBWFACCCHI,0BTFSSSTATUS,ZGOTONOCHKMOVFACCALO,0SUBWFACCCLO,0NOCHKBTFSSSTATUS,CGOTONOGOMOVFACCALO,0SUBWFACCCLO,1BTFSSSTATUS,CDECFACCCHI,1MOVFACCAHI,0SUBWFACCCHI,1BSFSTATUS,CNOGORLFACCBLORLFACCBHIDECFSZTEMPGOTODLOOPRETLW0;****************************************SETUPMOVLW16MOVWFTEMPMOVFACCBHI,0MOVWFACCDHIMOVFACCBLO,0MOVWFACCDLOCLRFACCBHICLRFACCBLORETLW0NEG_ACOMFACCALO,1INCFACCALO,1BTFSCSTATUS,ZDECFACCAHI,1COMFACCAHI,1RETLW0D_ADDMOVFACCALO,0ADDWFACCBLO,1BTFSCSTATUS,CINCFACCBHI,1MOVFACCAHI,0ADDWFACCBHI,1RETLW0(13)浮点数开方程序LISTP=16f877INCLUDE16fACCALOEQU20HACCAHIEQUACCALO+1EXPAEQUACCALO+2ACCBLOEQUACCALO+3ACCBHIEQUACCALO+4EXPBEQUACCALO+5ACCCLOEQUACCALO+6ACCCHIEQUACCALO+7ACCDLOEQUACCALO+8ACCDHIEQUACCALO+9TEMPEQUACCALO+0ATEMP1EQUACCALO+0BTIMESEQUACCALO+0CSIGNEQUACCALO+0DCOUNTEQUACCALO+0EC_MULEQUACCALO+0FC_DIVEQUACCALO+10FPOLEQUACCALO+11 ;符号放置位NUMLOEQUFPOL+1NUMHIEQUFPOL+2NUMMEQUFPOL+4LUPCNTEQU.10CONSTANTC=0CONSTANTZ=2CONSTANTMODEL16=1CONSTANTFALSE=0;*x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x*
*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*τ⅛*τ⅛*τ⅛*τ⅛*τ⅛*τ⅛ORG0X0000NOPGOTOMAINORG0X0010*x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x*;****************************************INIT1DECFEXPB ;假设迭代根的初始值为其原值的一半MOVFACCBHI,WMOVWFACCAHIMOVFACCBLO,WMOVWFACCALOMOVFEXPB,WMOVWFEXPARETLW0SQRTFMOVLWLUPCNTMOVWFCOUNTMOVFACCBHI,WMOVWFNUMHIMOVFACCBLO,WMOVWFNUMLOMOVFEXPB,WMOVWFNUMM ;存储被开方的数BTFSCACCBHI,7GOTOTIQIAN;如果被开方数是个负数,则返回小数CALLINIT1SLOOP1MOVFNUMLO,0MOVWFACCBLOMOVFNUMHI,0MOVWFACCBHIMOVFNUMM,0MOVWFEXPBCALLFDIVCALLF_addCALLINIT1DECFSZCOUNT,1GOTOSLOOP1RETURNTIQIANMOVLW0X40MOVWFACCBHICLRFACCBLOMOVLW0X80MOVWFEXPB;如果被开方数是一个负数,返回一个极小的浮点数RETURN(14)均值滤波程序INDFEQU00H;定义INDF寄存器STATUSEQU03H;定义状态寄存器FSREQU04H;定义FSR寄存器TRISAEQU05H;定义TRISA寄存器RP1EQU06H;定义状态寄存器中的页选位RP1RP0EQU05H;定义状态寄存器中的页选位RP0INTCONEQU0BH;定义中断寄存器PIR1EQU 0CH;定义PIR中断寄存器ADRESHEQU1EH;定义ADRESH寄存器ADCON0EQU1FH;定义ADCONO寄存器ADRESLEQU9EH;定义ADRESL寄存器PIE1EQU 8CH;定义PIE1寄存器ADCON1EQU9FH;定义ADCON1寄存器GIEEQU07H;定义中断寄存器中断使能位CEQU00H;定义状态寄存器中的进借位标志位CZEQU02H;定义状态寄存器中的零标志位ZHHEQU20H;定义16位输入高8位LLEQU21H;定义16位输入低8位AAEQU22H;定义BCD码最高位BBEQU23H;定义BCD码4/3位CCEQU24H;定义BCD码2/1位TEMPHEQU25H;定义临时变量TEMPHTEMPLEQU26H;定义临时变量TEMPLCOUNTEQU27H;定义计数器变量COUNTADHEQU28H;定义临时变量ADHADLEQU29H;定义临时变量ADLST_TEMPEQU2AH;定义临时变量ST_TEMPW_TEMPEQU2BH;定义临时变量W_TEMPDATA1EQU2CH;定义外循环变量DATA2EQU2DH;定义存储外循环次数的变量COUNT2EQU08H;定义存储内循环次数的变量ADIEEQU06H;定义ADIEPEIEEQU 06H;定义PDIEORG00HGOTOMAINORG04HGOTOINTERRETFIEMOVLW01H;初始化ADCON0MOVWFADCON0 ;BCFSTATUS,RP1 ;选择体1BSFSTATUS,RP0;MOVLW0XFF;将RA口设置为输入MOVWFTRISA;MOVLW0FFH;初始化ADCONIMOVWFADCON1;BSFPIE1,ADIE;开AD中断BCFSTATUS,RP1;选择体0BCFSTATUS,RP0;CLRFPIR1;清AD中断标志BSFINTCON,GIE;开中断BSFINTCON,PEIE;开外围中断MOVLW00H;初始化COUNT寄存器MOVWFCOUNT;BSFADCON0,2;开ADLOOPBTFSSCOUNT,3;是否已经采样8次了GOTONEXT;否,等待BCFINTCON,GIE;关中断BCFADCON0,2aADBCFSTATUS,C;清除进位位RRFADH;ADH/L除以2RRFADLRRFADH;ADH/L除以2RRFADLRRFADH;ADH/L除以2RRFADLMOVFADH;存储滤波量ADHMOVWFTEMPH;MOVFADL;存储滤波量ADLMOVWFTEMPL;CLRFADH ;清ADH寄存器,为下一次作准备CLRFADL;清ADL寄存器MOVLW00H;初始化COUNT寄存器MOVWFCOUNTBSFINTCON,GIE;开中断NEXTCALLDELAY;GOTOLOOP;等待INTERMOVWFW_TEMP;暂存W寄存器MOVFSTATUS,0;暂存STATUS寄存器MOVWFST_TEMPBCFSTATUS,RP1;选择体0BCFSTATUS,RP0;BCFPIR1,6;清AD中标志位BTFSSCOUNT,4;计数达到8GOTONEXT1;否,采样周期没完,求和CLRFADH;是,新的采样周期开始,清ADH寄存器CLRFADL;清ADL寄存器GOTORETURN1;是,则恢复现场,返回NEXT1BSFSTATUS,RP1;选择体1BCFSTATUS,RP0;MOVFADRESL,0;AD采样结果低8位送W寄存器BCFSTATUS,RP1;选择体0BCFSTATUS,RP0;ADDWFADL;加至ADL寄存器BTFSCSTATUS,C;有进位INCFADH;有,加进位位MOVFADRESH,0;加AD结果高半字节ADDWFADHINCFCOUNT;计数器自加1MOVFST_TEMP,0;恢复STATUS寄存器值MOVWFSTATUSMOVFW_TEMP,0;恢复W寄存器值RETFIE;中断返回DELAYMOVLWCOUNT1MOVWFDATA1LOOP1MOVLWCOUNT2MOVWFDATA2LOOP2DECFSZDATA2,1则跳转GOTOLOOP2DECFSZDATA1,1则跳转GOTOLOOP1RETURNEND(15)中值滤波程序INDFEQU00HSTATUSEQU03HFSREQU04HTRISAEQU05HRP1EQU06H;设置外部循环的次数;;设置内部循环的次数;;内部循环变量自减1,为0;;外部循环变量自减1,为0;;延时子程序返回;源程序结束;定义INDF寄存器;定义状态寄存器;定义FSR寄存器;定义TRISA寄存器;定义状态寄存器中的页选位RP1RP0EQU05H;定义状态寄存器中的页选位RP0INTCONEQU0BH;定义中断寄存器PIR1EQU0CH;定义PIR中断寄存器ADRESHEQU1EH;定义ADRESH寄存器ADCON0EQU1FH;定义ADCONO寄存器ADRESLEQU9EH;定义ADRESL寄存器PIE1EQU8CH;定义PIE1寄存器ADCON1EQU9FH;定义ADCON1寄存器GIEEQU07H;定义中断寄存器中断使能位CEQU00H;定义状态寄存器中的进借位标志位CZEQU02H;定义状态寄存器中的零标志位ZHHEQU20H;定义16位输入高8位LLEQU21H;定义16位输入低8位AAEQU22H;定义BCD码最高位BBEQU23H;定义BCD码4/3位CCEQU24H;定义BCD码2/1位TEMPHEQU25H;定义临时变量TEMPHTEMPLEQU26H;定义临时变量TEMPLCOUNTEQU27H;定义计数器变量COUNTAD1HEQU28H;定义临时变量AD1HAD1LEQU29H;定义临时变量AD1LAD2HEQU2AH;定义临时变量AD2HAD2LEQU2BH;定义临时变量AD2LAD3HEQU2CH;定义临时变量AD3HAD3LEQU2DH;定义临时变量AD3LST_TEMPEQU2EH;定义临时变量ST_TEMPW_TEMPEQU2FH;定义临时变量W_TEMPDATA1EQU30H;定义外循环变量DATA2EQU31H;定义内循环变量OUTHEQU32H;定义输出高8位OUTLEQU33H;定义输出低8位COUNT1 EQU04H;定义存储外循环次数的变量COUNT2 EQU08H;定义存储内循环次数的变量ADIE EQU06H;定义ADIEPEIE EQU06H;定义PDIEORG00HGOTOMAINORG04HGOTOINTERRETFIEMOVLW01H;初始化ADCONOMOVWFADCON0;BCFSTATUS,RP1;选择体1BSFSTATUS,RP0;MOVLW0XFF;将RA口设置为输入MOVWFTRISA ;MOVLW0FFH;初始化ADCONIMOVWFADCON1;BS
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年多彩服装折纸说课稿
- 2025-2026学年大班说课稿夏天的声音
- 井下机车运输工诚信道德考核试卷含答案
- 2025-2026学年不能没有水说课稿
- 2025-2026学年孤独音乐说课稿app
- 工业型煤工诚信道德强化考核试卷含答案
- 2025-2026学年大颗粒鱼说课稿
- 变压器互感器制造工操作管理模拟考核试卷含答案
- 2025-2026学年《巴黎圣母院》说课稿
- 水煤浆制备工合规水平考核试卷含答案
- 第四单元 第1课时 青蛙歌(教学设计)数学北师大版五年级上册2026秋
- 2026高考英语【全国二卷】试卷及参考答案(含听力音频、听力原文)
- 2026年上海松江国有资产投资经营管理集团有限公司招聘笔试参考题库附带答案详解
- 语文试卷(26-65C)答案重庆市金太阳好教育联盟2026届高三10月联考(26-65C)
- 【《某变电站(220kV110kV10kV)短路电流的计算过程案例》3000字】
- 农业技术交流会
- 2025年一级造价师水利案例真题及答案解析
- 军人压力调节课件
- 航天煤油标准
- 六年级英语完形填空100篇(含答案及讲解)
- 《影视鉴赏(第2版)》课件全套 张婉宜 第1-5章 影视鉴赏基础- 欧洲及其他地区影视鉴赏
评论
0/150
提交评论