PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   MPASM (http://www.picvietnam.com/forum/forumdisplay.php?f=34)
-   -   TẠI SAO doạn chương trình này không thể viết gọn lại (http://www.picvietnam.com/forum/showthread.php?t=1344)

phamthanhkhuyen 29-07-2007 01:35 AM

TẠI SAO doạn chương trình này không thể viết gọn lại
 
Đây là đoạn chương trình con nằm trong chương trình ngắt Timer0 ;pic6f877a




Code:

;phần khai báo biến
                      CBLOCK 0X20
;DIGIx : là các con số BCD nén
DIGI1    ;4 BIT CAO =NHIETmax_DONVI    4 BIT THẤP=NHIETdoduoc_DONVI
DIGI2    ;4 BIT CAO =NHIETmax_CHUC      4 BIT THẤP=NHIETdoduoc_CHUC
DIGI3    ;4 BIT CAO =NHIETmax_TRAM      4 BIT THẤP=NHIETdoduoc_TRAM
.......
                      ENDC

........



;chương trình so sánh khi Nhiệt đo được < Nhiệt max --->on_relay
;khi : Nhiệt đo được >= Nhiệt max --->off_relay


;XAC DINH VI TRI LED TRAM
                                        MOVLW        0X22               
                                        MOVWF        FSR


SO_SANH

                        ;XAC DINH POINT_OFF TRAM:                                        ;NHIETmax DUOC THIET LAP DO THAO TAC BAN PHIM
                                        MOVLW        B'11110000'                                ;NHIETmax        : NAM TRONG 4 BIT CAO
                                        ANDWF        INDF, W                                        ;NHIETdoduoc: NAM TRONG 4 BIT THAP
                                        MOVWF        POINT_ONOFF                                ;POINT_ONOFF = NHIETmax       
                                        SWAPF        POINT_ONOFF, F
                        ;LUU Y :NEU POINT_ONOFF=15 THI XOA
                                      ;POINT_ONOFF=<9:0> chỉ =15 khi tắt sự hiển thị
POINT_ONOFF=0
                                        MOVLW        0X0F
                                        XORWF        POINT_ONOFF, W
                                        BTFSC        STATUS, Z
                                        CLRF        POINT_ONOFF       
               
                                        MOVLW        B'00001111'                               
                                        ANDWF        INDF, W                                        ;NHIETdoduoc = 4 BIT THAP
                                        SUBWF        POINT_ONOFF, W                        ;POINT_ONOFF - NHIETdoduoc
                                        BTFSS        STATUS, C
                                        GOTO        OFF_RELAY                                ;C=0  POINT_ONOFF < NHIETdoduoc
                        ;C=1 POINT_ONOFF >= NHIETdoduoc
                                       
                                        BTFSS        STATUS, Z                                ;NEU : NHIETdoduoc = POINT_ONOFF THI Z=1
                                        GOTO        ON_RELAY                                ;POINT_ONOFF > NHIETdoduoc
                                        ;THOAT RA TIEP TUC XET LED CAP DUOI


                                        DECF        FSR, F
                        ;XAC DINH POINT_OFF CHUC :                                ;NHIETmax DUOC THIET LAP DO THAO TAC BAN PHIM
                                        MOVLW        B'11110000'                                ;NHIETmax        : NAM TRONG 4 BIT CAO
                                        ANDWF        INDF, W                                        ;NHIETdoduoc: NAM TRONG 4 BIT THAP
                                        MOVWF        POINT_ONOFF                                ;POINT_ONOFF = NHIETmax       
                                        SWAPF        POINT_ONOFF, F
                        ;LUU Y :NEU POINT_ONOFF=15 THI XOA--> POINT_ONOFF=0
                                        MOVLW        0X0F
                                        XORWF        POINT_ONOFF, W
                                        BTFSC        STATUS, Z
                                        CLRF        POINT_ONOFF       
               
                                        MOVLW        B'00001111'                               
                                        ANDWF        INDF, W                                        ;NHIETdoduoc = 4 BIT THAP
                                        SUBWF        POINT_ONOFF, W                        ;POINT_ONOFF - NHIETdoduoc
                                        BTFSS        STATUS, C
                                        GOTO        OFF_RELAY                                ;C=0  POINT_ONOFF < NHIETdoduoc
                        ;C=1 POINT_ONOFF >= NHIETdoduoc
                                       
                                        BTFSS        STATUS, Z                                ;NEU : NHIETdoduoc = POINT_ONOFF THI Z=1
                                        GOTO        ON_RELAY                                ;POINT_ONOFF > NHIETdoduoc
                                        ;THOAT RA TIEP TUC XET LED CAP DUOI


                                        DECF        FSR, F
                        ;XAC DINH POINT_OFF DONVI :                                        ;NHIETmax DUOC THIET LAP DO THAO TAC BAN PHIM
                                        MOVLW        B'11110000'                                ;NHIETmax        : NAM TRONG 4 BIT CAO
                                        ANDWF        INDF, W                                        ;NHIETdoduoc: NAM TRONG 4 BIT THAP
                                        MOVWF        POINT_ONOFF                                ;POINT_ONOFF = NHIETmax       
                                        SWAPF        POINT_ONOFF, F
                        ;LUU Y :NEU POINT_ONOFF=15 THI XOA POINT_ONOFF=0
                                        MOVLW        0X0F
                                        XORWF        POINT_ONOFF, W
                                        BTFSC        STATUS, Z
                                        CLRF        POINT_ONOFF       
               
                                        MOVLW        B'00001111'                               
                                        ANDWF        INDF, W                                        ;NHIETdoduoc = 4 BIT THAP
                                        SUBWF        POINT_ONOFF, W                        ;POINT_ONOFF - NHIETdoduoc
                                        BTFSS        STATUS, C
                                        GOTO        OFF_RELAY                                ;C=0  POINT_ONOFF < NHIETdoduoc
                        ;C=1 POINT_ONOFF >= NHIETdoduoc
                                       
                                        BTFSS        STATUS, Z                                ;NEU : NHIETdoduoc = POINT_ONOFF THI Z=1
                                        GOTO        ON_RELAY                                ;POINT_ONOFF > NHIETdoduoc
                                        ;THOAT RA TIEP TUC XET LED CAP DUOI



;---------------------------------------
ON_RELAY
                                                ....
                                                GOTO EXIT_RELAY
OFF_RELAY
                                                ....
  EXIT_RELAY                              RETURN


phamthanhkhuyen 29-07-2007 01:45 AM

tại sao nó không thể viết gọn lại :
 
tôi viết theo cách này thì chương trình nó không chịu chạy




Code:

                        ;XAC DINH VI TRI LED TRAM
                                        MOVLW        0X23               
                                        MOVWF        FSR
                                                                MOVLW  .3
                                                                MOVWF  TEMP

SO_SANH
                                                                DECF      FSR, F

                        ;XAC DINH POINT_OFF TRAM:                                        ;NHIETmax DUOC THIET LAP DO THAO TAC BAN PHIM
                                        MOVLW        B'11110000'                                ;NHIETmax        : NAM TRONG 4 BIT CAO
                                        ANDWF        INDF, W                                        ;NHIETdoduoc: NAM TRONG 4 BIT THAP
                                        MOVWF        POINT_ONOFF                                ;POINT_ONOFF = NHIETmax       
                                        SWAPF        POINT_ONOFF, F
                        ;LUU Y :NEU POINT_ONOFF=15 THI XOA POINT_ONOFF=0
                                        MOVLW        0X0F
                                        XORWF        POINT_ONOFF, W
                                        BTFSC        STATUS, Z
                                        CLRF        POINT_ONOFF       
               
                                        MOVLW        B'00001111'                               
                                        ANDWF        INDF, W                                        ;NHIETdoduoc = 4 BIT THAP
                                        SUBWF        POINT_ONOFF, W                        ;POINT_ONOFF - NHIETdoduoc
                                        BTFSS        STATUS, C
                                        GOTO        OFF_RELAY                                ;C=0  POINT_ONOFF < NHIETdoduoc
                        ;C=1 POINT_ONOFF >= NHIETdoduoc
                                       
                                        BTFSS        STATUS, Z                                ;NEU : NHIETdoduoc = POINT_ONOFF THI Z=1
                                        GOTO        ON_RELAY                                ;POINT_ONOFF > NHIETdoduoc
                                        ;THOAT RA TIEP TUC XET LED CAP DUOI

                                            DECFSZ    TEMP, F
                                            GOTO      SO_SANH

ON_RELAY
                                            ....
                                            GOTO EXIT_RELAY
OFF_RELAY
                                            ....
  EXIT_RELAY                          RETURN


namqn 29-07-2007 02:10 AM

Hai đoạn code đó về nguyên tắc thì phải chạy giống nhau, trừ khi bạn khai báo biến TEMP không tốt (mang địa chỉ một thanh ghi đặc biệt nào đó, hay trùng với một trong các biến khác) hay còn một lý do nào khác mà tôi chưa biết. Góp ý một chút: viết code toàn bằng chữ in thì sẽ gây khó khăn cho mắt khi đọc code.

Thân,


Múi giờ GMT. Hiện tại là 01:43 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