PIC单片机应用开发典型模块-第八章程序_第1页
PIC单片机应用开发典型模块-第八章程序_第2页
PIC单片机应用开发典型模块-第八章程序_第3页
PIC单片机应用开发典型模块-第八章程序_第4页
PIC单片机应用开发典型模块-第八章程序_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

(1)16×16位定点数加、减法程序LISTp=16f877INCLUDEp16f877.incACCALOEQU20;寄存加数或减数低8位ACCAHIEQU21;寄存加数或减数高8位ACCBLOEQU23;寄存被加数或被减数低8位ACCBHIEQU24;寄存被加数或被减数高8位ORG0X0000STARTGOTOMAIN*双字节省办法程序,入口地点ACCB-ACCA,出口地点ACCB*D_subCALLNEG_A;求ACCA的补码双字节加办法程序,入口地点ACCB+ACCA,出口地点ACCBD_add

MOVF

ACCALO,0

;ACCB

和ACCA低半字节相加ADDWFBTFSCINCFMOVF

ACCBLOSTATUS,CACCBHIACCAHI,0

;

有进位否?;有,ACCB高字节加1,再加;ACCA、ACCB高半字节相加

ACCAHIADDWF

ACCBHIRETURN

;子程序返回;ACCA取补子程序NEG_A

INCF

COMF

ACCALOACCALO

;ACCALO取反加

1BTFSCDECFCOMF

STATUS,ZACCAHIACCAHI

;低8位有进位吗?;有,ACCAHI减1,再取反;否则ACCAHI直接取反RETURN

;

