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

发布者:灵感驿站最新更新时间:2018-07-30 来源: eefocus关键字:PIC单片机  双字节无符号数  乘法 手机看文章 扫描二维码
随时随地手机看文章

一、编写子程序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                              ; 程序结束


关键字:PIC单片机  双字节无符号数  乘法 引用地址:PIC单片机实现双字节无符号数的乘法

上一篇:手把手教你使用PIC单片机驱动继电器
下一篇:PIC单片机精通_A/D转换&异步串口通讯实例与详解

推荐阅读最新更新时间:2024-03-16 16:10

关于PIC单片机的定时器精准计时的计算
在此用了16C711单片机的TMR0做定时中断,希望实现精准计时,在程序中,TMR0用了晶振的32分频,初值#0FCH,因此POPBEAR兄弟计算出每个定时中断的计时时间为(256-X)*32*4/32768=0.015625秒。注意,问题就在这里!实际上这个时间是TMR0的初值被置入后两个指令周期后(见PIC单片机定时器/计数器资料)到下一次中断发生时的时间。如果要用到定时器的精准定时,必须理解这一概念! 如采用32768Hz的晶振,每个指令周期为122us,在中断处理程序中,到TMR0的初值被置入,共有7条指令,加上TMR0的初值被置入后两个指令周期,如果中断处理程序不直接放在0004H地址而采用GOTO指令的两个周期,一共
[单片机]
基于PIC单片机的智能目标跟踪系统设计方案
摘 要: 通过借鉴嵌入式系统在电子技术、信号处理以及计算机等领域应用的成功经验,在分析目标检测与跟踪算法的基础上,将目标检测与跟踪算法与嵌入式技术相结合,设计一种基于嵌入式PIC32单片机的目标检测与跟踪系统,可以实现目标检测跟踪系统的小型化,智能化,并以具体飞行目标为例进行了目标的识别和跟踪。 研究目的 随着现代社会对军用和民用设备需求的不断扩大及要求的不断提高,运动目标的识别和跟踪技术已经迅速发展成为现代信息处理领域中一项非常重要的技术,也是无人机野外战场侦察技术中的重点和难点,并在许多领域内发挥着不可替代的作用。目前,基于PC 机的目标检测与跟踪技术已趋于成熟,但其在嵌入式平台的应用研究还处于初级阶段。由于嵌入式系统具有
[单片机]
基于<font color='red'>PIC单片机</font>的智能目标跟踪系统设计方案
PIC单片机红外遥控编码及识别
红外遥控应用广泛,而编码及识别往往是单片机初学者最头痛的问题,其实红外编码及识别并不难,关键是要掌握红外编码及识别的方法,首先让我们来了解下红外编码. 一.红外编码. 红外编码一般是以下格式. 9ms 高电平的头+2.4ms低电平的结果码+8byte address code+8byte address code+8 byte user data+ 8byte data 由于采用一体化红外接收头,所以这里要注意发送的高电平实际上是38K的载波,就是高低电平按38K的频率不断地变换,一体化接收头会自动识别,整理为低电平. 另外一点要注意的是,发送的1,和0如图所示,其实是低电平的时间长短
[单片机]
PIC单片机-PWM波
一、编写程序,使用RC2的PWM功能生成频率250Hz的正弦波 #include htc.h #define uint8 unsigned char #define uint16 unsigned int __CONFIG(FOSC_HS &WDTE_OFF &BOREN_OFF &PWRTE_OFF &LVP_OFF); //设置配置位 //WDTE_OFF:disable watchdog timer 看门狗禁止 //LVP_OFF:low voltage programming disabled 低电压编程禁止 //FOSC_HS:high speed crystal/resonator 4M以上晶振选择HS高
[单片机]
<font color='red'>PIC单片机</font>-PWM波
PIC单片机使LCD面板产生闪烁效果的设计
使用LCD面板,信息可以通过多种方式显示。例如,如何将用户的注意力吸引到LCD面板的特定部分?一种不需要任何附加段的方式是产生闪烁效果。 以常见的时钟(见下图)应用为例。小时和分钟之间的“:”通常每秒闪烁一次(显示半秒,隐藏半秒)。 在缺少滴答声或通常伴随模拟外观时钟的秒针时,这可以显示时钟正在计时。它起到一种重要的作用,让用户知道时钟正在工作。 如果电源的电能即将耗尽,则通常整个时钟显示会开始闪烁。这使用户可以立即了解时钟不再显示正确的时间。 在用户设置时间时,通常使用闪烁来显示已进入了新模式,例如闪烁小时来指示正在设置小时,或者闪烁分钟来指示正在设置分钟。在简单时钟中,闪烁用于多种不同用途。如果没有闪烁效果,则
[单片机]
<font color='red'>PIC单片机</font>使LCD面板产生闪烁效果的设计
PIC单片机红外遥控编码与解码的问题分享
一般常用的红外遥控器编码规则都差不多,基本上都同6221原理一样 PIC单片机接收时: 如果用54,57这类片子做的话有一定的难度(假如要做成实时控制的;比如说你还要驱动显示,驱动步进电机,在加上几个按键)原因就是这类片子没有中断 例程如下(用来解6221;分频比为256) RF: BTFSC PORTB,2;;B2口用做接收口 GOTO RF1 BTFSS DOWNBIT;;检测下降沿标制 CLRF RTCCOUNT BSF DOWNBIT;制下降沿标制 BTFSS UPBIT;;检测上升沿标制 RETLW 0 BTFSC IDBIT;;检测码头标制 GOTO RF3 MOVLW 2AH SUBWF
[工业控制]
PIC单片机的配置位
一.配置字 PIC单片机的配置字可以用__CONFIG命令来定义: # include __CONFIG(x) 其中x是配置字,头文件中定义了相应的配置说明符,如: __CONFIG(WDTDIS & XT & UNPROTECT); 这将关闭看门狗,设置XT振方式,程序不加密。注意:不同的配置符间用'&'相联,未定义的部分保留未编程状态。详细的情况请参考头文件及PIC数据手册 二.ID 位置 有些PIC单片机在程序空间外还有ID空间,可用下面的方法来定义: # include __IDLOC(x) 其中x是ID标示,如: __IDLOC(15F0); 将ID的四个单元定义为:1, 5, 15, 0. ID
[单片机]
PIC单片机通用同步异步收发器的编程应用
0 引言 PIC18Fxx8单片机是美国微芯公司推出的16位RISC指令集的高级产品,由于芯片内含有A/D、内部E2PROM存储器、I2C和SPI接口、CAN接口、同步/异步串行通信(USART)接口等强大的功能,具有很好的应用前景。但是,目前介绍其应用和以C语言编程的中文参考资料很少。本文将探讨该型单片机异步串行通信的编程应用,程序用HI-TECH PICC-18 C语言编写,并在重庆大学-美国微芯公司PIC单片机实验室的PIC18F458实验板上通过。 1 PIC18FXX8单片机同步/异步收发器(USART) 通用同步/异步收发器(USART)模块是由PIC18FXX8内的三个串行I/O模块组成的器件之
[单片机]
<font color='red'>PIC单片机</font>通用同步异步收发器的编程应用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved