历史上的今天
今天是: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主程序调用宏命令并对运算结果进行测试。
程序框图:

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 ; 程序结束
史海拾趣
|
1.5V/3.3V如何混接? 2.为什么要片内RAM大的DSP效率高? 3.为什么DSP从5V发展成3.3V? 4如何选择DSP的电源芯片? 5.软件等待的如何使用? 6.中断向量为什么要重定位? 7.DSP的最高主频能从芯片型号中获得吗? 8.DSP可以降频使用吗? 9.如何 ...… 查看全部问答> |
|
如果已经可以针对某个项目编写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 ...… 查看全部问答> |
|
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的时候出现一大堆错误. 执行了很多次都没有关系. 想让各位给帮一下啊! 谢谢了。 ...… 查看全部问答> |




