历史上的今天
返回首页

历史上的今天

今天是:2025年07月30日(星期三)

正在发生

2018年07月30日 | PIC单片机实现双字节无符号数的乘法

2018-07-30 来源:eefocus

一、编写子程序Mpy_16,实现双字节无符号数乘法。自行定义变量,其中:

  • ACCALO ;存放乘数低 8 位

  • ACCAHI ;存放乘数高 8 位

  • ACCBLO ;存放被乘数低 8 位和乘积第 16~23 位

  • ACCBHI ;存放被乘数高 8 位和乘积第 24~31 位

  • ACCCLO ;存放乘积第 0~7 位

  • ACCCHI ;存放乘积第 8~15 位

编写Main主程序,使用乘数 0x4015和被乘数0x3321对编写的子程序进行测试,结果应为0x0CCC71B5。

程序框图:


list        p=16f877A   ;标明所用的处理器类型

#include      ;调用头文件  

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF

 

;*****************变量定义*******************************************************

 

 ACCALO          EQU    0x20  ;存放乘数低8位

 ACCAHI          EQU    0x21  ;存放乘数高8位

 ACCBLO          EQU    0x22  ;存放被乘数低 8 位和乘积第 16~23 位

 ACCBHI          EQU    0x23  ;存放被乘数高 8 位和乘积第 24~31 位

 ACCCLO          EQU    0x24  ;存放乘积第 0~7 位

 ACCCHI          EQU    0x25  ;存放乘积第 8~15 位

 ACCDLO          EQU    0x26  ;临时寄存器

 ACCDHI          EQU    0x27  ;临时寄存器

 TEMP            EQU    0x28  ;临时寄存器

 

;*******************************************************************************

    ORG         0x0000           ; 复位入口地址

    nop                          ; 兼容ICD调试工具,必须加nop

    goto        Main             ; 跳转至Main函数

;*************************Main 函数的代码****************************************

Main                                               

    MOVLW  0x21                  ; 被乘数0x3321送ACCB

    MOVWF  ACCBLO

    MOVLW  0x33

    MOVWF  ACCBHI   

    MOVLW  0x15                  ; 乘数0x4015送ACCA

    MOVWF  ACCALO

    MOVLW  0x40

    MOVWF  ACCAHI   

    CALL   Mpy_16         ; 调用双字节无符号数乘法子程序,求积,结果应为0xCCC71B5

    nop

    goto   $                     ; 停机

;*********************************8 ×8 位无符号乘法子程序 ********************

    ORG  0X0100

Mpy_16                 

    CALL         SETUP           ;调用子程序,将ACCB的值送ACCD

MLOOP  

    BCF          STATUS, C       ;清进位位

    RRF          ACCDHI          ;ACCD右移

    RRF          ACCDLO

    BTFSC        STATUS, C       ;判断是否需要相加

    CALL         Add_16          ;加乘数至 MB

    RRF          ACCBHI          ;右移部分乘积

    RRF          ACCBLO

    RRF          ACCCHI

    RRF          ACCCLO 

    DECFSZ       TEMP            ;乘法完成否?

    GOTO         MLOOP           ;否,继续求乘积

    RETURN                       ;子程序返回

;*****************************************************************************

SETUP  

    MOVLW    .16                 ;初始化TEMP寄存器 

    MOVWF    TEMP

    MOVF     ACCBLO, W           ;被乘数送ACCD

    MOVWF    ACCDLO 

    MOVF     ACCBHI, W        

    MOVWF    ACCDHI            

    CLRF     ACCBLO              ;清ACCB

    CLRF     ACCBHI

    CLRF     ACCCLO              ;清ACCC

    CLRF     ACCCHI

    RETURN                       ;子程序返回

;****************************************************************************

Add_16         

    MOVF     ACCALO, W           ;ACCA和ACCB低8位相加 

    ADDWF    ACCBLO, F

    BTFSC    STATUS, C           ;有进位否?

    INCF     ACCBHI, F           ;有,ACCB高位加1

    MOVF     ACCAHI, W           ;ACCA和ACCB高8位相加

    ADDWF    ACCBHI, F          

    RETURN                       ;子程序返回  

;*****************************************************************************

END                              ; 程序结束

二、编写宏命令Mpy_16,实现单字节无符号数乘法。编写Main主程序调用宏命令并对运算结果进行测试。

程序框图:

PIC双字节无符号数乘法的宏指令实现


list        p=16f877A   ;标明所用的处理器类型

#include      ;调用头文件  

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF

 

;******************************************************************************