子程序返回(2)16×16位定点数乘法程序LISTp=16f877INCLUDEp16f877.incACCALOEQU20;寄存乘数低8位ACCAHIEQU21;寄存乘数高8位ACCBLOEQU23;寄存被乘数低8位和乘积第16~23位ACCBHIEQU24;寄存被乘数高8位和乘积第24~31位ACCCLOEQU26;寄存乘积低8位ACCCHIEQU27;寄存乘积高8位ACCDLOEQU28;临时寄存器ACCDHIEQU29;临时寄存器TEMPEQU2A;临时寄存器SIGNEQU2B;寄存乘积的符号ORG0X0000STARTGOTOMAINORG0X0100D_mpyCALLS_SIGN;求取乘积的符号,并对负数取补CALLSETUP;调用子程序,将ACCB的值送ACCDINCFTEMPCLRFACCCHI;清ACCCCLRFACCCLOMLOOPBCFSTATUS,C;清进位位RRFACCDHI;ACCD右移RRFACCDLOBTFSCSTATUS,C;判断是否需要相加CALLD_add;加乘数至ACCB,见加法程序BCFSTATUS,C;清进位位RRFACCBHI;右移部分乘积RRFACCBLORRFACCCHIRRFACCCLODECFSZTEMP;乘法达成否?GOTOMLOOP;否,持续求乘积BTFSSSIGN,7;是,确定乘积的符号GOTOOVER;为正,乘法结束COMFACCCLO;为负,乘积取补INCFACCCLOBTFSCSTATUS,ZDECFACCCHICOMFACCCHIBTFSCSTATUS,ZNEG_BDECFACCBLOCOMFACCBLOBTFSCSTATUS,ZDECFACCBHICOMFACCBHIOVERRETURN;子程序返回SETUPMOVLW15;初始化TEMP寄存器MOVWFTEMPMOVFACCBHI,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均为正,返回(3)16×16位定点数除法程序LISTp=16f877INCLUDEp16f877.incACCALOEQU20;寄存除数低8位ACCAHIEQU21;寄存除数高8位ACCBLOEQU22;寄存被除数和商的低8位ACCBHIEQU23;寄存被除数和商的高8位ACCCLOEQU24;寄存余数低8位ACCCHIEQU25;寄存余数高8位ACCDLOEQU26;临时寄存器ACCDHIEQU27;临时寄存器TEMPEQU28;临时寄存器SIGNEQU29;寄存商的符号ORG0X0000STARTGOTOMAINORG0X0100D_divCALLS_SIGN;确定商的符号,并将负数取补CALLSETUP;初始化TEMP,将被除数移至ACCDINCFTEMPCLRFACCCHI;清余数寄存器CLRFACCCLODLOOPBCFSTATUS,C;清进位位RLFACCDLO;被除数、余数左移1位RLFACCDHIRLFACCCLORLFACCCHIMOVFACCAHI,0;ACCCHI-ACCAHISUBWFACCCHI,0BTFSSSTATUS,Z;ACCCHI=ACCAHI?GOTONOCHKMOVFACCALO,0;是,ACCCLO-ACCALOSUBWFACCCLO,0NOCHKBTFSSSTATUS,C;ACCC>ACCA?GOTONOGOMOVFACCALO,0;是,余数减除数SUBWFACCCLOBTFSSSTATUS,CDECFACCCHIMOVFACCAHI,0SUBWFACCCHIBSFSTATUS,C;置进位位NOGORLFACCBLO;商左移1位RLFACCBHIDECFSZTEMP;循环完成?GOTODLOOPBTFSSSIGN,7;是,确定商的符号GOTODIVOVER;为正,除法结束,跳转到结束行COMFACCCLO;为负,商和余数分别取补INCFACCCLOBTFSCSTATUS,ZDECFACCCHICOMFACCCHICALLNEG_B;见乘法程序中间NEG_BDIVOVERRETURN;子程序返回S_SIGNMOVFACCAHI,0;ACCAHI异或ACCBHI,结果送SIGN单元XORWFACCBHI,0MOVWFSIGNBTFSSACCBHI,7;ACCB为负?GOTOCHEK_A;否,检查ACCACOMFACCBLO;是,ACCB取补INCFACCBLOBTFSCSTATUS,ZDECFACCBHICOMFACCBHICHEK_ABTFSCACCAHI,7;ACCA为负?CALLNEG_A;ACCA为负,取补(NEG_A子程序请参见;16×16位定点数乘办法程序NEG_A)RETURN;ACCA和ACCB均为负,返回(4)浮点数加减法程序LISTp=16f877INCLUDEp16f877.incACCALOEQU20;寄存加数或减数的尾数ACCAHIEQU21EXPAEQU22;寄存加数或减数阶码ACCBLOEQU23;寄存被加数或被减数尾数以及和或差ACCBHIEQU24EXPBEQU25;寄存被加数或被减数阶码ACCCLOEQU26;临时寄存器ACCCHIEQU27;临时寄存器ACCDLOEQU28;临时寄存器ACCDHIEQU29;临时寄存器TEMPEQU2A;临时寄存器TEMP1EQU30;临时寄存器TIMESEQU31;临时寄存器ORG0X000STARTGOTOMAINORG0X0100F_subCALLNEG_A;求ACCA的补码,将减法变换为补码加法F_addCALLSUBADJ;调子程序判断EXPB和EXPA的大小BTFSCSTATUS,Z;参与运算的两个数阶码相等?GOTOPADD;是,求尾数的和BTFSCSTATUS,C;EXPB>EXPA?CALLF_swap;是,ACCB与ACCA互换MOVFEXPA,0;否,求取两者的差值SUBWFEXPBSCLOOPCALLSHFTSR;ACCB右移规格化INCFSZEXPB;EXPB=EXPA?GOTOSCLOOP;否,持续右移MOVFEXPA,0;是,存和(差)的阶码MOVWFEXPBPADDMOVFACCAHI,0;ACCAHI或ACCBHIIORWFACCBHI,0MOVWFSIGN;存于SIGN寄存器MOVFACCBHI,0;暂存ACCBHIMOVWFEXPACALLD_add;尾数相加BTFSSSIGN,7;ACCA和ACCB有负数?BTFSCACCBHI,7;否,把和的最高位和次高位同时进位?GOTOADD2;否,转ADD2BTFSSACCAHI,7;ACCA为负吗?GOTOADD3;ACCA和ACCB不同时为负,转ADD3BTFSSEXPA,7;是,ACCB为负吗?GOTOADD3BSFSTATUS,C;ACCA和ACCB同为负,带负号右移RRFACCBHIRRFACCBLOINCFEXPBADD3CLRFACCCHI;和(差)规格化CLRFACCCLOCALLF_normRETURN;子程序返回ADD2BCFSTATUS,C;最高位次高位不同时进位,ACCB右移INCFEXPBGOTOSHFTRSHFTSRBCFSTATUS,C;ACCB带符号右移子程序BTFSCACCBHI,7BSFSTATUS,CSHFTRRRFACCBHIRRFACCBLORETURN;子程序返回F_swapMOVFACCAHI,0;ACCAHI、ACCBHI交换MOVWFTEMPMOVFACCBHI,0MOVWFACCAHIMOVFTEMP,0MOVWFACCBHIMOVFACCALO,0;ACCALO、ACCBLO交换MOVWFTEMPMOVFACCBLO,0MOVWFACCALOMOVFTEMP,0MOVWFACCBLOMOVFEXPA,0;EXPA、EXPB交换MOVWFTEMPMOVFEXPB,0MOVWFEXPAMOVFTEMP,0MOVWFEXPBRETURNSUBADJMOVFEXPA,0;EXPA异或EXPB,结果送C_DIVXORWFEXPB,0MOVWF

C_DIVMOVFSUBWFBTFSSRETURN

EXPA,0EXPB,0C_DIV,7

;EXPB-EXPA;EXPA和

EXPB同号?;是,进位位的值真确反应两者的大小,返回BTFSS

STATUS,C

;否,进位位的值取反GOTO

CHANGECBCF

STATUS,CRETURNCHANGECBSF

STATUS,CRETURNF_norm

MOVF

ACCBHI

;ACCB=0?BTFSS

STATUS,ZGOTO

C_normMOVF

ACCBLOBTFSC

STATUS,ZRETURN

;是,不需规格化,返回C_norm

BTFSC

ACCBHI,7;否。ACCB为负?GOTO

