$MOD51 RESET EQU 0000H STACK EQU 50H COUNT_PLUSE EQU 200D ;設定送出200個pluse後結束 COUNT EQU 25D ;存放count_pluse SEL EQU P2.7 ;encoder判斷讀取高btye或低btye OE EQU P2.6 ;encdoer讀取接腳 OLD EQU 26D ;encoder舊值暫存器 ORG RESET MOV P0,#00H CLR OLD MOV SP,#STACK SETB SEL SETB OE LOOP1: MOV OLD,DPL CLR SEL ;讀取高btye CLR OE ;開始讀取 MOV DPH,P0 ;高btye放入dph SETB SEL ;讀取低btye MOV DPL,P0 ;低btye放入dpl SETB OE ;停止讀取 MOV A,DPL ;[[ SUBB A,OLD ; 與舊值相減判斷是否有讀取新值 CJNE A,#00H,START ;]] JMP LOOP1 START: MOV R3,#200D ;設定馬達輸出pulse MOV A,#01110111B LOOP: RL A ;不斷移動位元 MOV P1,A ;信號由p1輸出 CALL DELAY DJNZ R3,LOOP ;將200個pluse減到0 jmp LOOP1 DELAY: MOV R0,#10D DEL: MOV R1,#2D DE: MOV R2,#112D DJNZ R2,$ DJNZ R1,DE DJNZ R0,DEL RET END