首页 > 学院 > 开发设计 > 正文

PIC单片机实现双字节无符号数的乘法

2019-11-06 07:45:36
字体:
来源:转载
供稿:网友

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

ACCALO ;存放乘数低 8 位ACCAHI ;存放乘数高 8 位ACCBLO ;存放被乘数低 8 位和乘积第 16~23 位ACCBHI ;存放被乘数高 8 位和乘积第 24~31 位ACCCLO ;存放乘积第 0~7 位ACCCHI ;存放乘积第 8~15 位

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

程序框图:PIC双字节无符号数乘法程序框图

list p=16f877A ;标明所用的处理器类型#include <p16f877A.inc> ;调用头文件 __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 0X0100Mpy_16 CALL SETUP ;调用子程序,将ACCB的值送ACCDMLOOP 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 <p16f877A.inc> ;调用头文件 __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的值送ACCDMLOOP 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 ACCCHI2ENDM;********************************************************************************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 ; 程序结束
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表