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

下载本文档

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

文档简介

1、LISTp=16f877INCLUDEp16f877.incACCALOEQU20ACCAHIEQU21ACCBLOEQU23ACCBHIEQU24ORG0X0000(1)16X16 位START GOTOMAIN定点数加、 减法程序;存放加数或减数低 8位;存放加数或减数高8位;存放被加数或被减数低 8位;存放被加数或被减数高8位;*双字节减法子程序,入口地址 ACCB-ACCA出口地址 ACCB*D_subCALL NEG_A;求 ACCA勺补码;双字节加法子程序,入口地址 ACCB+ACCAH 口地址 ACCBD_addMOVFACCALO 0 ;ACCB 和 ACC版半字节相力口ADD

2、WFACCBLOBTFSCSTATUS, C; 有进位否?INCFACCBHIMOVFACCAHJ 0ADDWFACCBHIRETURN;ACCA取补子程序NEG_ACOMFACCALOINCFACCALOBTFSCSTATUSZDECFACCAHICOMFACCAHIRETURN;(2) 16X16位定点数乘法程序LISTp=16f877INCLUDEp16f877.incACCALOEQU20ACCAHIEQU21ACCBLOEQU231623位ACCBHIEQU242431位ACCCLOEQU26ACCCHIEQU27ACCDLOEQU28ACCDHIEQU29TEMPEQU2ASIGN

3、EQU2BORG0X0000STARTGOTOMAIN;有,ACCB高字节加1,再加ACCAHI ;ACCA ACC的半字节相加;子程序返回;ACCALOX 反力口 1;低8位有进位吗?;有,ACCAH减1 ,再取反;否则ACCAH直接取反子程序返回;存放乘数低8位;存放乘数高8位存放被乘数低8位和乘积第存放被乘数高8位和乘积第;存放乘积低8位;存放乘积高8位;临时寄存器;临时寄存器;临时寄存器;存放乘积的符号CALLS_SIGN;求取乘积的符号,并对负数取补CALLSETUP;调用子程序,将ACCB勺值送INCFTEMPCLRFACCCHI;清 ACCCCLRFACCCLOBCFSTATUS

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

5、BLOBTFSCSTATUS ZDECFACCBHICOMFACCBHIRETURN;子程序返回MOVLW15;初始化TEMFW存器MOVWFTEMPMOVFACCBHJ 0;ACCB 送 ACCDMOVWFACCDHIMOVFACCBLO 0MOVWFACCDLOCLRFACCBHI;清 ACCBCLRFACCBLORETURN;子程序返回MOVFACCAHI 0;ACCAHI异或ACCBHJ结果送SIGN单元XORWFACCBHI 0MOVWFSIGNORG0X0100D_mpyMLOOPNEG_BOVERSETUPS_SIGNACCDBTFSSACCBHII 7;ACCB为负吗?GOTO

6、CHEK_A;否,检查ACCACALLNEG_B; 是,求取ACCB色对值CHEK_ABTFSCACCAH, I7;ACCA为负吗?CALLNEG_A;ACCA为负,求取 ACC/AWW,RETURN;ACCA和ACCB匀为正,返回(3) 16X16位定点数除法程序LISTp=16f877INCLUDEp16f877.incACCALOEQU20;存放除数低8位ACCAHIEQU21;存放除数高8位ACCBLOEQU22;存放被除数和商的低8位ACCBHIEQU23;存放被除数和商的高8位ACCCLOEQU24;存放余数低 8位ACCCHIEQU25;存放余数局8位ACCDLOEQU26;临时

7、寄存器ACCDHIEQU27;临时寄存器TEMPEQU28;临时寄存器SIGNEQU29;存放商的符号ORG0X0000STARTGOTOMAINORG0X0100D_divCALLS_SIGN;确定商的符号,并将负数取补CALLSETUP;初始化 TEMP,将被除数移至ACCDINCFTEMPCLRFACCCHI;清余数寄存器CLRFACCCLODLOOPBCFSTATUS C;清进位位RLFACCDLO;被除数、余数左移1位RLFACCDHIRLFACCCLORLFACCCHIMOVFACCAHII 0;ACCCHI-ACCAHISUBWFACCCHJ 0BTFSSSTATUS Z;ACC

8、CHI=ACCAHIGOTONOCHKMOVFACCALO 0;是,ACCCLO-ACCALOSUBWFACCCLO 0NOCHKBTFSSSTATUS C;ACCCACCAGOTONOGOMOVFACCALO 0; 是,余数减除数SUBWFACCCLOBTFSSSTATUS CDECFACCCHIMOVFACCAHI 0 ACCCHISUBWFBSFSSTATUS C;置进位位NOGORLFACCBLORLFACCBHIDECFSZTEMPGOTODLOOPBTFSSSIGN, 7GOTODIVOVERCOMFACCCLOINCFACCCLOBTFSCSTATUS ZDECFACCCHICO