C_norm2C_norm1

BTFSC

ACCBHI,6;为正。规格化完成?RETURN

;ACCBHI.6=1,规格化结束CALLDECFGOTO

SHFTSLEXPBC_norm1

;否。ACCB左移;EXPB减1;从头判断规格化完成否?C_norm2

BTFSS

ACCBHI,6

;ACCB为负。规格化完毕否?RETURN;ACCBHI.6=0,规格化结束BCF

STATUS,CCALL

SHFTSL

;否,ACCB左移BSFDECF

EXPB

ACCBHI,7

;加符号;EXPB减1GOTO

C_norm2

;从头判断规格化完成否?SHFTSL

BCF

STATUS

,C

;ACCB左移子程序RLFRLFRLFRLF

ACCCLOACCCHIACCBLOACCBHIRETURN(5)浮点数乘法程序LISTp=16f877INCLUDEp16f877.incACCALOEQU20;寄存乘数尾数ACCAHIEQU21EXPAEQU22;寄存乘数阶码ACCBLOEQU23;寄存被乘数尾数和乘积高16位ACCBHIEQU24EXPBEQU25;寄存被乘数阶码ACCCLOEQU26;寄存乘积低16位ACCCHIEQU27ACCDLOEQU28;临时寄存器ACCDHIEQU29;临时寄存器TEMPEQU2A;临时寄存器TEMP1EQU30;临时寄存器TIMESEQU31;临时寄存器SIGNEQU2B;存放乘积符号COUNTEQU2F;临时寄存器ACCEHIEQU30;临时寄存器ACCELOEQU31;临时寄存器ORG0X0000STARTGOTOMAINORG0X0100F_mpyCALLS_SIGN;求取乘积的符号,并对负数取补CALLSETUP;调用子程序将ACCB的值送ACCDCLRFACCCHI;清ACCCCLRFACCCLOMLOOPBCFSTATUS,C;清进位位RRFACCDHI;ACCD右移RRFACCDLOBTFSCSTATUS,C;判断是否需要相加CALLD_add;加乘数至ACCBBCFSTATUS,C;清进位位RRFACCBHI;右移部分乘积RRFACCBLORRFACCCHIRRFACCCLODECFSZTEMP;乘法达成否?GOTOMLOOP;否,持续循环MOVFEXPA,0;是,乘数与被乘数阶码相加,得积的阶码ADDWFEXPBMOVFACCBHI;ACCBHI=0?BTFSSSTATUS,ZGOTOFINUP;否,转FINUPMOVFACCBLO;ACCB=0?BTFSSSTATUS,ZGOTOSHFT08;否,只有ACCBHI=0,转SHFT08MOVFACCCHI,0;ACCB=0,将乘积左移15位MOVWFACCBHIMOVFACCCLO,0MOVWFACCBLOBCFSTATUS,CRRFACCBHIRRFACCBLOMOVLW.15;乘积阶码减15(十进制数)SUBWFEXPBGOTOFINUPSHFT08MOVFACCBLO,0;只有ACCBHI=0,乘积左移7位MOVWFACCBHIMOVFACCCHI,0MOVWFACCBLOBCFSTATUS,CRRFACCBHIRRFACCBLOMOVLW.7;乘积阶码减7SUBWFEXPBFINUPCALLF_norm;对乘积进行规格化BTFSSSIGN,7;确定乘积的符号GOTOOVER;为正,乘法结束COMFACCCLO;为负,乘积取补INCFACCCLOBTFSCSTATUS,ZDECFACCCHICOMFACCCHIBTFSCSTATUS,ZNEG_BDECFACCBLOCOMFACCBLOBTFSCSTATUS,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;ACCB=0?BTFSSSTATUS,ZGOTOC_normMOVFACCBLOBTFSCSTATUS,ZRETURN;是,不需规格化,返回C_normBTFSCACCBHI,7;否。ACCB为负?GOTOC_norm2C_norm1BTFSCACCBHI,6;为正。规格化完毕?RETURN;ACCBHI.6=1,规格化结束CALL

SHFTSL

;否。ACCB左移DECFGOTO

EXPBC_norm1

;EXPB

减1;从头判断规格化完成否?C_norm2

BTFSS

ACCBHI,6

;ACCB

为负。规格化完成否?RETURN;ACCBHI.6=0,规格化结束BCF

STATUS,CCALL

SHFTSL

;否,ACCB左移BSF

ACCBHI,7

;加符号DECFGOTO

EXPBC_norm2

;EXPB减1;从头判断规格化完成否?SHFTSL

BCF

STATUS

,C

;ACCB左移子程序RLF

ACCCLORLF

ACCCHIRLF

ACCBLORLF

