Você está na página 1de 7

;*******************************************************************

; 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

;BOTO DE JOGAR EM GP3


;TRANSDUTOR CERAMICO PIEZO EM GP5

;VARIVEIS DE USURIO A PARTIR DA POSIO 32


QUANT EQU .32
TEMPO EQU .33
NUM1
EQU .34
NUM2
EQU .35
TOM
EQU .36
TMP
EQU .37
BASE_TEMPO
EQU .38
JOGADA EQU .39
ORG

; 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

;DEFINE OS PINOS DO GPIO QUE TERO INTERRU


;LIMPA WPU (NENHUM RESISTOR PULL-UP HABILITADO)
;DEFINE OS PINOS DO GPIO QUE TERO INTERRUPO HABILIT

ADA
MOVWF FSR
CLRF
INDF

;LIMPA OPTION_REG

MOVLW B'00000111' ;DESLIGA COMPARADORES DE TENSAO


MOVWF CMCON
;REGISTRADOR CMCON
CLRF GPIO
CLRF QUANT
CLRF INTCON
BSF INTCON,GPIE
;HABILITA INTERRUPES
MOVLW .100
MOVWF BASE_TEMPO
CLRF JOGADA

INICIO:
BTFSC JOGADA,2
DECF BASE_TEMPO,F

;SE J FORAM 4 JOGADAS


;AUMENTA VELOCIDADE(DIMINUI TEMPO DE ESP

BTFSC JOGADA,2
CLRF JOGADA
INCF JOGADA,F

;SE J FORAM 4 JOGADAS


;ZERA CONTADOR DE JOGADA

MOVFW BASE_TEMPO
MOVWF TEMPO

;BASE DE TEMPO

ERA)

;MOVE
MOVLW
MOVWF
MOVLW
MOVWF

A BOLA DA DIREITA PARA A ESQUERDA


TRISIO
FSR
B'00111100'
INDF

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

Você também pode gostar