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

2019-04-15 11:47发布

一、编写子程序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 ;调用头文件 __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 ; 程序结束