ACCBHIRETURN(6)浮点数除法程序LISTp=16f877INCLUDEp16f877.incACCALOEQU20;寄存除数的尾数ACCAHIEQU21EXPAEQU22;寄存除数的阶码ACCBLOEQU23;寄存被除数的尾数和商的尾数ACCBHIEQU24EXPBEQU25;寄存被除数和商的阶码ACCCLOEQU26;寄存余数ACCCHIEQU27ACCDLOEQU28;临时寄存器ACCDHIEQU29;临时寄存器TEMPEQU2A;临时寄存器TEMP1EQU30;临时寄存器TIMESEQU31;临时寄存器SIGNEQU2B;寄存商的符号COUNTEQU2F;临时寄存器ACCEHIEQU30;临时寄存器ACCELOEQU31;临时寄存器ORG0X0000STARTGOTOMAINORG0X0100F_divCALLS_SIGN;确定商的符号,并将负数取补CLRFACCCHI;初始化ACCC寄存器CLRFACCCLOCALLF_norm;规格化ACCBCLRFACCCLOCLRFACCCHICLRFTIMESMOVFACCAHI;除数为零?BTFSSSTATUS,ZGOTOFD0;否,求商MOVFACCALOBTFSCSTATUS,ZRETLW01;是,返回FD0CALLNEG_A;除数取补FD1MOVFACCBHI,0;ACCBHI送ACCDLOMOVWFACCDLOCALLD_add1;被除数尾数大于除数尾数?BTFSSSTATUS,CGOTOFD2RRF1BCFSTATUS,C;是,被除数右移规格化,直到小于除数为止RRFACCBHIRRFACCBLOINCFTIMESRRFACCCHIBCFSTATUS,CGOTOFD1FD2CALLDDIV;否,调用双字节除办法程序,求商的尾数MOVFTIMES,0;根据右移规格化次数调整ACCB阶码ADDWFEXPBMOVFEXPA,0;求商的阶码SUBWFEXPBCALLF_norm;商规格化BTFSCSIGN,7;商为负?CALLNEG_B;是,取补CALLNEG_A;除数复原RETURN;浮点数除法完成,返回DDIVMOVLW0X0F;初始化ACCDHIMOVWFACCDHIDV1BCFSTATUS,CRLFACCCLO;左移商RLFACCCHIRLFACCBLO;左移余数RLFACCBHIMOVFSTATUS,0;暂存STATUS寄存器MOVWFACCDLOMOVFACCBHI,0;ACCBHI送TEMP1MOVWFTEMP1MOVFACCALO,0;ACCB-ACCAADDWFACCBLO,0MOVWFTEMPBTFSCSTATUS,CINCFTEMP1MOVFACCAHI,0ADDWFTEMP1,0BTFSCACCDLO,0;左移余数时移出来的数为1?GOTODV2TESTCBTFSSSTATUS,C;是,再判断ACCB尾数是否大于ACCAGOTODV3DV2MOVWFACCBHI;是,余数送ACCBMOVFTEMP,0MOVWFACCBLOINCFACCCLO;商加1DV3DECFSZACCDHI;商求取完成?GOTODV1MOVFACCCHI,0;是,将商送ACCBMOVWFACCBHIMOVFACCCLO,0MOVWFACCBLORETLW00D_add1MOVFACCALO,0;加数、被加数低半字节相加ADDWFACCBLO,0BTFSCSTATUS,C;有进位?INCFACCDLO;ACCD低半字节加1MOVFACCAHI,0;ACCAHI+ACCDLOADDWFACCDLORETLW0;子程序返回SETUPMOVLW.15MOVWFTEMPMOVFACCBHI,0MOVWFACCDHIMOVFACCBLO,0MOVWFACCDLOCLRFACCBHICLRFACCBLORETLW0NEG_ACOMFACCALO;ACCALO取反加1INCFACCALOBTFSCSTATUS,Z;低8位有进位吗?DECFACCAHI;有,ACCAHI减1,再取反COMFACCAHI;否,ACCAHI直接取反RETLW0NEG_BDECFACCBLO;ACCBLO取反加1COMFACCBLOBTFSCSTATUS,Z;低8位有进位吗?DECFACCBHI;有,ACCBHI减1,再取反COMFACCBHI;否,ACCBHI直接取反RETLW0S_SIGNMOVFACCAHI,0;ACCAHI异或ACCBHI,结果送SIGN单元XORWFACCBHI,0MOVWFSIGNBTFSSACCBHI,7;ACCB为负?GOTOCHEK_A;否,检查ACCACOMFACCBLO;是,ACCB取补INCFACCBLOBTFSCSTATUS,ZDECFACCBHICOMFACCBHICHEK_ABTFSCACCAHI,7;ACCA为负?CALLNEG_A;ACCA为负,取补RETLW0;ACCA和ACCB均为负,返回F_normMOVFACCBHI;ACCB=0?BTFSSSTATUS,ZGOTOC_normMOVFACCBLOBTFSCSTATUS,ZRETLW0;是,不需规格化,返回C_normBTFSCACCBHI,7;否。ACCB为负?GOTOC_norm2C_norm1BTFSCACCBHI,6;为正。规格化完成?RETLW

0

;ACCBHI.6=1,规格化结束CALLDECF

SHFTSLEXPB

;EXPB

;否。ACCB左移减1GOTO

C_norm1

;从头判断规格化完成否?C_norm2

BTFSS

ACCBHI,6

;ACCB为负。规格化完成否?RETLW

0;ACCBHI.6=0,规格化结束BCF

STATUS,CCALLBSFDECF

SHFTSLEXPB

ACCBHI,7

;否,ACCB左移;加符号;EXPB减1GOTO

C_norm2

;

从头判断规格化完成否?SHFTSL

BCF

STATUS

,C

;ACCB

左移子程序RLFRLFRLFRLF

ACCCLOACCCHIACCBLOACCBHIRETLW

0(7)定点数转变为浮点数程序LISTp=16f877INCLUDEp16f877.incACCBLOEQU23;寄存定点整数和变换后浮点数的尾数ACCBHIEQU24EXPBEQU25;寄存变换后浮点数的阶码ACCCLOEQU26;临时寄存器ACCCHIEQU27;临时寄存器ACCDLOEQU28;临时寄存器ACCDHIEQU29;临时寄存器SIGNEQU2B;寄存被变换数的符号ORG0X0000STARTGOTOMAINORG0X0100DtoFCLRFSIGN;根据被变换数确定结果的符号,对负数取补BTFSSACCBHI,7GOTOINTF1BSFSIGN,7CALLNEG_BINTF1MOVLW.15;初始化EXPBMOVWFEXPBCLRFACCCHICLRFACCCLOCALLF_norm;对ACCB进行规格化BTFSSSIGN,7;结果为负?GOTODtoF1CALLNEG_B;是,求补DtoF1RETURNF_normMOVFACCBHI;ACCB=0?BTFSSSTATUS,ZGOTOC_normMOVFACCBLOBTFSCSTATUS,ZRETLW0;是,不需规格化,返回C_normBTFSCACCBHI,7;否。ACCB为负?GOTOC_norm2C_norm1BTFSCACCBHI,6;为正。规格化完成?RETLW0;ACCBHI.6=1,规格化结束CALLSHFTSL;否。ACCB左移DECFEXPB;EXPB减1GOTOC_norm1;从头判断规格化完成否?C_norm2BTFSSACCBHI,6;ACCB为负。规格化完毕否?RETLW0;ACCBHI.6=0,规格化结束BCFSTATUS,CCALLSHFTSL;否,ACCB左移BSFACCBHI,7;加符号DECFEXPB;EXPB减1GOTOC_norm2;从头判断规格化完成否?SHFTSL

BCF

STATUS

,C

;ACCB左移子程序RLF

ACCCLORLFRLFRLF

ACCCHIACCBLOACCBHIRETLW

0(8)3字节浮点数变换为定点整数程序FtoDCLRFSIGN;清结果符号寄存器MOVFACCBHI,0BTFSSACCBHI,7;被变换数是否为负?GOTOD1BSFSIGN,7;是,SIGN.7置1CALLNEG_B;被变换数取补D1BTFSSEXPB,7;被变换数为正,再判阶码为负否?GOTOD2CLRFACCBHI;为负,被变换数小于1,无法用定点数表示CLRFACCBLORETLW0D2MOVLW.16;被变换数阶码减16(十进制数)SUBWFEXPB,0BTFSSSTATUS,C;阶码小于16?GOTOD3MOVLW0XFF;阶码大于等于16,置ACCB为最大,返回MOVWFACCBHIMOVWFACCBLORETLW01D3CALLFTOW3;调用子程序将浮点数变换为定点数BTFSCSIGN,7;定点数为负?CALLNEG_B;是,取补RETLW0;否,返回FTOW3MOVLW.15;EXPB=15(十进制数)?SUBWFEXPB,0BTFSCSTATUS,ZRETLW0;是,返回BCFSTATUS,C;否,ACCB持续右移,EXPB加1RRFACCBHIRRFACCBLOINCFEXPBGOTOFTOW3;从头判断EXPB=15?(9)双字节定点数至5位BCD码变换程序LISTp=16f877INCLUDEp16f877.incACCBLOEQU23;寄存被变换的双字节整数低8位ACCBHIEQU24;寄存被变换的双字节整数高8位ACCCLOEQU26;寄存5位BCD码ACCCHIEQU27ACCDLOEQU28ACCDHIEQU29TEMP

EQU

2A

;

临时寄存器SIGN

EQU

2B

;被变换数符号寄存器ORG

0X0000START

GOTO

MAINORG

0X0100BtoBCD

CLRF

SIGN

;初始化符号寄存器BTFSS

ACCBHI,7

;被变换数为负?GOTO

LOOP1

;否,转

BtoBCDBSF

SIGN,7

;是,存符号CALL

NEG_B

;ACCB取补LOOP1

BCFMOVLW

STATUS,C.16

;清进位位

;移位计数器赋初值MOVWFCLRFCLRFCLRF

COUNTACCCHIACCCLOACCDHI

;初始化出口寄存器LOOP16

RLF

ACCBLO

;ACCB左移一位至出口寄存器RLFRLFRLFRLFDECFSZ

ACCBHIACCDHIACCCLOACCCHICOUNT