Mpy_16 macro ACCALO1,ACCAHI1,ACCBLO1,ACCBHI1,ACCCLO1,ACCCHI1,ACCDLO1,ACCDHI1,TEMP1

    SETUP TEMP1,ACCBLO1,ACCBHI1,ACCCLO1,ACCCHI1,ACCDLO1,ACCDHI1 ;将ACCB的值送ACCD

MLOOP  

    BCF          STATUS, C       ;清进位位

    RRF          ACCDHI1         ;ACCD右移

    RRF          ACCDLO1

    BTFSS        STATUS, C       ;判断是否需要相加

    GOTO         NEXT

    Add_16       ACCALO1,ACCAHI1,ACCBLO1,ACCBHI1  ;加乘数至 MB 

NEXT    

    RRF          ACCBHI1         ;右移部分乘积

    RRF          ACCBLO1

    RRF          ACCCHI1

    RRF          ACCCLO1    

    DECFSZ       TEMP1           ;乘法完成否?

    GOTO         MLOOP           ;否,继续求乘积

ENDM

;*********************************************************************************

SETUP   macro   TEMP2,ACCBLO2,ACCBHI2,ACCCLO2,ACCCHI2,ACCDLO2,ACCDHI2 

    MOVLW    .16                 ;初始化TEMP寄存器 

    MOVWF    TEMP2

    MOVF     ACCBLO2, W          ;被乘数送ACCD

    MOVWF    ACCDLO2 

    MOVF     ACCBHI2, W        

    MOVWF    ACCDHI2            

    CLRF     ACCBLO2             ;清ACCB

    CLRF     ACCBHI2

    CLRF     ACCCLO2             ;清ACCC

    CLRF     ACCCHI2

ENDM

;********************************************************************************

Add_16  macro  ACCALO3,ACCAHI3,ACCBLO3,ACCBHI3        

    MOVF     ACCALO3, W          ;ACCA和ACCB低8位相加 

    ADDWF    ACCBLO3, F

    BTFSC    STATUS, C           ;有进位否?

    INCF     ACCBHI3, F          ;有,ACCB高位加1

    MOVF     ACCAHI3, W          ;ACCA和ACCB高8位相加

    ADDWF    ACCBHI3, F            

ENDM                             ;结束宏指令定义   

;****************************************************************

 ACCALO          EQU    0x20  ;存放乘数低8位

 ACCAHI          EQU    0x21  ;存放乘数高8位

 ACCBLO          EQU    0x22  ;存放被乘数低 8 位和乘积第 16~23 位

 ACCBHI          EQU    0x23  ;存放被乘数高 8 位和乘积第 24~31 位

 ACCCLO          EQU    0x24  ;存放乘积第 0~7 位

 ACCCHI          EQU    0x25  ;存放乘积第 8~15 位

 ACCDLO          EQU    0x26  ;临时寄存器

 ACCDHI          EQU    0x27  ;临时寄存器

 TEMP            EQU    0x28  ;临时寄存器

 

;****************************************************************************

    ORG         0x0000           ; 复位入口地址

    nop                          ; 兼容ICD调试工具,必须加nop

    goto        Main             ; 跳转至Main函数

;**************************************Main 函数的代码***********************

Main                                               

    MOVLW  0x21                  ; 被乘数0x3321送ACCB

    MOVWF  ACCBLO

    MOVLW  0x33

    MOVWF  ACCBHI   

    MOVLW  0x15                  ; 乘数0x4015送ACCA

    MOVWF  ACCALO

    MOVLW  0x40

    MOVWF  ACCAHI   

    Mpy_16 ACCALO,ACCAHI,ACCBLO,ACCBHI,ACCCLO,ACCCHI,ACCDLO,ACCDHI,TEMP            

    ;调用宏指令,求积,结果应为0xCCC71B5

    nop

    goto   $                     ; 停机  

;******************************************************************************

END                              ; 程序结束


推荐阅读

史海拾趣

ELANTEC (Renesas )公司的发展小趣事

Renesas Electronics的前身可以追溯到1958年,当时日立制作所成立了半导体部门。随着技术的不断进步和市场的扩大,该部门逐渐发展壮大,成为日立公司内的一个重要业务部门。进入20世纪90年代,随着半导体市场的竞争加剧,日立公司决定将半导体业务独立出来,以便更加灵活地应对市场变化。1999年,日立半导体部门正式更名为ELANTEC,开始了独立发展的道路。

D1 International Inc公司的发展小趣事

作为一家有社会责任感的企业,D1 International Inc公司始终关注环境保护和可持续发展。公司在生产过程中采取环保措施,减少废弃物排放,同时积极推广绿色电子产品。此外,D1 International Inc公司还积极参与社会公益活动,回馈社会,为构建和谐社会贡献自己的力量。

