Escolar Documentos
Profissional Documentos
Cultura Documentos
; Programa: pingpong.asm
; Programador: Josenir Silvrio
; E-mail: josenir@uze.com.br
;*******************************************************************
; Jogo de Ping-Pong
; usando oscilador interno 4Mhz
LIST
P=12F629 ;f=inhx8m
#include "P12F629.inc"
__CONFIG 0184 ; 11 0000 100 (oscilador interno, sem WDT, Power Up Timer)
#DEFINE BOTAO
#DEFINE SIRENE
GPIO,3
GPIO,5
; INICIO DO PROGRAMA
INIT
BCF STATUS,IRP
MOVLW TRISIO
;ALTERA PARA O BANCO 1
MOVWF FSR
MOVLW B'00001000' ;DEFINE ENTRADAS E SAIDAS DO GPIO
MOVWF INDF
;GRAVA TRISIO
MOVLW IOC
;DEFINE OS PINOS DO GPIO QUE TERO INTERRU
PO HABILITADA
MOVWF FSR
MOVLW B'00001000' ;APENAS GP3 TEM INTERRUPO HABILITADA
MOVWF INDF
;GRAVA IOC
MOVLW WPU
PO HABILITADA
MOVWF FSR
CLRF
INDF
MOVLW
OPTION_REG
ADA
MOVWF FSR
CLRF
INDF
;LIMPA OPTION_REG
INICIO:
BTFSC JOGADA,2
DECF BASE_TEMPO,F
BTFSC JOGADA,2
CLRF JOGADA
INCF JOGADA,F
MOVFW BASE_TEMPO
MOVWF TEMPO
;BASE DE TEMPO
ERA)
;MOVE
MOVLW
MOVWF
MOVLW
MOVWF
MOVLW B'00000010'
MOVWF GPIO
CALL WAIT
;LED1
MOVLW B'00000001'
MOVWF GPIO
CALL WAIT
;LED2
MOVLW
MOVWF
MOVLW
MOVWF
TRISIO
FSR
B'00111010'
INDF
MOVLW B'00000100'
MOVWF GPIO
CALL WAIT
;LED3
BTFSS BOTAO
CALL ERROU_JOGADA
MOVLW B'00000001'
MOVWF GPIO
CALL WAIT
;LED4
BTFSS BOTAO
CALL ERROU_JOGADA
MOVLW
MOVWF
MOVLW
MOVWF
TRISIO
FSR
B'00101110'
INDF
MOVLW B'00010000'
MOVWF GPIO
CALL WAIT
;LED5
BTFSS BOTAO
CALL ERROU_JOGADA
MOVLW B'00000001'
MOVWF GPIO
CALL WAIT
;LED6
BTFSS BOTAO
CALL ERROU_JOGADA
MOVLW
MOVWF
MOVLW
MOVWF
TRISIO
FSR
B'00101011'
INDF
MOVLW B'00000100'
MOVWF GPIO
CALL WAIT
;LED7
BTFSS BOTAO
CALL ERROU_JOGADA
MOVLW B'00010000'
MOVWF GPIO
CALL WAIT
;LED8
BTFSS BOTAO
CALL ERROU_JOGADA
MOVLW
MOVWF
MOVLW
MOVWF
TRISIO
FSR
B'00101101'
INDF
MOVLW B'00000010'
MOVWF GPIO
CALL WAIT
;LED9
BTFSS BOTAO
CALL ERROU_JOGADA
MOVLW B'00010000'
MOVWF GPIO
CALL WAIT
;LED10
BTFSS BOTAO
CALL ERROU_JOGADA
MOVLW
MOVWF
MOVLW
MOVWF
TRISIO
FSR
B'00111001'
INDF
MOVLW B'00000100'
MOVWF GPIO
CALL WAIT
;LED11
MOVLW B'00000010'
MOVWF GPIO
;LED12
CALL VER_BOTAO
;VOLTA PARA A ESQUERDA
MOVLW TRISIO
MOVWF FSR
MOVLW B'00111001'
MOVWF INDF
MOVLW B'00000010'
MOVWF GPIO
CALL WAIT
;LED12
MOVLW B'00000100'
MOVWF GPIO
CALL WAIT
;LED11
MOVLW
MOVWF
MOVLW
MOVWF
TRISIO
FSR
B'00101101'
INDF
MOVLW B'00010000'
MOVWF GPIO
CALL WAIT
;LED10
BTFSS BOTAO
CALL ERROU_JOGADA
MOVLW B'00000010'
MOVWF GPIO
CALL WAIT
;LED9
BTFSS BOTAO
CALL ERROU_JOGADA
MOVLW
MOVWF
MOVLW
MOVWF
TRISIO
FSR
B'00101011'
INDF
MOVLW B'00010000'
MOVWF GPIO
CALL WAIT
;LED8
BTFSS BOTAO
CALL ERROU_JOGADA
MOVLW B'00000100'
MOVWF GPIO
CALL WAIT
;LED7
BTFSS BOTAO
CALL ERROU_JOGADA
MOVLW
MOVWF
MOVLW
MOVWF
TRISIO
FSR
B'00101110'
INDF
MOVLW B'00000001'
MOVWF GPIO
CALL WAIT
;LED6
BTFSS BOTAO
CALL ERROU_JOGADA
MOVLW B'00010000'
MOVWF GPIO
CALL WAIT
;LED5
BTFSS BOTAO
CALL ERROU_JOGADA
MOVLW
MOVWF
MOVLW
MOVWF
TRISIO
FSR
B'00111010'
INDF
MOVLW B'00000001'
MOVWF GPIO
CALL WAIT
;LED4
BTFSS BOTAO
CALL ERROU_JOGADA
MOVLW B'00000100'
MOVWF GPIO
CALL WAIT
;LED3
BTFSS BOTAO
CALL ERROU_JOGADA
MOVLW
MOVWF
MOVLW
MOVWF
TRISIO
FSR
B'00111100'
INDF
MOVLW B'00000001'
MOVWF GPIO
CALL WAIT
;LED2
MOVLW B'00000010'
MOVWF GPIO
;LED1
CALL VER_BOTAO
NOP
NOP
NOP
GOTO INICIO
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
VER_BOTAO:
MOVLW .50
MOVWF QUANT
VE_BOT
MOVLW .30
MOVWF TEMPO
CALL WAIT
BTFSS BOTAO
GOTO CONTINUA
DECFSZ QUANT,F
GOTO VE_BOT
NOP
ERROU_JOGADA
CALL FIM_JOGO
MOVLW .3
MOVWF QUANT
ENTRA_SLEEP
BCF INTCON,GPIF
;LIMPA FLAG DE INTERRUPO POR MUDANCA DE ESTADO GPI
O
BTFSS BOTAO
GOTO ENTRA_SLEEP
CLRF GPIO
MOVLW TRISIO
MOVWF FSR
MOVLW B'11111111'
MOVWF INDF
SLEEP
NOP
NOP
CLRF JOGADA
MOVLW .100
;CARREGA PADRO EM BASE DE TEMPO
MOVWF BASE_TEMPO
DECFSZ QUANT,F
GOTO ENTRA_SLEEP;LOOP DO MODO SLEEP
AGUARDA
BTFSS BOTAO
;AGUARDA O BOTO SER LIBERADO PARA INICIAR
O JOGO NOVAMENTE
GOTO AGUARDA
NOP
CONTINUA
NOP
CALL APITTO
;EMITE BEEP DE JOGADA CORRETA
MOVFW BASE_TEMPO
;ACERTA BASE DE TEMPO
MOVWF TEMPO
NOP
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
FIM_JOGO:
MOVLW TRISIO
MOVWF FSR
MOVLW B'00001111'
MOVWF INDF
MOVLW
MOVWF
MOVLW
MOVWF
.20
TEMPO
.100
TMP
FIM1
MOVLW .16
MOVWF GPIO
CALL WAIT
MOVLW .32
MOVWF GPIO
CALL WAIT
DECFSZ TMP,F
GOTO FIM1
MOVLW .100
MOVWF TEMPO
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
APITTO:
MOVLW TRISIO
MOVWF FSR
MOVLW B'00001111'
MOVWF INDF
MOVLW .180
MOVWF TOM
BCF GPIO,4
;LIGA NIVEL 0 EM GP4
TI
DECF TOM,F
BSF SIRENE
;LIGA NIVEL 1 EM GP5
MOVFW TOM
MOVWF NUM2
T1
NOP
;AGUARDA A QUANT. uS DE TOM
DECFSZ NUM2,F
;DECREMENTA NUM2, PULA SE ZERO
GOTO
T1
;VAI PARA T1, PULA SE ZERO
MOVLW .70
;AGUARDA 70 uS
MOVWF NUM2
T2
NOP
DECFSZ NUM2,F
;DECREMENTA NUM2, PULA SE ZERO
GOTO
T2
;VAI PARA T2
BCF SIRENE
;LIGA NIVEL 0 EM GP4
MOVLW .70
;AGUARDA 70 uS
MOVWF NUM2
T3
NOP
DECFSZ NUM2,F
;DECREMENTA NUM2, PULA SE ZERO
GOTO
T3
;VAI PARA T3, PULA SE ZERO
MOVLW .0
XORWF TOM,W
;COMPARA TOM COM ZERO
BTFSC STATUS,Z
;SE TOM = 0, ENCERRA A ROTINA
RETURN
GOTO TI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SUB-ROTINA WAIT - PARA AGUARDAR TEMPO...
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WAIT:
;SE TEMPO = .250 O TEMPO SER DE 1 Segundo
a 4Mhz
movfw TEMPO
;PASSA O VALOR DE TEMPO PARA W
movwf NUM1
;PASSA O VALOR DE W PARA NUM1
D1
movfw TEMPO
;PASSA O VALOR DE TEMPO PARA W
movwf NUM2
;PASSA O VALOR DE W PARA NUM2
D2
NOP
decfsz NUM2,F
;DECREMENTA NUM2, PULA SE ZERO (REPETE NUM2 VEZE
S)
goto
D2
;VAI PARA D2, DECREMENTA NOVAMENTE NUM2
movfw TEMPO
movwf NUM2
;PASSA O VALOR DE W PARA NUM2
D3
NOP
decfsz NUM2,F
;DECREMENTA NUM1, PULA SE ZERO
goto
D3
;VAI PARA D3
decfsz NUM1,F
;DECREMENTA NUM1, PULA SE ZERO
goto
D1
;VAI PARA D1
retlw 00
END