在main主程序里面
LOOP GOTO LOOP
这条程序,会不停的执行,到了TMR0溢出的时候就会执行中断程序
ORG 0004H为中断程序的地址
想知道哪种,给你粘贴,下面是一些计算子程序******************************************************************
一、十六位二进制转换为BCD数子程序
******************************************************************
MOVLW 10H
MOVWF CNT
BCF STATUS,C
CLRF R2
CLRF R1
CLRF R0
LOOP RLF AL
RLF AH
RLF R0
RLF R1
RLF R2
DECFSZ CNT
GOTO ADJDEC
RETURN
ADJDEC MOVLW R0
MOVWF FSR
CALL ADJBCD
MOVLW R1
MOVWF FSR
CALL ADJBCD
MOVLW R2
MOVWF FSR
CALL ADJBCD
GOTO LOOP
ADJBCD MOVLW 3H
ADDWF INDF,W
MOVWF TMP
BTFSC TMP,3
MOVWF INDF
MOVLW 30H
ADDWF INDF,W
MOVWF TMP
BTFSC TMP,7
MOVWF INDF
RETURN
***************************************************************************
乘法宏
两个八位无符号数乘法,乘积为十六位。部分积右移相加算法:乘数带进位右移一位,
检查进位是否为一,若是一,部分积寄存器加被乘数,否则不加;然后部分积寄存器
带进位右移一位;重复上述过程直至循环次数为八结束。
***************************************************************************
宏的引用格式:MUL A,B
完成 *** 作: (A)*(B)---(A,B)
影响状态位:C、Z和DC
8*8位乘法宏MUL,结果的高字节部分存入(A),低字节存入(B)
***************************************************************************
MUL MACRO A,B
LOCAL MLOOP
****************************************************************************
如只用乘法子程序,就下段。
****************************************************************************
CLRF TMPA
CLRF TMPB
MOVLW 8
MOVWF CNT
MOVF A,W
BCF STATUS,C
MLOOP RRF B
BTFSC STATUS,C
ADDWF TMPA
RRF TMPA
RRF TMPB
DECFSZ CNT
GOTO MLOOP
MOVF TMPA,W
MOVWF A
MOVF TMPB,W
MOVWF B
*****************************************************************************
ENDM
*****************************************************************************
除法宏DIV
除法是乘法的逆运算。与十进制长除法类似,从被除数的最高有效位开始,把被除数左移
一位至余数上,如果余数不够减去除数,则商寄存器左移,移入位为零,反之移入位为一
余数减去被除数,把被除数的下一位移至除数上。重复上述过程直至处理完所有位。
******************************************************************************
宏的引用格式:DIV A,B
完成 *** 作: (A)为商部分,(B)为余数部分
影响状态位:C、Z和DC
8/8位除法宏DIV,结果(A)为商部分,(B)为余数部分
***************************************************************************
DIV MACRO A,B
LOCAL MLOOP
****************************************************************************
如只用除法子程序,就下段。
****************************************************************************
MOVF A,W
MOVWF TMPA
MOVF B,W
MOVWF TMPB
MOVLW 8
MVOWF CNT
CLRF A
CLRF B
DLOOP BCF STATUS,C
RLF TMPA
RLF B
MOVF TMPB,W
SUBWF B,W
BTFSC STATUS,C
MOVWF B
RLF A
DECFSZ CNT
GOTO DLOOP
****************************************************************************
ENDM
****************************************************************************
间接寻址
CLRF R0 清除R0寄存器里的内容
MOVLW R0
MOVWF FSR 将R0寄存器的地址送入间接寻址指针FSR
MOVF INDF,0
MOWF TEMP 将间接寻址指针FSR所指地址R0寄存器里的内容送入TEMP
MOVLW 88H
MOVWF INDF 将88H送入间接寻址指针FSR所指地址R0寄存器里
*******************************************************************************
将两位BCD数送入显示
显示十位BCD数
DISPLAY SWAPF TEMP,W 将TEMP寄存器里的内容的高低字节交换并送入W
ANDLW 0FH 将0FH与W寄存器里的内容相与并送入W
CALL CODE_TAB 查表取段码
MOVWF PORTD 送入PORTD端口
MOVLW 1H
MOVWF PORTC 选通PORTC,1
CALL DELAY 调用延时
显示个位BCD数
MOVF TEMP,W
ANDLW 0FH
CALL CODE_TAB
MOVWF PORTD
MOVLW 2H
MOVWF PORTC
CALL DELAY
*********************************************************************************************
16位二进制除以8位二进制
;*******************************************************************************************
DIV16
MOVF A,0
MOVWF DIV_H
MOVF BX,0
MOVWF DIV_L 被除数高低字节分别送进各寄存器
MOVLW 9H
MOVWF DIVB ;将除数送进寄存器
MOVLW 10H
MOVWF CNT ;按被除数位数设定移位次数
CLRF AL
CLRF AH
CLRF BX
DLOOP
BCF STATUS,C
RLF DIV_L
RLF DIV_H
RLF BX
MOVF DIVB,W
SUBWF BX,W
BTFSC STATUS,C
MOVWF BX
RLF AL
RLF AH
DECFSZ CNT
GOTO DLOOP
RETURN
****************************************************************************************************
8位乘以16位二进制乘法运算程序
****************************************************************************************************
MUL8
CLRF TMPA 清除积的高位寄存器
CLRF TMPB 清除积的中位寄存器
CLRF TMPC 清除积的低位寄存器
MOVLW 10H 因为8位二进制乘以16位二进制,乘数为16位,移位乘数,所以移位次数为16次
MOVWF CNT
MOVF BX,W 将8位被乘数送进W
BCF STATUS,C
MLOOP RRF TEMP_H
RRF TEMP_L 带C循环右移16位乘数
BTFSC STATUS,C
ADDWF TMPA
RRF TMPA
RRF TMPB
RRF TMPC
DECFSZ CNT
GOTO MLOOP
MOVF TMPA,W
MOVWF AA
MOVF TMPB,W
MOVWF A
MOVF TMPC,W 将乘积送进各寄存器。
MOVWF BX
RETURN
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)