PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   RTOS và Thuật toán với PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=33)
-   -   Các module MPASM cần giúp đở (http://www.picvietnam.com/forum/showthread.php?t=1347)

phamthanhkhuyen 30-07-2007 10:46 AM

Các module MPASM cần giúp đở
 
nhờ các bạn xem module sau : xem nó sai ở chổ nào cho ý kiến để nó trở thành module đúng :
đây là chương trình trừ 2 con số BCD nén 16 bit với nhau :
Code:

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;MODULE                        :                                                BCD16_SUB

;CHU THICH                :                                TRU 2 SO BCDnen16bit
;NGUOI THUC HIEN:                                PHAM THANH KHUYEN

;KHAI BAO BIEN        :        NUM_H1  NUM_L1  NUM_H2    NUM_L2

;con so tru                :        (NUM_H1 NUM_L1) co tri so tu 00 00 : 99 99
;con so bi tru        :        (NUM_H2 NUM_L2) co tri so tu 00 00 : 99 99
;HOAT DONG                :        REULT_L        = (NUM_L2 - NUM_L1)
                                ;        RESULT_H        = (NUM_H2 - NUM_H1)       
                               
;KET QUA                :        RESULT_L        luu vao        NUM_L2
                                ;        RESULT_H        luu vao        NUM_H2
;co nho C                :        duoc ngam qui dinh = NUM_H1
;co nho phu DC        :        duoc ngam qui dinh = NUM_L1

                ;RESULT_H        >=0        AND                RESULT_L > 0                        ;        NUM_H1 = 1        ;  NUM_L1 = 1
                ;RESULT_H        >0        AND                RESULT_L < 0                        ;        NUM_H1 = 1        ;  NUM_L1 = 0

;PHEP TOAN KHONG THUC HIEN TRONG CAC TRUONG HOP SAU:
                ;NUM_H2        =0        AND                RESULT_L < 0                        ; KET QUA        :        NUM_H2 = NUM_L2 = 0XFF
                                                                                                                ;        NUM_H1 = 0        ;  NUM_L1 = 0

                ;RESULT_H        <0        AND                RESULT_L < 0                        ; KET QUA        :        NUM_H2 = NUM_L2 = 0XFF
                                                                                                                ;        NUM_H1 = 0        ;  NUM_L1 = 0

                ;RESULT_H        <0        AND                RESULT_L > 0                        ; KET QUA        :        NUM_H2 = NUM_L2 = 0XFF
                                                                                                                ;        NUM_H1 = 0        ;  NUM_L1 = 1
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
BCD16_SUB

                                        ;XET RESULT_L= NUM_L2 - NUM_L1
                                        movf        NUM_L1, W
                                        subwf        NUM_L2, F
                                        movlw        B'00000010'
                                        movwf        NUM_L1
                                        andwf        STATUS, W
                                        movwf        NUM_L1                        ;LUU DC OF BYTE_L
                                       
                                        btfsc        STATUS, C
                                        goto        SUB_H0                        ;C(l)=1 NUM_L2 >= NUM_L1 ; RESULT_L >=0
;KHI RESUL_L <0
CHECK_NUM_H2                               
                                        movf        NUM_H2, W                ;NUM_H2=0 ?
                                        btfsc        STATUS, Z
                                        goto        NO_SUB                        ;Z=1 -->NUM_H2=0 RESULT<0
                                        decf        NUM_H2, F
                                        movf        NUM_H1, W
                                        subwf        NUM_H2, F
                                        btfsc        STATUS, C
                                        goto        SUB_H1                        ;C(h)=1        --> NUM_H2=NUM_H2 - 1 >= NUM_H1 & RESULT_L<0
NO_SUB
                                                                        ;NEU KET QUA LA CON SO AM THI NUM_L1=NUM_H1=2
                                        clrf        NUM_L1
                                        clrf        NUM_H1       
                                        movlw        0XFF
                                        movwf        NUM_H2
                                        movlw        NUM_L2
                                                       
EXIT_BCDSUB                        return

;RESULT_H0 = NUM_H2 - NUM_H1 (VOI: RESUL_L >= 0)                                       
SUB_H0
                                        movf        NUM_H1, W
                                        subwf        NUM_H2, F

                                        btfss        sTATUS, C
                                        goto        NO_SUB1                        ;C=0 NUM_H2 < NUM_H1
                                        btfsc        STATUS, DC                ;C=1 NUM_H2 >= NUM_H1 ; DC?
                                        goto        SUB_L0                        ;DC=1        RESULT_H = CON SO BCD
                                        movlw        0X06                        ;DC=0        RESULT_H KHONG PHAI LA BCD
                                        subwf        NUM_H2, F                ;DOI SANG CON SO BCD
;RESULT_L = NUM_L2 - NUM_L1 >0 (VOI: C=1 DC NAM TRONG NUM_L1)
SUB_L0
                                        ;XET CO DC
                                        btfsc        NUM_L1, 1
                                        goto        FINISH_1                ;DAT NUM_L1 = 1 ROI THOAT
                                        movlw        0X06
                                        subwf        NUM_L2, F
FINISH_1                        movlw        .1
                                        movwf        NUM_L1
                                        movwf        NUM_H1
                                        goto        EXIT_BCDSUB

;RESULT_H1= NUM_H2 - NUM_H1>0 (VOI: RESULT_L<0 ; C(h)=1)
SUB_H1                                       
                                        ;XET CO DC(h)
                                        btfsc        STATUS, DC
                                        goto        SUB_L1                        ;DC=1 RESULT_H1 LA CON SO BCD
                                        movlw        0X06
                                        subwf        NUM_H2, F                ;DC=0 DOI RESULT_H1 THANH CO SO BCD
;RESULT_L <0 ; C(l)=0 ; DC?
SUB_L1
                                        ;XET DC(l)
                                        btfsc        NUM_L1, 1
                                        goto        FINISH_2                ;DC(l)=1  DAT NUM_L1 = 1 ROI THOAT                                                                               
                                        movlw        0X66                        ;DC(L)=0        DOI RESUL_L SANG BCD
                                        subwf        NUM_L2, F
FINISH_2                        clrf        NUM_L1
                                        movlw        .1
                                        movwf        NUM_H1


NO_SUB1                                movlw        .1
                                        movwf        NUM_L1
                                        clrf        NUM_H1
                                        movlw        0XFF
                                        movwf        NUM_H2
                                        movwf        NUM_L2



Múi giờ GMT. Hiện tại là 06:13 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam