7
;******************************************************************* ; 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 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 0 ; 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 TERÃO INTERRU PÇÃO HABILITADA MOVWF FSR MOVLW B'00001000' ;APENAS GP3 TEM INTERRUPÇÃO HABILITADA MOVWF INDF ;GRAVA IOC MOVLW WPU ;DEFINE OS PINOS DO GPIO QUE TERÃO INTERRU PÇÃO HABILITADA MOVWF FSR CLRF INDF ;LIMPA WPU (NENHUM RESISTOR PULL-UP HABILITADO) MOVLW OPTION_REG ;DEFINE OS PINOS DO GPIO QUE TERÃO INTERRUPÇÃO 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 INTERRUPÇÕES MOVLW .100 MOVWF BASE_TEMPO CLRF JOGADA

Pingpong.asm

Embed Size (px)

DESCRIPTION

assembly

Citation preview

Page 1: Pingpong.asm

;*******************************************************************; 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

Page 2: Pingpong.asm

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

Page 3: Pingpong.asm

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'

Page 4: Pingpong.asm

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

Page 5: Pingpong.asm

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

Page 6: Pingpong.asm

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

Page 7: Pingpong.asm

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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