;移位计数器=0?ADJDEC

GOTORETLWMOVLWMOVWFCALL

ADJDEC0ACCDHI;指针指向FSRADJBCD

ACCDHI

;否,转ADJDEC;是,返回;调用BCD码校正子程序MOVLW

ACCCLO

;指针指向

ACCCLOMOVWFFSRCALLADJBCD;调用BCD码校正子程序MOVLWACCCHI;指针指向ACCCHIMOVWFFSRCALLADJBCD;调用BCD码校正子程序GOTOLOOP16;ACCB从头左移ADJBCDMOVLW00X03;LSD+3>7?ADDWFINDF,0MOVWFTEMPBTFSCTEMP,3MOVWFINDF;是,LSD=LSD+3MOVLW0X30;否,MSD+3>7?ADDWFINDF,0MOVWFTEMPBTFSCTEMP,7MOVWFINDF;是,MSD=MSD+3RETLW0;返回(10)浮点数至5位压缩BCD码变换程序LISTp=16f877INCLUDEp16f877.incACCALOEQU20;临时寄存器ACCAHIEQU21EXPAEQU22;临时寄存器ACCBLOEQU23;寄存被变换浮点数尾数ACCBHIEQU24EXPBEQU25;寄存被变换浮点数阶码ACCCLOEQU26;临时寄存器ACCCHIEQU27;临时寄存器ACCDLOEQU28;临时寄存器ACCDHIEQU29;临时寄存器TEMPEQU2A;临时寄存器TEMP1EQU30;临时寄存器TIMESEQU31;临时寄存器SIGNEQU2B;临时寄存器COUNTEQU2F;临时寄存器C_MULEQU2C;寄存小数点地点C_DIVEQU2D;寄存小数点地点FPOLEQU2E;寄存被变换数的符号ORG0X0000STARTGOTOMAINORG0X0100FtoBCDCLRFC_MUL;清小数点地点数寄存器CLRFC_DIVCLRFACCAHI;求取结果符号,存于FPOL.7CALLS_SIGNMOVFSIGN,0MOVWFFPOLMOVLW50;ACCA赋初值,ACCA=10(十进制)MOVWFACCAHICLRFACCALOMOVLW04MOVWFEXPAMUl5BTFSSEXPB,7;阶码EXPB<0?GOTOMUl2;否,转MU12MUl1CALLF_mpy;是,ACCA×10INCFC_MUL;小数点左移,寄存器加1GOTOMUl5;从头判断阶码是否小于零MUl2MOVLW.12;阶码EXPB<12?SUBWFEXPB,0BTFSCSTATUS,CGOTOMUl4;否,转MU14MUl3CALLF_mpy;是,ACCA×10INCFC_MUL;小数点左移,寄存器加1GOTOMUL2;重判阶码值MUl4MOVLW.16;阶码EXPB>16?SUBWFEXPB,0BTFSSSTATUS,CGOTONEXT;否,表示阶码12≤EXPB<16,求取BCD码值DIV1CALLFDIV;是,EXPB÷10INCFC_DIV;小数点右移寄存器加1GOTOMUl4;从头判断阶码值NEXTCALLFTOW3;调子程序,将浮点数变换为定点数CALLBtoBCD;调双字节数到BCD码子程序,求BCD码MOVFACCCHI;ACCCHI=0?BTFSSSTATUS,ZRETLW0;否,返回MOVLW04;是,结果左移4次,保证ACCCHI不为0MOVWFTIMESBCFSTATUS,CMUl6RLFACCDHIRLFACCCLORLFACCCHIDECFSZTIMESGOTOMUl6MOVFC_DIV;C_DIV=0?BTFSCSTATUS,ZGOTOTEMUL;是,转判断C_MULDECFC_DIV;否,小数点右移,寄存器减1RETLW0TEMULINCFC_MUL;小数点左移,寄存器加1RETLW0(11)进制码和BCD码变换程序LISTP=16F877INCLUDE“P16F877.INC”;---------------------------------------------------------------------#DEFINEBiTOBCD’Y'R2EQU0x20R1EQU0x2lR0EQU0x22BinHEQU0x23BinLEQU0x24CNTEQU0x25TMPEQU0x26BinBHEQU0x27BinBLEQU0x28;----------------------------------------------------------ORG0x00GOTOMAINORG0x10BiBCDMOVLW0x10;MOVWFCNT;移位次数BCFSTATUS,CCLRFR0CLRFR1CLRFR2LOOPRLFBinLRLFBinHRLFR0RLFR1RLFR2DECFSZCNTGOTOADJDECRETURNADJDECMOVLWR0;调整R0MOVWFFSRCALLADJBCDMOVLWR1;调整RlMOVWFFSRCALLADJBCDMOVLWR2;调整R2MOVWFFSRCALLADJBCDGOTOLOOPADJBCDMOVLW0x3ADDWFINDF,WMOVWFTMPMOVWFINDF;LSD=LSD+3MOVLW0x30ADDWFINDF,WMOVWFTMPMOVWFINDF;MSD=MSD+3RETURNBCDBiCLRFBinHMOVFR2,WANDLW0x0FMOVWFBinL;(BinL)=R2<3:0>CALLMPY10A;(Bin)=(Bin×10SWAPFRI,WCALLMPY10B;(Bin)=[(Bin)+R1<7:4>]×10MOVFR1,WCALLMPY10B;(Bin)=[(Bin)+R1<3:0>]*10SWAPFR0,WCALLMPY10B;(Bin)=[(Bin)+R0<7:4>]*10MOVFR0,W;(Bin)=(Bin)+R0<3:0>ANDLW0x0FADDWFBinLBTFSCSTATUS,CINCFBinHRETURNMPY10BANDLW0x0FADDWFBinLBTFSCSTATUS,CINCFBinHMPYl0ABCFSTATUS,CRLFBinL,WMOVWFBinBLRLFBinH,WMOVWFBinBHBCFSTATUS,CRLFBinLRLFBinHBCFSTATUS,CBCFSTATUS,CRLFBinLRLFBinHMOVFBinBL,WADDWFBinLBTFSCSTATUS,CINCFBinHMOVFBinBH,WADDWFBinHRETURNMAINORG0x100IFBiTOBCD=='Y’MOVLW0x7FMOVWFBinHMOVLW0xFFMOVWFBinLCALLBiBCD