BOOKHAM公司的发展小趣事

BOOKHAM公司自创立之初,就专注于光学元件的研发和生产。随着电子行业的快速发展,公司不断投入研发资源,终于在一次技术突破中,成功开发出一款高性能的光学元件。这款元件凭借其卓越的性能和稳定的品质,迅速获得了市场的认可,BOOKHAM公司也因此名声大噪,逐渐在电子行业中崭露头角。

冠西电子(COSMO)公司的发展小趣事

冠西电子一直重视产品质量和客户服务,通过了国际标准化组织的ISO9001质量管理标准认证,以及各国的安规认证,如UL、TUV等。这些认证不仅证明了冠西电子产品的品质卓越,也为其赢得了更多国际客户的认可。此外,冠西电子还积极与国际知名企业开展合作,共同推动电子行业的发展。

Coherent Inc公司的发展小趣事

2023年,Coherent Inc.在纽交所上市敲钟,标志着公司的发展进入了新的阶段。这一事件不仅彰显了公司的实力和影响力,也为其未来的发展提供了更多的资本支持和发展空间。上市后的公司将继续加大在技术研发和市场拓展方面的投入,推动激光技术的进一步发展。

长运通(CYT)公司的发展小趣事

长运通注重与高校和研究机构的合作,积极引进和培养人才。公司与电子科技大学、西安电子科技大学等知名高校建立了紧密的合作关系,共同开展技术研发和人才培养。通过与高校的合作,长运通不仅获得了更多的技术资源支持,也为公司培养了一批高素质的研发人才。这些人才为公司的发展提供了强有力的支撑。

问答坊 | AI 解惑

交友--学习

希望能结交一些学习单片机的朋友~~~~有意者+++QQ464598744…

查看全部问答>

dsp一些基本常识,不是泛泛而谈,都是很具体很实用的

1.5V/3.3V如何混接? 2.为什么要片内RAM大的DSP效率高? 3.为什么DSP从5V发展成3.3V? 4如何选择DSP的电源芯片? 5.软件等待的如何使用? 6.中断向量为什么要重定位? 7.DSP的最高主频能从芯片型号中获得吗? 8.DSP可以降频使用吗? 9.如何 ...…

查看全部问答>

程序多跑一次

程序如下: while (1)   {          /* Loop forever */       if ( UART0Count != 0 )       {            U0 ...…

查看全部问答>

请问PC104+的主板兼容PC104设备吗?

比如一张PC104的IO卡插在PC104+的ISA上应该能使用吧?…

查看全部问答>

makefile应选择手写还是工具生成?

如果已经可以针对某个项目编写makefile,完成编译链接功能 还可以用脚本提供编译选项界面 当然还没能实现跨平台 还有没有必要去学习使用类似GNU Autotools和cmake类似的工具自动生成makefile呢? …

查看全部问答>

为什么platform builder for windows mobile不能用?请大家给些建议吧!

每次运行都会得到这样的提示:     The setting for the Platform Builder gloabal WINCEROOT is missing or invalid, so you cannot create an OS design or open a workspace.To set WINROOT in the IDE,go to the tools menu,choose ...…

查看全部问答>

OMAP3530平台的Mcbsp1配置问题

RT,利用McBSP1跟EEPROM通信,初始化代码如下:         //Init necessary regs         //SPCR1:0101 1000 0000 0000         OUTREG32(&pMcbsp1Regs->SPCR1,0x5800);     ...…

查看全部问答>

为什么在FC5上用安装好BINUTILS后无法安装交叉编译环境GCC,谢谢!

我的环境是FC5,gcc-4.0.1,linux-2.6.20 用的是最新的linux-2.6.21,binutils-2.17,gcc-4.1.2 binutils都安装好了,而且测试一下没有问题. 在执行MAKE ALL-GCC的时候出现一大堆错误. 执行了很多次都没有关系. 想让各位给帮一下啊! 谢谢了。 ...…

查看全部问答>

诚聘软件工程师

招聘职位名称:软件工程师 1名 职位描述: 1、 熟悉嵌入式LINUX系统软件开发; 2、 熟悉音频视频编解码原理; 3、 熟悉TCP/IP网络编程; 4、 有IPCAM、DVS相关产品2年以上开发经验,主要是做IPCAM产品开发; 5、 熟悉HISI-3512、3515芯片开发 ...…

查看全部问答>

光敏电阻怎么选?

光敏电阻的哪个参数能说明光敏电阻的灵敏度呢?光敏电阻是不是对不同光谱有不同的灵敏度啊?为什么光敏电阻的参数中的‘光谱特性’都只有一个值呢?谢谢啊,感激不尽…

查看全部问答>