Upload
marcos-maciel-godinho
View
2
Download
0
Embed Size (px)
DESCRIPTION
assembly
Citation preview
;*******************************************************************; Programa: pingpong.asm; Programador: Josenir Silvério; E-mail: [email protected];*******************************************************************; 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 GPIO,3 ;BOTÃO DE JOGAR EM GP3#DEFINE SIRENE GPIO,5 ;TRANSDUTOR CERAMICO PIEZO EM GP5
;VARIÁVEIS DE USUÁRIO A PARTIR DA POSIÇÃO 32QUANT EQU .32TEMPO EQU .33NUM1 EQU .34NUM2 EQU .35TOM EQU .36TMP EQU .37BASE_TEMPO EQU .38JOGADA EQU .39
ORG 0 ; INICIO DO PROGRAMA
INITBCF STATUS,IRPMOVLW TRISIO ;ALTERA PARA O BANCO 1MOVWF FSRMOVLW B'00001000' ;DEFINE ENTRADAS E SAIDAS DO GPIOMOVWF INDF ;GRAVA TRISIO
MOVLW IOC ;DEFINE OS PINOS DO GPIO QUE TERÃO INTERRUPÇÃO HABILITADA
MOVWF FSRMOVLW B'00001000' ;APENAS GP3 TEM INTERRUPÇÃO HABILITADAMOVWF INDF ;GRAVA IOC
MOVLW WPU ;DEFINE OS PINOS DO GPIO QUE TERÃO INTERRUPÇÃO HABILITADA
MOVWF FSRCLRF INDF ;LIMPA WPU (NENHUM RESISTOR PULL-UP HABILITADO)
MOVLW OPTION_REG ;DEFINE OS PINOS DO GPIO QUE TERÃO INTERRUPÇÃO HABILITADA
MOVWF FSRCLRF INDF ;LIMPA OPTION_REG
MOVLW B'00000111' ;DESLIGA COMPARADORES DE TENSAOMOVWF CMCON ;REGISTRADOR CMCONCLRF GPIOCLRF QUANTCLRF INTCONBSF INTCON,GPIE ;HABILITA INTERRUPÇÕESMOVLW .100MOVWF BASE_TEMPOCLRF JOGADA
INICIO:BTFSC JOGADA,2 ;SE JÁ FORAM 4 JOGADAS
DECF BASE_TEMPO,F ;AUMENTA VELOCIDADE(DIMINUI TEMPO DE ESPERA)
BTFSC JOGADA,2 ;SE JÁ FORAM 4 JOGADASCLRF JOGADA ;ZERA CONTADOR DE JOGADA
INCF JOGADA,F
MOVFW BASE_TEMPO ;BASE DE TEMPOMOVWF TEMPO
;MOVE A BOLA DA DIREITA PARA A ESQUERDAMOVLW TRISIOMOVWF FSRMOVLW B'00111100'MOVWF INDF
MOVLW B'00000010' ;LED1MOVWF GPIOCALL WAIT
MOVLW B'00000001' ;LED2MOVWF GPIOCALL WAIT
MOVLW TRISIOMOVWF FSRMOVLW B'00111010'MOVWF INDF
MOVLW B'00000100' ;LED3MOVWF GPIOCALL WAIT
BTFSS BOTAOCALL ERROU_JOGADA
MOVLW B'00000001' ;LED4MOVWF GPIOCALL WAIT
BTFSS BOTAOCALL ERROU_JOGADA
MOVLW TRISIOMOVWF FSRMOVLW B'00101110'MOVWF INDF
MOVLW B'00010000' ;LED5MOVWF GPIOCALL WAIT
BTFSS BOTAOCALL ERROU_JOGADA
MOVLW B'00000001' ;LED6MOVWF GPIOCALL WAIT
BTFSS BOTAOCALL ERROU_JOGADA
MOVLW TRISIOMOVWF FSRMOVLW B'00101011'MOVWF INDF
MOVLW B'00000100' ;LED7MOVWF GPIOCALL WAIT
BTFSS BOTAOCALL ERROU_JOGADA
MOVLW B'00010000' ;LED8MOVWF GPIOCALL WAIT
BTFSS BOTAOCALL ERROU_JOGADA
MOVLW TRISIOMOVWF FSRMOVLW B'00101101'MOVWF INDF
MOVLW B'00000010' ;LED9MOVWF GPIOCALL WAIT
BTFSS BOTAOCALL ERROU_JOGADA
MOVLW B'00010000' ;LED10MOVWF GPIOCALL WAIT
BTFSS BOTAOCALL ERROU_JOGADA
MOVLW TRISIOMOVWF FSRMOVLW B'00111001'MOVWF INDF
MOVLW B'00000100' ;LED11MOVWF GPIOCALL WAIT
MOVLW B'00000010' ;LED12MOVWF GPIO
CALL VER_BOTAO
;VOLTA PARA A ESQUERDAMOVLW TRISIOMOVWF FSRMOVLW B'00111001'
MOVWF INDF
MOVLW B'00000010' ;LED12MOVWF GPIOCALL WAIT
MOVLW B'00000100' ;LED11MOVWF GPIOCALL WAIT
MOVLW TRISIOMOVWF FSRMOVLW B'00101101'MOVWF INDF
MOVLW B'00010000' ;LED10MOVWF GPIOCALL WAIT
BTFSS BOTAOCALL ERROU_JOGADA
MOVLW B'00000010' ;LED9MOVWF GPIOCALL WAIT
BTFSS BOTAOCALL ERROU_JOGADA
MOVLW TRISIOMOVWF FSRMOVLW B'00101011'MOVWF INDF
MOVLW B'00010000' ;LED8MOVWF GPIOCALL WAIT
BTFSS BOTAOCALL ERROU_JOGADA
MOVLW B'00000100' ;LED7MOVWF GPIOCALL WAIT
BTFSS BOTAOCALL ERROU_JOGADA
MOVLW TRISIOMOVWF FSRMOVLW B'00101110'MOVWF INDF
MOVLW B'00000001' ;LED6MOVWF GPIOCALL WAIT
BTFSS BOTAOCALL ERROU_JOGADA
MOVLW B'00010000' ;LED5MOVWF GPIOCALL WAIT
BTFSS BOTAOCALL ERROU_JOGADA
MOVLW TRISIOMOVWF FSRMOVLW B'00111010'MOVWF INDF
MOVLW B'00000001' ;LED4MOVWF GPIOCALL WAIT
BTFSS BOTAOCALL ERROU_JOGADA
MOVLW B'00000100' ;LED3MOVWF GPIOCALL WAIT
BTFSS BOTAOCALL ERROU_JOGADA
MOVLW TRISIOMOVWF FSRMOVLW B'00111100'MOVWF INDF
MOVLW B'00000001' ;LED2MOVWF GPIOCALL WAIT
MOVLW B'00000010' ;LED1MOVWF GPIO
CALL VER_BOTAO
NOPNOPNOPGOTO INICIO
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;VER_BOTAO:
MOVLW .50MOVWF QUANT
VE_BOTMOVLW .30MOVWF TEMPOCALL WAITBTFSS BOTAO
GOTO CONTINUADECFSZ QUANT,F
GOTO VE_BOTNOP
ERROU_JOGADA
CALL FIM_JOGO
MOVLW .3MOVWF QUANT
ENTRA_SLEEPBCF INTCON,GPIF ;LIMPA FLAG DE INTERRUPÇÃO POR MUDANCA DE ESTADO GPI
OBTFSS BOTAO
GOTO ENTRA_SLEEPCLRF GPIOMOVLW TRISIOMOVWF FSRMOVLW B'11111111'MOVWF INDFSLEEPNOPNOPCLRF JOGADAMOVLW .100 ;CARREGA PADRÃO EM BASE DE TEMPOMOVWF BASE_TEMPODECFSZ QUANT,F
GOTO ENTRA_SLEEP;LOOP DO MODO SLEEPAGUARDA
BTFSS BOTAO ;AGUARDA O BOTÃO SER LIBERADO PARA INICIAR O JOGO NOVAMENTE
GOTO AGUARDANOP
CONTINUANOPCALL APITTO ;EMITE BEEP DE JOGADA CORRETAMOVFW BASE_TEMPO ;ACERTA BASE DE TEMPOMOVWF TEMPONOPRETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;FIM_JOGO:
MOVLW TRISIOMOVWF FSRMOVLW B'00001111'MOVWF INDF
MOVLW .20MOVWF TEMPOMOVLW .100MOVWF TMP
FIM1MOVLW .16MOVWF GPIOCALL WAITMOVLW .32MOVWF GPIOCALL WAITDECFSZ TMP,F
GOTO FIM1MOVLW .100MOVWF TEMPORETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;APITTO:
MOVLW TRISIOMOVWF FSRMOVLW B'00001111'MOVWF INDFMOVLW .180MOVWF TOMBCF GPIO,4 ;LIGA NIVEL 0 EM GP4
TI DECF TOM,FBSF SIRENE ;LIGA NIVEL 1 EM GP5MOVFW TOMMOVWF NUM2
T1 NOP ;AGUARDA A QUANT. uS DE TOMDECFSZ NUM2,F ;DECREMENTA NUM2, PULA SE ZEROGOTO T1 ;VAI PARA T1, PULA SE ZEROMOVLW .70 ;AGUARDA 70 uSMOVWF NUM2
T2 NOPDECFSZ NUM2,F ;DECREMENTA NUM2, PULA SE ZEROGOTO T2 ;VAI PARA T2BCF SIRENE ;LIGA NIVEL 0 EM GP4MOVLW .70 ;AGUARDA 70 uSMOVWF NUM2
T3 NOPDECFSZ NUM2,F ;DECREMENTA NUM2, PULA SE ZEROGOTO T3 ;VAI PARA T3, PULA SE ZEROMOVLW .0XORWF TOM,W ;COMPARA TOM COM ZEROBTFSC STATUS,Z ;SE TOM = 0, ENCERRA A ROTINA
RETURNGOTO 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 Wmovwf NUM1 ;PASSA O VALOR DE W PARA NUM1
D1 movfw TEMPO ;PASSA O VALOR DE TEMPO PARA Wmovwf NUM2 ;PASSA O VALOR DE W PARA NUM2
D2 NOPdecfsz NUM2,F ;DECREMENTA NUM2, PULA SE ZERO (REPETE NUM2 VEZE
S)goto D2 ;VAI PARA D2, DECREMENTA NOVAMENTE NUM2
movfw TEMPOmovwf NUM2 ;PASSA O VALOR DE W PARA NUM2
D3 NOPdecfsz NUM2,F ;DECREMENTA NUM1, PULA SE ZEROgoto D3 ;VAI PARA D3decfsz NUM1,F ;DECREMENTA NUM1, PULA SE ZEROgoto D1 ;VAI PARA D1retlw 00
END