por alex_david_lima » 04 Nov 2006 09:55
ola, zielpunkt
ai vai estou programando em assembly, em C tem uma função que se chama FOR esta função executa um trecho do programa uma quantidade de vezes ate passar para proxima, função
#INCLUDE <P12F675.INC>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _CPD_OFF
; __CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF &_PWRTE_ON & _INTRC_OSC_NOCLKOUT
errorlevel -302 ; suppress banksel warning messages
; DEFINIÇÃO DE VARIÁVEIS
ORG 0X00
GOTO INICIO
ORG 0X04
GOTO INICIO
CBLOCK 0x20
CONT_AUX1
CONT_AUX2
DELAY1
DELAY2
DELAY3
counter
TEMPO0
TEMPO1
TEMPO2
ENDC
#define setbank0 bcf STATUS,RP0 ; Sel Bank 0
#define setbank1 bsf STATUS,RP0 ; Sel Bank 1
INICIO
setbank1
movlw B'100000'
movwf GPIO
MOVLW B'0000111'
MOVWF OPTION_REG
setbank0
MOVLW .255
MOVWF counter
MAIN
;INICIO DO FOR
goto half_step_drive
;OBJETIVO EXECUTAR A O goto half_step_drive POR UMA DETERMINADO QUANTIDADE DE VEZES
;FIM DO FOR
GOTO MAIN
VERIFICA
BTFSC GPIO,5
GOTO MAIN
CALL INVERTE2
GOTO MAIN
sub_tom:
MOVLW 0X00
MOVWF GPIO
MOVLW .50
CALL DELAY_MS
MOVLW B'010000'
MOVWF GPIO
MOVLW .50
CALL DELAY_MS
GOTO MAIN
half_step_drive:
MOVLW B'010100'
MOVWF GPIO
MOVLW .2
CALL DELAY_MS
MOVLW B'000100'
MOVWF GPIO
MOVLW .2
CALL DELAY_MS
MOVLW B'000110'
MOVWF GPIO
MOVLW .2
CALL DELAY_MS
MOVLW B'000010'
MOVWF GPIO
MOVLW .2
CALL DELAY_MS
MOVLW B'000011'
MOVWF GPIO
MOVLW .2
CALL DELAY_MS
MOVLW B'000001'
MOVWF GPIO
MOVLW .2
CALL DELAY_MS
MOVLW B'010001'
MOVWF GPIO
MOVLW .2
CALL DELAY_MS
MOVLW B'010000'
MOVWF GPIO
MOVLW .2
CALL DELAY_MS
GOTO half_step_drive
INVERTE:
MOVLW B'000001'
MOVWF GPIO
CALL delay
MOVLW B'000010'
MOVWF GPIO
CALL delay
MOVLW B'000100'
MOVWF GPIO
CALL delay
MOVLW B'010000'
MOVWF GPIO
CALL delay
GOTO MAIN
INVERTE2:
MOVLW B'000100'
MOVWF GPIO
CALL delay
MOVLW B'000010'
MOVWF GPIO
CALL delay
MOVLW B'000001'
MOVWF GPIO
CALL delay
MOVLW B'010000'
MOVWF GPIO
CALL delay
GOTO MAIN
delay:
movlw .50
movwf DELAY1
loop1:
movlw .100
movwf DELAY2
loop2:
movlw .100 ; 1s
movwf DELAY3
loop3:
decfsz DELAY3,1
goto loop3
decfsz DELAY2,1
goto loop2
decfsz TMR0,1
goto loop1
return
DELAY_MS
MOVWF TEMPO1 ; CARREGA TEMPO1 (UNIDADES DE MS)
MOVLW .250
MOVWF TEMPO0 ; CARREGA TEMPO0 (P/ CONTAR 1MS)
CLRWDT ; LIMPA WDT (PERDE TEMPO)
DECFSZ TEMPO0,F ; FIM DE TEMPO0 ?
GOTO $-2 ; NÃO - VOLTA 2 INSTRUÇÕES
; SIM - PASSOU-SE 1MS
DECFSZ TEMPO1,F ; FIM DE TEMPO1 ?
GOTO $-6 ; NÃO - VOLTA 6 INSTRUÇÕES
; SIM
RETURN ; RETORNA
END