|
Tài trợ cho PIC Vietnam |
RTOS và Thuật toán với PIC RTOS và Các thuật toán dùng cho PIC/dsPIC/PIC32 Mod: phamminhtuan |
|
Ðiều Chỉnh | Xếp Bài |
30-07-2007, 10:46 AM | #1 |
Đệ tử 1 túi
Tham gia ngày: Nov 2006
Bài gửi: 25
: |
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 |
|
|