;(Bin)×2——(BinB);(Bin)*8——(Bin);主程序;二进制变换为BCD码;结果在R2,R1,R0中ENDIFIFBITOBCD=='N'MOVLW0x6MOVWFMOVLW0x55MOVWFMOVLWMOVWFCALLBCDBiENDIFGOTO$END

R2R10x35R0

;BCD码变换为二进制数;结果在BinH、BinL

中(12)定点数开方程序LIST

INCLUDEACCALOACCAHIEXPA

p=16f877p16f877.incEQUEQUEQU

0X20ACCALO+1ACCALO+2ACCBLOEQUACCALO+3ACCBHIEQUACCALO+4EXPBEQUACCALO+5ACCCLOEQUACCALO+6ACCCHIEQUACCALO+7ACCDLOEQUACCALO+8ACCDHIEQUACCALO+9TEMPEQUACCDHI+1SIGNEQUACCDHI+2SQRTLOEQUACCALOSQRTHIEQUACCAHINUMLOEQUACCDHI+4NUMHIEQUACCDHI+5COUNTEQUACCDHI+6;此方法定义的数据块为连续层断,只需;将第一行改变,就能够将数据整块挪动到;新的地方,为调试带来方便,是比较推;崇的一种寄存器定义方法LUPCNTEQU.10ORG0X00GOTOMAINORG0X10INITMOVLWLUPCNTMOVWFCOUNTMOVFNUMHI,0MOVWFSQRTHIMOVFNUMLO,0MOVWFSQRTLOBCFSTATUS,CRRFSQRTHI,1RRFSQRTLO,1RETLW0DIV2BCFSTATUS,CRRFACCBHI,0MOVWFSQRTHIRRFACCBLO,0MOVWFSQRTLORETLW0SQRTCALLINITSLOOPMOVFNUMLO,0MOVWFACCBLOMOVFNUMHI,0MOVWFACCBHICALLD_DIVSCALLD_ADDCALLDIV2DECFSZCOUNT,1GOTOSLOOPRETURND_DIVSCALLSETUPCLRFACCCHICLRFACCCLODLOOPBCFSTATUS,CRLFACCDLORLFACCDHIRLFACCCLORLFACCCHIMOVFACCAHI,0SUBWFACCCHI,0BTFSSSTATUS,ZGOTONOCHKMOVFACCALO,0SUBWFACCCLO,0NOCHKBTFSSSTATUS,CGOTONOGOMOVFACCALO,0SUBWFACCCLO,1BTFSSSTATUS,CDECFACCCHI,1MOVFACCAHI,0SUBWFACCCHI,1BSFSTATUS,CNOGORLFACCBLORLFACCBHIDECFSZTEMPGOTODLOOPRETLW0SETUPMOVLW16MOVWFTEMPMOVFACCBHI,0MOVWFACCDHIMOVFACCBLO,0MOVWF

ACCDLOCLRF

ACCBHICLRF

ACCBLORETLW

0NEG_A

COMF

ACCALO,1D_ADD

INCFBTFSCDECFCOMFRETLWMOVFADDWFBTFSCINCFMOVFADDWFRETLW

ACCALO,1STATUS,ZACCAHI,1ACCAHI,10ACCALO,0ACCBLO,1STATUS,CACCBHI,1ACCAHI,0ACCBHI,10(13)浮点数开方程序LIST

P=16f877C_DIV

INCLUDEACCALOACCAHIEXPAACCBLOACCBHIEXPBACCCLOACCCHIACCDLOACCDHITEMPTEMP1TIMESSIGNCOUNTC_MULFPOL

EQU

p16f877.incEQUEQUEQUEQUEQUEQUEQUEQUEQUEQUEQUEQUEQUEQUEQUEQUEQU

20HACCALO+1ACCALO+2ACCALO+3ACCALO+4ACCALO+5ACCALO+6ACCALO+7ACCALO+8ACCALO+9ACCALO+0AACCALO+0BACCALO+0CACCALO+0DACCALO+0EACCALO+0FACCALO+10ACCALO+11

;符号放置位NUMLONUMHINUMMLUPCNT

EQUEQUEQUEQU

FPOL+1FPOL+2FPOL+4.10CONSTANT

C=0CONSTANTCONSTANTCONSTANT

Z=2MODEL16=1FALSE=0ORG0X0000NOPGOTOMAINORG0X0010INIT1DECFEXPB;假定迭代根的初始值为其原值的一半MOVFACCBHI,WMOVWFACCAHIMOVFACCBLO,WMOVWFACCALOMOVFEXPB,WMOVWFEXPARETLW0SQRTFMOVLWLUPCNTMOVWFCOUNTMOVFACCBHI,WMOVWFNUMHIMOVFACCBLO,WMOVWFNUMLOMOVFEXPB,WMOVWFNUMM;存储被开方的数BTFSCACCBHI,7GOTOTIQIAN;如果被开方数是个负数,则返回小数CALL

INIT1SLOOP1

MOVF

NUMLO,0MOVWF

ACCBLOMOVF

NUMHI,0MOVWF

ACCBHIMOVF

NUMM,0MOVWF

EXPBCALL

FDIVCALL

F_addCALL

INIT1DECFSZGOTO

COUNT,1SLOOP1RETURNTIQIAN

MOVLWMOVWF

0X40ACCBHICLRFACCBLOMOVLW0X80MOVWFEXPB;如果被开方数是一个负数,返回一个极小的浮点数RETURN(14)均值滤波程序INDFEQU00H;定义INDF寄存器STATUSEQU03H;定义状态寄存器FSREQU04H;定义FSR寄存器TRISAEQU05H;定义TRISA寄存器RP1EQU06H;定义状态寄存器中的页选位RP1RP0EQU05H;定义状态寄存器中的页选位RP0INTCONEQU0BH;定义中止寄存器PIR1EQU0CH;定义PIR中止寄存器ADRESHEQU1EH;定义ADRESH寄存器ADCON0EQU1FH;定义ADCON0寄存器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;定义计数器变量COUNTADHEQU28H;定义临时变量ADHADLEQU29H;定义临时变量ADLST_TEMPEQU2AH;定义临时变量ST_TEMPW_TEMPEQU2BH;定义临时变量W_TEMPDATA1EQU2CH;定义外循环变量DATA2EQU2DH;定义存储外循环次数的变量COUNT2EQU08H;定义存储内循环次数的变量ADIEEQU06H;定义ADIEPEIEEQU06H;定义PDIEORG00HGOTOMAINORG04HGOTOINTERRETFIEMOVLW01H;初始化ADCON0MOVWFADCON0;BCFSTATUS,RP1;选择体1BSFSTATUS,RP0;MOVLW0XFF;将RA口设置为输入MOVWFTRISA;MOVLW0FFH;初始化ADCON1MOVWFADCON1;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,2;关ADBCFSTATUS,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;计数达到8?GOTONEXT1;否,采样周期没完,求和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;中止返回DELAYMOVLWCOUNT1;设置外部循环的次数MOVWFDATA1;LOOP1MOVLWCOUNT2;设置内部循环的次数MOVWFDATA2;LOOP2DECFSZDATA2,1;内部循环变量自减1,为0则跳转GOTOLOOP2;DECFSZDATA1,1;外部循环变量自减1,为0则跳转GOTOLOOP1;RETURN;延时子程序返回END;源程序结束(15)中值滤波程序INDFEQU00H;定义INDF寄存器STATUSEQU03H;定义状态寄存器FSREQU04H;定义FSR寄存器TRISAEQU05H;定义TRISA寄存器RP1EQU06H;定义状态寄存器中的页选位RP1RP0EQU05H;定义状态寄存器中的页选位RP0INTCONEQU0BH;定义中止寄存器PIR1EQU0CH;定义PIR中止寄存器ADRESHEQU1EH;定义ADRESH寄存器ADCON0EQU1FH;定义ADCON0寄存器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位COUNT1EQU04H;定义存储外循环次数的变量COUNT2EQU08H;定义存储内循环次数的变量ADIEEQU06H;定义ADIEPEIEEQU06H;定义PDIEORG00HGOTOMAINORG04HGOTOINTERRETFIEMOVLW01H;初始化ADCON0MOVWFADCON0;BCFSTATUS,RP1;选择体1BSFSTATUS,RP0;MOVLW0XFF;将RA口设置为输入MOVWFTRISA;MOVLW0FFH;初始化ADCON1MOVWFADCON1;BSFPIE1,ADIE;开AD中止BCFSTATUS,RP1;选择体0BCFSTATUS,RP0;CLRFPIR1;清AD中止标志BSFINTCO

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论