9、MFACCCHICALLNEG_BDIVOVERRETURNS_SIGNMOVFACCAHIXORWFACCBHII0MOVWFSIGNBTFSSACCBHII7GOTOCHEK_ACOMFACCBLOINCFACCBLOBTFSCSTATUSZDECFACCBHICOMFACCBHICHEK_ABTFSCACCAH, I;0;7;商左移1位;循环完毕?;是,确定商的符号;为正,除法结束,跳转到结束行;为负,商和余数分别取补;见乘法程序中间NEG_B子程序返回;ACCAHI异或ACCBHI结果送SIGN单元;ACCB 为负?否,检查ACCA;是,ACCBX补;ACCA为负?AA、,/VA I

10、/ h II Z-X X7* -rrt r3-、士 公见(4)CALLRETURN 浮点数加减法程序 LISTINCLUDEACCALONEG_A;ACCA力贝,取不r ( NEG_AT住厅侑笏;16X 16位定点数乘法子程序 NEG_A;ACCA和ACCB匀为负,返回p=16f877p16f877.incEQU20;存放加数或减数的尾ACCAHIEXPA减数阶码ACCBLO 减数尾数以及和或差ACCBHI EXPB 减数阶码EQUEQUEQUEQUEQU2122;存放加数或23;存放被加数或被2425;存放被加数或被ACCCLOEQU26;临时寄存器ACCCHIEQU27;临时寄存器ACCD

11、LOEQU28;临时寄存器ACCDHIEQU29;临时寄存器TEMPEQU2A;临时寄存器TEMPI存器EQU30;临时寄TIMES存器ORGSTARTGOTOORGF_subCALL补码加法F_addCALL和EXPA勺大小BTFSCGOTOBTFSCCALL换MOVFSUBWFEQU0X000MAIN0X0100NEG_ASUBADJSTATUS Z PADDSTATUS CF_swapEXPA 0EXPB31;临时寄;求ACCA勺补码,将减法转换为;调子程序判断 EXPB;参与运算的两个数阶码相等?;是,求尾数的和;EXPBEXPA;是,ACCBW ACCA5;否,求取两者的差值SCLO

12、OPCALLINCFSZEXPAGOTOMOVF码MOVWFPADDMOVFIORWFMOVWF器MOVFMOVWFCALLBTFSS最高位和次高位同时进位?GOTOBTFSSGOTOSHFTSR EXPBSCLOOPEXPA 0EXPBACCAH,I 0ACCBHJ 0 SIGNACCBHI 0EXPAD_addSIGN, 7 BTFSCADD2ACCAH,I 7ADD3;ACCB右移规格化;EXPB=;否,继续右移;是,存和(差)的阶;ACCAHI或 ACCBHI;存于SIGN寄存;暂存 ACCBHI;尾数相加;ACCA和 ACCEW负数?ACCBHIJ 7;否,把和的;否,转ADD2;A

13、CCA为负吗?;ACCA和ACC杯同时为负,转 ADD3BTFSSGOTOEXPA 7ADD3;是,ACC斯负吗?BSFSTATUS C;ACCA和ACCa为负,带负号右移RRFACCBHIRRFACCBLOINCFEXPBADD3CLRFACCCHI;和(差)规格化CLRFACCCLOCALLF_normRETURN;子程序返回ADD2BCFSTATUS C ;最高位次高位不同时进位,ACCB&移INCFEXPBGOTOSHFTRSHFTSRBCFSTATUS C ;ACCB带符号右移子程序BTFSCACCBHII 7BSFSTATUS CSHFTRRRFACCBHIRRFACCBLORET

14、URN;子程序返回F_swapMOVFACCAHJ 0;ACCAH太 ACCBH面换MOVWFTEMPMOVFACCBHJ 0MOVWFACCAHIMOVFTEMP 0MOVWFACCBHIMOVFACCALO 0;ACCALO ACCBLE换MOVWFTEMPMOVFACCBLO 0MOVWFACCALOMOVFTEMP 0MOVWFACCBLOMOVFEXPA 0;EXPA EXPB互换MOVWFTEMPMOVFEXPB 0MOVWFEXPAMOVFTEMP 0MOVWFEXPBRETURNSUBADJMOVFEXPA0 ;EXPA异或EXPB结果送C_DIVXORWFEXPB 0C_DI

15、VEXPA 0EXPB 0C_DIV, 7返回STATUS C CHANGECSTATUS CACCCLOACCCHIACCBLOACCBHISTATUS CACCBHI;ACCB= 0?STATUS ZC_normACCBLOSTATUS Z;是,不需规ACCBH| 7;否。ACC斯负?;ACCBHI.6=1 ,规C_norm2ACCBHI, 6;为正。规格化完毕?SHFTSLEXPBC_norm1ACCBHJ 6STATUS CSHFTSLACCBHJ 7EXPBC_norm2MOVWF MOVF SUBWF BTFSS RETURN 的值真确反映两者的大小,BTFSS GOTO BCF

16、RETURNCHANGEC BSF RETURN F_normMOVFBTFSS GOTO MOVF BTFSC RETURN 格化,返回C_normBTFSCGOTOC_norm1BTFSCRETURN格化结束 CALL DECF GOTO 否?C_norm2BTFSS毕否?RETURN;ACCBHI.6=0,规格化结束 BCFCALLBSFDECFGOTO否?SHFTSLBCF程序RLFRLFRLFRLF;EXPB-EXPA;EXPA和 EXPB号?;是,进位位;否,进位位的值取反;否。ACC班移;EXPB 减 1;重新判断规格化完毕;ACCB为负。规格化完;否,ACC暇移;加符号;EXP

17、B 减 1;重新判断规格化完毕STATUS , C ;ACCB 左移子RETURN(5)浮点数乘法程序LISTp=16f877INCLUDEp16f877.incACCALOEQU20;存放乘数尾数ACCAHIEQU21EXPAEQU22;制制阶码ACCBLOEQU23; 存放被乘数尾数和乘积高16位ACCBHIEQU24EXPBEQU25;存放被乘数阶码ACCCLOEQU26; 存放乘积低16位ACCCHIEQU27ACCDLOEQU28;临时寄存器ACCDHIEQU29;临时寄存器TEMPEQU2A;临时寄存器TEMPIEQU30;临时寄存器TIMESEQU31;临时寄存器SIGNEQU2

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

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

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

21、EG_BDECFACCBLOCOMFACCBLOBTFSCSTATUS ZDECFACCBHICOMFACCBHIOVERRETURN;乘法结束,子程序返回S_SIGNMOVFACCAHJ 0;ACCAHI异或 ACCBHI结果送SIGNXORWFACCBHII 0MOVWFSIGNBTFSSACCBHIJ 7;ACCB为负?GOTOCHEK_A;否,检查ACCACOMFACCBLO;是,ACCBX补INCFACCBLOBTFSCSTATUS ZDECFACCBHICOMFACCBHICHEK_ABTFSCACCAH,I 7;ACCA为负?CALLNEG_A;ACCA取补RETURN;返回F_

22、normMOVFACCBHI;ACCB= 0?BTFSSSTATUS ZGOTOC_normMOVFACCBLOBTFSCSTATUS ZRETURN;是,小需规格化,返回C_normBTFSCACCBHI 7;否。ACC斯负?GOTOC_norm2C_norm1BTFSCACCBH I6;为正。规格化完毕?RETURN;ACCBHI.6=1,规格化结束CALLSHFTSL;否。ACC班移DECFEXPB;EXPB减 1GOTOC_norm1;重新判断规格化完毕否?C_norm2BTFSSACCBHJ 6;ACCB为负。规格化完毕否?RETURN;ACCBHI.6=0,规格化结束BCFSTAT

23、US CCALLSHFTSL;否,ACC衽移BSFACCBHIJ 7;力口符号DECFEXPB;EXPB 减 1GOTOC_norm2;重新判断规格化完毕否?SHFTSLBCFSTATUS , C;ACCB 左移子程序RLFACCCLORLFACCCHIRLFACCBLORLFACCBHIRETURN(6)浮点数除法程序LISTp=16f877INCLUDEpl6f877.incACCALOEQU20;存放除数的尾数ACCAHIEQU21EXPAEQU22;存放除数的阶码ACCBLOEQU23; 存放被除数的尾数和商的尾数ACCBHIEQU24EXPBEQU25;存放被除数和商的阶码ACCCL

24、OEQU26;存放余奴ACCCHIEQU27ACCDLOEQU28;临时寄存器ACCDHIEQU29;临时寄存器TEMPEQU2A;临时寄存器TEMPIEQU30; 临时寄存器TIMESEQU31;临时寄存器SIGNEQU2B; WW的符号COUNTEQU2F;临时寄存器ACCEHIEQU30;临时寄存器ACCELOEQU31;临时寄存器ORG0X0000STARTGOTOMAINORG0X0100F_divCALLS_SIGN;确定商的符号,并将负数取补CLRFACCCHI;初始化ACCC寄存器CLRFACCCLOCALLF_norm;规格化ACCBCLRFACCCLOCLRFACCCHIC

25、LRFTIMESMOVFACCAHI;除数为零?BTFSSSTATUS ZGOTOFD0;否,求商MOVFACCALOBTFSCSTATUS ZRETLW01;是,返回FD0CALLNEG_A;除数取补FD1MOVFACCBHI 0;ACCBHI送 ACCDLOMOVWFACCDLOCALLD_add1;被除数尾数大于除数尾数?BTFSSSTATUS CGOTOFD2RRF1BCFSTATUS C;是,被除数右移规格化,直到小于除数为止RRFACCBHIRRFACCBLOINCFTIMESRRFACCCHIBCFSTATUS CGOTOFD1FD2CALLDDIV;否,调用双字节除法子程序,求

26、商的尾数MOVFTIMES 0;根据右移规格化次数调整ACC的码ADDWFEXPBMOVFEXPA 0;求冏的阶码SUBWFEXPBCALLF_norm;商规格化BTFSCSIGN, 7;商为负?CALLNEG_B;是,取补CALLNEG_A;除数还原RETURN;浮点数除法完成,返回DDIVMOVLWMOVWF0X0FACCDHI;初始化ACCDHIDV1BCFSTATUS CRLFACCCLO;左移商RLFACCCHIRLFACCBLO;左移余数RLFACCBHIMOVFSTATUS 0;暂存STATUS器MOVWFACCDLOMOVFACCBHJ 0;ACCBHI 送 TEMP1MOVW

27、FtempiMOVFACCALO 0;ACCB-ACCAADDWFACCBLO 0MOVWFTEMPBTFSCSTATUS CINCFtempiMOVFACCAHJ 0ADDWFtempi 0BTFSCACCDLO 0;左移余数时移出来的数为1?GOTODV2TESTCBTFSSSTATUS C;是,再判断ACCB1数是否大于ACCAGOTODV3DV2MOVWFACCBHI;是,余数送ACCBMOVFTEMP 0MOVWFACCBLOINCFACCCLO;商加1DV3DECFSZACCDHI;商求取完毕?GOTODV1MOVFACCCHI 0;是,将商送ACCBMOVWFACCBHIMOVF

28、ACCCLO 0MOVWFACCBLORETLW00D_add1MOVFACCALO 0;加数、被加数低半字节相加ADDWFACCBLO 0BTFSCSTATUS C;有进位?INCFACCDLO;ACCDf氐半字节加1MOVFACCAHJ 0;ACCAHI+ACCDLOADDWFACCDLORETLW0;子程序返回SETUPMOVLW.15MOVWFTEMPMOVFMOVWFACCBHJ 0 ACCDHIACCBLO 0 ACCDLOACCBHI ACCBLO 0MOVFMOVWFCLRFCLRFRETLWNEG_A取反COMFINCF BTFSCDECFCOMFRETLWACCALOACC

29、ALOSTATUS ZACCAHIACCAHI0;ACCALOX 反力口 1;低8位后进位吗?;有,ACCAHI减 1,再; 否,ACCAHI直接取反NEG_BDECFCOMFBTFSCDECFCOMFRETLWACCBLO ACCBLOSTATUS Z ACCBHI ACCBHI0;ACCBLOX 反力口 1;低8位后进位吗?;有,ACCBH减1 ,再取反;否,ACCBHI直接取反S_SIGNMOVF单元XORWF MOVWF BTFSS GOTOCOMF INCF BTFSC DECF COMFCHEK_ABTFSCCALL RETLW 和ACCB匀为负,返回ACCAH,I 0ACCBHI

30、I 0 SIGNACCBHII 7CHEK_A ACCBLO ACCBLOSTATUS ZACCBHI ACCBHINEG_A0;ACCAHI 异或 ACCBHI 结果送 SIGN;ACCB为负?;否,检查ACCA;是,ACCBX补ACCAH,I 7 ;ACCA为负?;ACCA为负,取补;ACCAF_normMOVFBTFSSGOTOMOVFBTFSCRETLWACCBHI; ACCB= 0?STATUS ZC_normACCBLOSTATUS Z0;是,不需规格化,返回C_normBTFSCGOTOACCBHI 7C_norm2;否。ACC斯负?C_norm1BTFSCACCBHI 6;为正

31、。规格化完毕?RETLW0;ACCBHI.6=1 ,规格化结束CALLSHFTSL;否。ACC皿移DECFEXPB;EXPB减1GOTOC_norm1;重新判断规格化完毕否?C_norm2BTFSSACCBHJ 6;ACCB为负。规格化完毕否?RETLW0;ACCBHI.6=0,规格化结束BCFSTATUS CCALLSHFTSL;否,ACCESSBSFACCBHJ 7;加符号DECFEXPB;EXPB 减 1GOTOC_norm2;重新判断规格化完毕否?SHFTSLBCFSTATUS , C;ACCB 左移子程序RLFACCCLORLFACCCHIRLFACCBLORLFACCBHIRETL

32、W0(7)定点数转化为浮点数程序LISTp=16f877INCLUDEpl6f877.incACCBLOEQU23;存放定点整数和转换后浮点数的尾数ACCBHIEQU24EXPBEQU25;存放转换后浮点数的阶码ACCCLOEQU26;临时寄存器ACCCHIEQU27;临时寄存器ACCDLOEQU28;临时寄存器ACCDHIEQU29; 临时寄存器SIGNEQU2B;存放被转换数的符号ORG0X0000STARTGOTOMAINORG0X0100DtoFCLRFSIGN;根据被转换数确定结果的符号,对负数取补BTFSSACCBHJ 7GOTOINTF1BSFSIGN 7CALLNEG_BINT

33、F1MOVLW.15;初始化EXPBMOVWFEXPBCLRFACCCHICLRFACCCLOCALLF_norm;对ACCB进行规格化BTFSSSIGN, 7;结果为负?GOTODtoF1CALLNEG_B;是,求补DtoFIRETURNF_normMOVFACCBHI;ACCB= 0 ?BTFSSSTATUS ZGOTOC_normMOVFACCBLOBTFSCSTATUS ZRETLW0;是,不需规格化,返回C_normBTFSCACCBHI 7;否。ACC斯负?GOTOC_norm2C_norm1BTFSCACCBHJ6;为正。规格化完毕?RETLW0;ACCBHI.6=1 ,规格化结

34、束CALLSHFTSL;否。ACCESSDECFEXPB;EXPB 减 1GOTOC_norm1;重新判断规格化完毕否?C_norm2BTFSSACCBHJ 6;ACCB为负。规格化完毕否?RETLW0;ACCBHI.6=0,规格化结束BCFSTATUS CCALLSHFTSL;否,ACC衽移BSFACCBHJ 7;加符号DECFEXPB;EXPB减 1GOTOC_norm2;重新判断规格化完毕否?SHFTSLBCFSTATUS , C;ACCB左移子程序RLFACCCLORLFACCCHIRLFACCBLORLFACCBHIRETLW0(8) 3字节浮点数转换为定点整数程序FtoDCLRFS

35、IGN;清结果符号寄存器MOVFACCBHJ 0BTFSSACCBHII 7;被转换数是否为负?GOTOD1BSFSIGN 7;是,SIGN.7 置 1CALLNEG_B;被转换数取补D1BTFSSEXPB 7;被转换数为正,再判阶码为负否?GOTOD2CLRFACCBHI;为负,被转换数小于1,无法用定点数表示CLRFACCBLORETLW0D2MOVLW.16;被转换数阶码减16 (十进制数)SUBWFEXPB 0BTFSSSTATUS C;阶码小于16?GOTOD3MOVLW0XFF;阶码大于Q 16,置 ACCBW,返回MOVWFACCBHIMOVWFACCBLORETLW01D3CA

36、LLFTOW3;调用子程序将浮点数转换为定点数BTFSCSIGN, 7;定点数为负?CALLNEG_B;是,取补RETLW0;否,返回FTOW3MOVLW.15;EXPB=15(十进制数)?SUBWFEXPB 0BTFSCSTATUS ZRETLW0;是,返回BCFSTATUS C;否,ACCB1续右移,EXP劭 口 1RRFACCBHIRRFACCBLOINCFEXPBGOTOFTOW3;OJ断 EXPB=15(9)双字节定点数至5位BC加转换程序LISTp=16f877INCLUDEp16f877.incACCBLOEQU23;存放被转换的双字节整数低8位ACCBHIEQU24;存放被转换

37、的双字节整数高8位ACCCLOEQU26;存放 5 位 BCTOACCCHIEQU27ACCDLOEQU28ACCDHIEQU29TEMPEQU2A; 临时寄存器SIGNORGEQU2B;被转换数符号寄存器0X0000STARTGOTOMAINORG0X0100BtoBCDCLRFSIGN;初始化符号寄存器BTFSSACCBH,I 7;被转换数为负?GOTOLOOP1;否,转 BtoBCDBSFSIGN, 7;是,存符号CALLNEG_B;ACCB 取补LOOP1BCFSTATUS C;清进位位MOVLW.16;移位计数器赋初值MOVWFCOUNTCLRFACCCHI;初始化出口 器CLRFA

38、CCCLOCLRFACCDHILOOP16RLFACCBLO ;ACCB左移一位至出口器RLFACCBHIRLFACCDHIRLFACCCLORLFACCCHIDECFSZCOUNT;移位计数器=0?GOTOADJDEC;否,转 ADJDECRETLW0;是,返回ADJDECMOVLWACCDHI ;指针指向 ACCDHIMOVWFFSRCALLADJBCD;调用BCD码校正子程序MOVLWACCCLO;指针指向 ACCCLOMOVWFCALLFSRADJBCDACCCHI FSRADJBCDLOOP16;调用BCD码校正子程;指针指向ACCCHI;调用BCD码校正子程;ACCB重新左移序序M

39、OVLW MOVWF CALLGOTOADJBCDMOVLW00X03;LSD+ 37?ADDWF MOVWF BTFSC MOVWF MOVLW ADDWF MOVWF BTFSC MOVWF RETLW(10)浮点数至5位压缩 LISTINCLUDEACCALO ACCAHI EXPAACCBLO 浮点数尾数ACCBHI EXPB 浮点数阶码ACCCLO ACCCHI ACCDLO ACCDHI TEMP tempi TIMES SIGN COUNT C_MUL C_DIV aFPOLINDF, 0 TEMP TEMP 3 INDF 0X30 INDF, 0 TEMP TEMP 7 IND

40、F 0BC加转换程序 p=16f877p16f877.incEQU EQU EQUEQUEQU EQUEQU EQU EQU EQUEQU EQU EQUEQU EQU EQU EQUEQU202122232425262728292A30312B2F2C2D2E;是,LSD=LSD+3;否,MS 37?;是,MSD=MSD3;返回;临时寄存器;临时寄存器;存放被转换;存放被转换;临时寄存器;临时寄存器;临时寄存器;临时寄存器;临时寄存器;临时寄存器;临时寄存器;临时寄存器;临时寄存器;存放小数点位置;存放小数点;存放被转换数的符号ORG0X0000STARTGOTOMAINORG0X0100F

41、toBCDCLRFC_MUL;清小数点位置数寄存器CLRFC_DIVCLRFACCAHI;求取结果符号,存于 FPOL.7CALLS_SIGNMOVFSIGN , 0MOVWFFPOLMOVLW50;ACCA赋初值,ACCA=10(十进制)MOVWFACCAHICLRFACCALOMOVLW04MOVWFEXPAMU15BTFSSEXPB 7;阶码EXPB0GOTOMUl2;否,转MU12MU11CALLF_mpy;是,ACCK 10INCFC_MUL;小数点左移,寄存器加 1GOTOMUl5;重新判断阶码是否小于零MU12MOVLW.12;阶码 EXPB18SUBWFEXPB 0BTFSSS

42、TATUS CGOTONEXT;否,表示阶码12 EXPB16,求取BCD码值DIV1CALLFDIV;是,EXP& 101INCFC_DIV;小数点右移寄存器加GOTOMUl4;重新判断阶码值NEXTCALLFTOW3;调子程序,将浮点数转换为定点数CALLBtoBCD; 调双字节数到BC咖子程序,求BCMMOVFACCCHI;ACCCHI=0 ?BTFSSSTATUS ZRETLW0;否,返回MOVLW04;是,结果左移4次,保证ACCCHI不为0MOVWFTIMESBCFMUl6RLFRLFRLFDECFSZGOTO MOVF BTFSCGOTO DECFSTATUS CACCDHIAC

43、CCLOACCCHITIMESMUl6C_DIV;C_DIV=0 ?STATUS ZTEMUL;是,转判断C_MULC_DIV; 否,小数点右移,寄存器减1RETLWTEMULINCFRETLW(11)进制码和BC加转换程序LIST P=16F877INCLUDE “P16F877.INC”0C_MUL;小数点左移,寄存器加 105#DEFINE BiTOBCD Y TOC o 1-5 h z R2EQU0 x20R1EQU0 x2lR0EQU0 x22BinHEQU0 x23BinLEQU0 x24CNTEQU0 x25TMPEQU0 x26BinBHEQU0 x27BinBLEQU0 x2

44、85ORG 0 x00GOTO MAINORG 0 x10BiBCD MOVLW0 x10;MOVWFCNT;移位次数BCFSTATUS,CCLRFR0CLRFR1CLRFR2LOOP RLFBinLRLFBinHRLFR0RLFR1RLFR2DECFSZ CNTGOTOADJDECRETURNADJDEC MOVLWR0;调整R0MOVWFFSRCALLADJBCDMOVLWR1;调整RlMOVWFFSRCALLADJBCDMOVLWR2;调整R2MOVWFFSRCALLADJBCDGOTOLOOPADJBCD MOVLW 0 x3ADDWF INDF,WMOVWF TMPMOVWF IND

45、F;LSD=LSD+3MOVLW 0 x30ADDWF INDF,WMOVWF TMPMOVWF INDF;MSD=MSD+3RETURNBCDBi CLRFBinHMOVFR2,WANDLW 0 x0FMOVWF BinL;(BinL) =R2CALLMPY 10A;(Bin) = (Bin x 10SWAPFRI, WCALLMPY10B;(Bin ) = (Bin)+R1MOVF R1,WCALLMPY 10B;(Bin) =(Bin)+R1*10SWAPFR0,WCALLMPY10B;(Bin) =(Bin)+R0*10MOVFR0,W;(Bin) =(Bin)+R0ANDLW 0 x

46、0FADDWF BinLBTFSC STATUS,CINCF BinHRETURNMPY10B ANDLW 0 x0FADDWF BinLBTFSC STATUS,CINCFBinHSTATUS, CMPY 10A BCFRLFBinL, WMOVWF BinBLRLF BinH,WMOVWF BinBH;(Bin) x 2(BinB)BCF STATUS,CRLF BinLRLF BinHBCF STATUS,CBCF STATUS,CRLF BinLRLF BinH;(Bin)*8 (Bin )MOVF BinBL, WADDWF BinL BTFSC STATUS,CINCF BinH

47、MOVF BinBH, W ADDWF BinH RETURNMAIN ORG 0 x100;主程序IF BiTOBCD=Y;二进制转换为BC加MOVLW 0 x7FMOVWF BinHMOVLW 0 xFFMOVWF BinLCALL BiBCD;结果在R2, R1, R0中ENDIFIF BITOBCD=N;BCD码转换为二进制数MOVLW 0 x6MOVWFR2MOVLW 0 x55MOVWFR1MOVLW0 x35MOVWFR0CALL BCDBi;结果在 B inH、BinL中ENDIFGOTO$END(12)定点数开方程序LISTp=16f877INCLUDEp16f877.inc

48、ACCALOEQU0X20ACCAHIEQUACCALO+1EXPAEQUACCALO+2ACCBLOEQUACCALO+3ACCBHIEQUACCALO+4EXPBEQUACCALO+5ACCCLOEQUACCALO+6ACCCHIEQUACCALO+7ACCDLOEQUACCALO+8ACCDHIEQUACCALO+9TEMPEQUACCDHI+1SIGNEQUACCDHI+2SQRTLOEQUACCALOSQRTHIEQUACCAHINUMLOEQUACCDHI+4NUMHIEQUACCDHI+5COUNTEQUACCDHI+6;此方法定义的数据块为连续层断,只要;将A行改变,就可以将数

49、据整块搬动到;新的地方,为调试带来方便,是比较推;崇的一种寄存器定义方法LUPCNTEQU.10.*ORG0X00GOTOMAINORG.*0X10INITMOVLWLUPCNTMOVWFCOUNTMOVFNUMHJ 0MOVWFSQRTHIMOVFNUMLO 0MOVWFSQRTLOBCFSTATUSCRRFSQRTHI I1RRFSQRTLO1RETLW0DIV2BCFSTATUS CRRFACCBHI I0MOVWFSQRTHIRRFACCBLO 0MOVWFSQRTLORETLW0SQRTSLOOPCALLMOVFINITNUMLO 0MOVWFMOVFACCBLONUMHJ 0MOV

50、WFACCBHICALLD_DIVSCALLD_ADDCALLDIV2DECFSZCOUNT1GOTOSLOOPRETURND_DIVSCALLSETUPCLRFACCCHICLRFACCCLODLOOPBCFSTATUSRLFACCDLORLFACCDHIRLFACCCLORLFACCCHIMOVFACCAHJ 0SUBWFACCCHI 0BTFSSSTATUS ZGOTONOCHKMOVFACCALO 0SUBWFACCCLO 0NOCHKBTFSSSTATUS CGOTONOGOMOVFACCALO 0SUBWFACCCLO 1BTFSSSTATUS CDECFACCCHJ 1MOVFA

51、CCAHJ 0SUBWFACCCHI 1BSFSTATUS CNOGORLFACCBLORLFACCBHIDECFSZTEMPGOTODLOOPRETLW0.*SETUPMOVLW16MOVWFTEMPMOVFACCBHIJ 0MOVWFACCDHIMOVFACCBLO 0MOVWFCLRFCLRFRETLWACCDLOACCBHIACCBLO0NEG_ACOMFINCFBTFSCDECFCOMFRETLWACCALO 1ACCALO 1STATUS ZACCAHI I 1ACCAHI I 10D_ADDMOVFADDWFBTFSCINCFMOVFADDWFRETLW(13)浮点数升方程序LI

52、STINCLUDEACCALO 0ACCBLO 1STATUS CACCBHI 1ACCAHII 0ACCBHI 1 0P=16f877p16f877.incACCALOEQU20HACCAHIEQUACCALO +1EXPAEQUACCALO +2ACCBLOEQUACCALO +3ACCBHIEQUACCALO +4EXPBEQUACCALO +5ACCCLOEQUACCALO +6ACCCHIEQUACCALO +7ACCDLOEQUACCALO +8ACCDHIEQUACCALO +9TEMPEQUACCALO +0AtempiEQUACCALO +0BTIMESEQUACCALO +

53、0CSIGNEQUACCALO +0DCOUNTEQUACCALO +0EC_MULEQUACCALO +0FC_DIVEQUACCALO +10FPOLEQUACCALO+ 11;符号放置位NUMLOEQUFPOL+1NUMHIEQUFPOL+2NUMMEQUFPOL+4LUPCNTCONSTANTEQUC=0.10CONSTANTZ=2CONSTANTMODEL16=1CONSTANTFALSE=0. *ORG0X0000NOPGOTOMAINORG0X0010. *INIT1DECFEXPB;假设迭代根的初始值为其原值的一半MOVFACCBHI WMOVWFACCAHIMOVFACCBL

54、O WMOVWFACCALOMOVFEXPB WMOVWFEXPARETLW0SQRTFMOVLWLUPCNTMOVWFCOUNTMOVFACCBHI WMOVWFNUMHIMOVFACCBLO WMOVWFNUMLOMOVFEXPB WMOVWFNUMM;存储被开方的数BTFSCACCBHI 7GOTOTIQIAN;如果被开方数是个负数,则返回小数CALLINIT1SLOOP1MOVFNUMLO 0MOVWFACCBLOMOVFNUMHJ 0MOVWFACCBHIMOVFNUMM0MOVWFEXPBCALLFDIVCALLF_addCALLINIT1DECFSZCOUNT1GOTOSLOOP

55、1RETURNTIQIANMOVLW0X40MOVWFACCBHICLRFACCBLOMOVLW0X80MOVWFEXPB;如果被开方数是一个负数,返回一个极小的浮点数RETURN(14)均值滤波程序INDFEQU00H;定义INDF寄存器STATUSEQU03H;足乂状态奇存命FSREQU04H;定义FSR寄存器TRISAEQU05H;定义TRISA寄存器RP1EQU06H;定义状态寄存器中的页选仪RP1RP0EQU05H;定义状态寄存器中的页选仪RP0INTCONEQU0BH;定义中断寄存器PIR1EQU0CH;定义PIR中断寄存器ADRESHEQU1EH;定义ADRES用存器ADCON0

56、EQU1FH;定义ADCON*器ADRESLEQU9EH;定义ADRESLT器PIE1EQU8CH;定义PIE1寄存器ADCON1EQU9FH;定义ADCON寄存器GIEEQU07H;定义中断寄存器中断使能位CEQU00H;定乂肽出奇仔器中的进借位标志位CZEQU02H;定乂彳大忠奇仔器中H勺零标志位ZHHEQU20H;定义16位输入高8位LLEQU21H;定义16位输入低8位AAEQU22H;定义BC加最高位BBEQU23H;定义BC加4/3位CCEQU24H;定义BC加2/1位TEMPHEQU25H;定义临时变量TEMPHTEMPLEQU26H;定义临时变量TEMPLCOUNTEQU27H

57、;定义计数器变量COUNTADHEQU28H;定义临时变量ADHADLEQU29H;定义临时变量ADLST_TEMP EQU2AH;定义临时变量ST_TEMPW_TEMPEQU2BH;定义临时变量W_TEMPDATA1EQU2CH;定义外循环义量DATA2EQU2DH;定义存储外循环次数的变量COUNT2EQU08H;定义存储内循环次数的变量ADIEEQU06H;定义ADIEPEIEEQU06H;定义PDIEORG00HGOTOMAINORG04HGOTOINTERRETFIEMOVLW01H;初始化ADCON0MOVWFADCON0;BCFSTATUS,RP1;选择体1BSFSTATUS,R

58、P0;MOVLW0XFF;将RA 口设置为输入MOVWFTRISA;MOVLW0FFH;初始化ADCON1MOVWFADCON1;BSFPIE1,ADIE;开AD中断BCFSTATUS,RP1;选择体0BCFSTATUS,RP0;CLRFPIR1;清AD中断标志BSFINTCON,GIE;开中断BSFINTCON,PEIE;开外围中断MOVLW00H;初始化COUN寄存器MOVWFCOUNT;BSFLOOPADCON0,2;开ADBTFSSCOUNT,3;是否已经米样8 次)GOTONEXT;否,等待BCFINTCON,GIE;关中断BCFADCON0,2;关ADBCFSTATUS,C;清除进

59、位位RRFRRFADHADL;ADH/L 除以 2RRFRRFADHADL;ADH/L 除以 2RRFRRFADHADL;ADH/L 除以 2MOVFADH;存储滤波量ADHMOVWFTEMPH;MOVFADL;存储滤波量ADLMOVWFTEMPL;CLRFADH;清人口味器,为下一次作准备CLRFADL;清ADL寄存器MOVLWMOVWF00HCOUNT;初始化COUN寄存器BSFNEXTINTCON,GIE;开中断CALLDELAY;GOTOINTERLOOP;等待MOVWFW_TEMP;暂存W寄存器MOVFSTATUS,。;暂存 STATUSt存器MOVWFST_TEMPBCFSTATU

60、S,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

温馨提示

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

评论

0/150

提交评论