實戰攻堅!
本節,給大家講解針對EASY-M0806R這款PLC的SCAN用戶驅動子程序該完成的功能。
通過前面的講解,大家應該知道,SCAN是在梯形圖完成一次掃描以后被系統調用的程序,在這個程序里面,我們需要更新輸入輸出口的狀態以及LED的狀態。
SCAN
SCAN:            LCALL    USER_SCAN_O            ;輸出端口和LED更新
                LCALL    USER_SCAN_I            ;輸入端口和LED更新
                RET
USER_SCAN_O:  
;刷新輸出端口
MOV    DPTR,#RAM_PY+1        ;Y00--Y05
                MOVX    A,@DPTR
                CPL        A
                MOV    SFRPAGE,#0FH
                ANL    A,#3FH                    
                MOV    B,A
                MOV    A,P1
                ANL    A,#0C0H                    
                ORL    A,B                        ;使P1.6,P1.7保持原來的狀態
                MOV    P1,A                    ;刷新輸出
;刷新輸出LED
                 SWAP    A
                MOV    C,ACC.4            
                MOV    P0.4,C
                MOV    C,ACC.5
                MOV    P0.5,C
                MOV    C,ACC.6
                MOV    P0.6,C
                MOV    C,ACC.7
                MOV    P0.7,C
                MOV    C,ACC.0
                MOV    P4.1,C
                MOV    C,ACC.1
                MOV    P4.0,C
                RET
                        
USER_SCAN_I:  MOV    A,INPUT_CNT
                JZ        USER_SCAN_I1
                RET
                                                                
USER_SCAN_I1:    LCALL    USER_SCAN_IS    ;判斷8次采樣值是否相同    
                JB        F0,USER_SCAN_I2
                MOV    C,ACC.7            ;調整輸入口
                MOV    F0,C
                MOV    C,ACC.0
                MOV    ACC.7,C
                MOV    C,F0
                MOV    ACC.0,C
                MOV    C,ACC.6
                MOV    F0,C
                MOV    C,ACC.1
                MOV    ACC.6,C
                MOV    C,F0
                MOV    ACC.1,C
                MOV    C,ACC.5
                MOV    F0,C
                MOV    C,ACC.2
                MOV    ACC.5,C
                MOV    C,F0
                MOV    ACC.2,C
                MOV    C,ACC.4
                MOV    F0,C
                MOV    C,ACC.3
                MOV    ACC.4,C
                MOV    C,F0
                MOV    ACC.3,C
                MOV    INPUT_PORTA,A        ;相同則更新輸入數據寄存器
                MOV    DPTR,#RAM_PX+1    ;X00--X07
                MOV    A,INPUT_PORTA
                MOVX    @DPTR,A            ;更新X00--X07
;刷新輸入LED
MOV    A, INPUT_PORTA
CPL        A
                MOV    P2,A
USER_SCAN_I2:    MOV    INPUT_CNT,#08H
                RET
;判斷8個采樣數據是否相同,相同則F0=0
USER_SCAN_IS:    MOV    DPTR,#XINPUT
                MOVX    A,@DPTR
                MOV    M0,A
                MOV    R7,#7
USER_SCAN_IS1:    INC        DPTR
                MOVX    A,@DPTR
                CJNE    A,M0,USER_SCAN_IS2
                DJNZ    R7,USER_SCAN_IS1
                CLR        F0
                RET
USER_SCAN_IS2:    SETB    F0
                RET    
關于本段代碼的詳細說明,筆者將改變一下方式,在下面的回帖為大家講解。當然筆者在關鍵處已經做了注釋,大家可以先看看并結合之前的程序研究一下,發帖提出問題,看看筆者的回答與自己的理解有何偏差。
如果沒有人發帖,筆者自然是希望看文章的朋友們都理解了筆者的代碼,就小小的懶惰一回吧,嘿嘿~!
當然如果大家的問題很多,那么筆者就寫“科威PLC芯片組開發實例(十二)”,詳細給大家說明SCAN中代碼的含義。
本帖首發中國工控網科威PLC論壇,轉載請聲明!