UNIVERSIDAD AUTONOMA DEL
ESTADO DE MEXICO
C.U. ECATEPEC
SISTEMAS DIGITALES
2° PARCIAL
REPORTE – PING PONG
NOMBRES:
CARVAJAL MARTINEZ LUIS FERNANDO
REYES GALVEZ MARIA FERNANDA
DESCRIPCION DEL PROYECTO
Se realizará un programa en PIC16F84A en ensamblador, donde se
desea implementar un juego ping-pong.
CARACTERISTICAS DEL PROGRAMA
1.- El movimiento de la pelota se emulará con el encendido de ocho
LEDs, los cuales irán prendiendo de forma secuencial, de un lado al
oro, simulando el movimiento de la pelita. En cada lado de la tira
de LEDs se conectará un push-button que servirá de “raqueta” para
“golpear” la pelota.
2.- el juego inicia cuando se presiona el botón de Start. Cuando se
presiona el botón encenderá un LED del lado del Player 1. El juego
iniciara en el momento que el Player 1. El juego iniciara en el
momento que el Player 1 presiona su botón.
3.- Si el usuario no “golpea” la pelota dentro del intervalo de
200 ms, el juego considerara que perdió el turno y le dará un punto
al otro jugador.
4.- Cada que un usuario golpee la pelota se escuchara un bip.
5.- El juego dará tres saques consecutivos al Player 1 y tres
saques al Player 2. El que gane más saques será el ganador.
6.- Cuando termina el juego, se encenderá la mitad de los LEDs que
estén del lado del ganador y ahí se quedará el programa hasta que se
presione la tecla “Start”.
CODIGO
#include <xc.inc>
;PROGRAMA SECUENCIA DE LEDS IZQUIERDA DERECHA Y DERECHA IZQUIERDA
PROCESSOR 16F84A
;ZONA DE CONFIGURACION DIGITAL
CONFIG FOSC=XT
CONFIG WDTE=OFF
CONFIG PWRTE=OFF
CONFIG CP=OFF
;DEFINICION DE VARIABLES
;DEFINICION DE LA SECUENCIA DEL CODIGO
PSECT Programa,class=CODE,delta=2,abs
ORG 00h
Programa:
Cont1 EQU 0Ch
Cont2 EQU 0Dh
P1 EQU 0Eh
P2 EQU 0Fh
Ga1 EQU 20h
Ga2 EQU 21h
Saq1 EQU 22h
Saq2 EQU 23h
////
GOTO INICIO
INICIO:
bsf STATUS,5
movlw 00000000B ;salidas
movwf TRISB
movlw 11101B
movwf TRISA ;entradas
bcf STATUS,5
////
CLRF PORTB
CLRF PORTA
MOVLW 00000000B
MOVWF 20h
MOVLW 00000000B
MOVWF 21h
MOVLW 00000000B
MOVWF 22h
MOVLW 00000000B
MOVWF 23h
////
;PUSH-BUTTON “START” CONECTADO EN LA ENTRADA RA2
START:
MOVLW 11111111B
MOVWF PORTB
BTFSS PORTA,2 //MONITOREA EL BOTON START HASTA QUE SEA
PULSADO
GOTO START
GOTO PRINCIPAL
///
PRINCIPAL: //PLAYER 1 SACA
MOVLW 00000001B
MOVWF PORTB
PLAYERP: //EMPIEZA HASTA QUE EL PLAYER 1 PRESIONA EL BOTON,
CON EL PRIMER TIEMPO AUN NO VERIFICA LOS 200MS
BTFSS PORTA,0
GOTO PLAYERP //espera a que se pulse el boton para empezar
linea 56
GOTO IZQUIERDAPIP //va a linea 60
IZQUIERDAPIP: //REALIZA EL SONIDO AL PULSAR EL PUSH DEL PLAYER
1 viene de linea 59
MOVLW 00010B
MOVWF PORTA
CALL Retardo1
CLRF PORTA
IZQUIERDA: //ROTA DE IZQUIERDA A DERECHA
RLF PORTB,1
call Retardo1
BTFSS PORTB,7
GOTO IZQUIERDA //Rota hasta que llegue al bit 7 linea 65
GOTO DERECHA // VA A LINEA 86
DERECHA: //EL LED RB7 SE QUEDA ENCENDIDO POR 200 MS Y SI NO SE
PULSA EL BOTON PIERDE
CLRF PORTB
MOVLW 10000000B
MOVWF PORTB
PLAYER2:
CALL Tiempopulsar2 // AQUI SE VERIFICA SI EL BOTON ES PULSADO
O NO VA A LINEA 157
ganador1: //PLAYER 1 GANO PLAYER 2 NO PULSO
MOVLW 00001111B //INDICA QUE GANO
MOVWF PORTB
CLRF PORTB
CALL Retardo1
MOVLW 00001111B //INDICA QUE GANO
MOVWF PORTB
CALL Retardo1
CLRF PORTB
INCF Ga1,1 //aqui
INCF Saq1,1
MOVLW 00000011B
SUBWF Saq1,0
BTFSS STATUS,2
GOTO PRINCIPAL
GOTO START2 // HASTA AQUI VERIOFICICA LO DEL PLAYER 1
/////////////////////
DERECHAPIP:
MOVLW 00010B
MOVWF PORTA
CALL Retardo1
CLRF PORTA
DERECHA2:
RRF PORTB,1
CALL Retardo1
BTFSS PORTB,0
GOTO DERECHA2 // REGRESA A LINEA 98 HASTA QUE SEA BIT 0
GOTO PLAYER1 //VA A LI
PLAYER1:
CLRF PORTB
MOVLW 00000001B
MOVWF PORTB
CALL Tiempopulsar //le da 200ms para que pulse el boton si no
pierde VA A LINEA 135
ganador2: //PLAYER 2 GANO PLAYER 1 NO PULSO
MOVLW 11110000B
MOVWF PORTB
clrf PORTB
CALL Retardo1
MOVLW 11110000B
MOVWF PORTB
CALL Retardo1
INCF Ga2,1
INCF Saq1,1
MOVLW 00000011B
SUBWF Saq1,0
BTFSS STATUS,2
GOTO PRINCIPAL
GOTO START2
//
//AQUÍ EMPIEZA PLAYER 2
START2:
PLAYER22:
CLRF PORTB
MOVLW 10000000B
MOVWF PORTB
PPLAYER: // EL JUEGO CONTINUA CUANDO EL PLAYER 2 PULSA EL
BOTON
BTFSS PORTA,4
GOTO PPLAYER //VA A LINEA 133
GOTO DERECHAPIP3 //VA A LINEA 137
DERECHAPIP3:
MOVLW 00010B
MOVWF PORTA
CALL Retardo1
CLRF PORTA
//
DERECHA3:
RRF PORTB,1
CALL Retardo1
BTFSS PORTB,0
GOTO DERECHA3 //REGRESA A LINEA 142
GOTO PLAYER13 //VA A LINEA 49
//
PLAYER13:
CALL Tiempopulsar3 //le da 200ms para que pulse el boton si no
pierde VA A LINEA 135
MOVLW 11110000B
MOVWF PORTB
CLRF PORTB
CALL Retardo1
MOVLW 11110000B
MOVWF PORTB
CALL Retardo1
INCF Ga2,1
INCF Saq2,1
MOVLW 00000011B
SUBWF Saq2,0
BTFSS STATUS,2
GOTO START2
GOTO QUIENGANO //SI Y PASARTON LOS 3 SAQUE EMPIEZA E}A
VERIFICAR QUIEN GANO.
///
IZQUIERDAPIP4: //REALIZA EL SONIDO AL PULSAR EL PUSH DEL
PLAYER 1
MOVLW 00010B
MOVWF PORTA
CALL Retardo1
CLRF PORTA
IZQUIERDA4: //ROTA DE IZQUIERDA A DERECHA
RLF PORTB,1
call Retardo1
BTFSS PORTB,7
GOTO IZQUIERDA4
GOTO DERECHA4
DERECHA4: //EL LED RB7 SE QUEDA ENCENDIDO POR 200 MS Y SI NO
SE PULSA EL BOTON PIERDE
CLRF PORTB
MOVLW 10000000B
MOVWF PORTB
//
PLAYER4:
CALL Tiempopulsar4
MOVLW 00001111B //INDICA QUE GANO
MOVWF PORTB
CLRF PORTB
CALL Retardo1
MOVLW 00001111B //INDICA QUE GANO
MOVWF PORTB
CALL Retardo1
CLRF PORTB
INCF Ga1,1 //aqui
INCF Saq2,1
MOVLW 00000011B
SUBWF Saq2,0
BTFSS STATUS,2
GOTO START2
GOTO QUIENGANO
//
QUIENGANO:
MOVLW 00000110B //VERIFICA si es 6 si es asi es empate:
SUBWF Ga1,0
BTFSS STATUS,2 //
GOTO SIG1 // si no es
GOTO GANO6 //si si es
//
GANO6:
MOVLW 00001111B
MOVWF PORTB
CALL Retardo1
CLRF PORTB
BTFSS PORTA,2
GOTO GANO6
GOTO START
//
SIG1:
MOVLW 00000101B //VERIFICA si es 5 si es asi es empate:
SUBWF Ga1,0
BTFSS STATUS,2
GOTO SIG12 //si no es
GOTO GANO5 //si si es
//
GANO5:
MOVLW 00001111B
MOVWF PORTB
CALL Retardo1
CLRF PORTB
BTFSS PORTA,2
GOTO GANO5
GOTO START
//
SIG12:
MOVLW 00000100B //VERIFICA si es 4 si es asi es empate:
SUBWF Ga1,0
BTFSS STATUS,2
GOTO SIG122 //no
GOTO GANO4 //si
//
GANO4:
MOVLW 00001111B
MOVWF PORTB
CALL Retardo1
CLRF PORTB
BTFSS PORTA,2
GOTO GANO4
GOTO START
//
SIG122:
MOVLW 00000011B //VERIFICA si es 3 si es asi es empate:
SUBWF Ga1,0
BTFSS STATUS,2
GOTO GA2
GOTO EMPATE1
EMPATE1:
MOVLW 11100111B
MOVWF PORTB
CALL Retardo1
CLRF PORTB
BTFSS PORTA,2
GOTO EMPATE1
GOTO START
// GA2 - VARIABLE
GA2:
MOVLW 00000110B //VERIFICA si es 6 si es asi es empate:
SUBWF Ga2,0
BTFSS STATUS,2
GOTO SIG2
GOTO GANO62
//
GANO62:
MOVLW 11110000B
MOVWF PORTB
CALL Retardo1
CLRF PORTB
BTFSS PORTA,2
GOTO GANO62
GOTO START
//
SIG2:
MOVLW 00000101B //VERIFICA si es 5 si es asi es empate:
SUBWF Ga2,0
BTFSS STATUS,2
GOTO SIG22
GOTO GANO52
//
GANO52:
MOVLW 11110000B
MOVWF PORTB
CALL Retardo1
CLRF PORTB
BTFSS PORTA,2
GOTO GANO52
GOTO START
//
;VERIFICACION DEL EMPATE
SIG22:
MOVLW 00000100B //VERIFICA si es 4 si es asi es empate:
SUBWF Ga2,0
BTFSS STATUS,2
GOTO SIG222
GOTO GANO42
//
GANO42:
MOVLW 11110000B
MOVWF PORTB
CALL Retardo1
CLRF PORTB
BTFSS PORTA,2
GOTO GANO42
GOTO START
//
SIG222:
MOVLW 00000011B //VERIFICA si es 3 si es asi es empate:
SUBWF Ga2,0
BTFSS STATUS,2
GOTO SIG21
GOTO EMPATE2
//
EMPATE2:
MOVLW 11100111B
MOVWF PORTB
CALL Retardo1
CLRF PORTB
BTFSS PORTA,2
GOTO EMPATE2
GOTO START
//
SIG21:
MOVLW 0011000B
MOVWF PORTB
CALL Retardo1
CLRF PORTB
BTFSS PORTA,2
GOTO EMPATE2
GOTO START
//
Tiempopulsar: //verifica los 200ms del player1
movlw 221
movwf Cont2
Dec022:
MOVLW 151
MOVWF Cont1
Dec011:
BTFSS PORTA,0
GOTO SEGUIR
GOTO IZQUIERDAPIP //SER VA LINEA 66
SEGUIR:
DECFSZCont1,1
GOTO Dec011
DECFSZ Cont2,1
GOTO Dec022
Return
//
Tiempopulsar2: //verifica los 200ms del player2
MOVLW 221
MOVWF Cont2
Dec0222:
MOVLW 151
MOVWF Cont1
Dec0111:
BTFSS PORTA,4
GOTO SEGUIR2
GOTO DERECHAPIP //VA A LINEA 104
SEGUIR2:
DECFSZ Cont1,1
GOTO Dec0111
DECFSZ Cont2,1
GOTO Dec0222
Return
//
Tiempopulsar3: //verifica los 200ms del player1
MOVLW 221
MOVWF Cont2
Dec20222:
MOVLW 151
MOVWF Cont1
Dec10111:
BTFSS PORTA,0
GOTO SEGUIR3
GOTO IZQUIERDAPIP4 //SER VA LINEA 66
SEGUIR3:
DECFSZ Cont1,1
GOTO Dec10111
DECFSZ Cont2,1
GOTO Dec20222
Return
//
Tiempopulsar4: //verifica los 200ms del player2
MOVLW 221
MOVWF Cont2
Dec022222:
MOVLW 151
MOVWF Cont1
Dec011111:
BTFSS PORTA,4
GOTO SEGUIR4
GOTO DERECHAPIP3 //VA A LINEA 104
SEGUIR4:
DECFSZ Cont1,1
GOTO Dec011111
DECFSZ Cont2,1
GOTO Dec022222
Return
//
Retardo1: //TIEMPO DE ENCENDIDO DE LEDS
MOVLW 100
MOVWF Cont2
Dec02:
MOVLW 118
MOVWF Cont1
Dec01:
DECFSZ Cont1,1
GOTO Dec01
DECFSZ Cont2,1
GOTO Dec02
Return
End Programa
DIAGRAMA DE FLUJO
DIAGRAMA DE BLOQUES
DESCRIPCION DEL FUNCIONAMIENTO
1.- Secuencia de inicio: Es en donde se prenderán los leds para
hacer la secuencia de saques para los players con la ayuda de el
botón de “Start”
2.- player 1 y player 2: Aquí es donde se utilizan dos push-button
para hacer alusión de dos raquetas y se hace su respectivo
secuencia que emule el recorrido de la pelota.
3.- tres saques: Aquí es donde cada player hará tres saques, si un
player hace mas saques ganara, si los dos players tienen el mismo
numero de saques se hará empate y si no se golpea la pelota en un
determinado tiempo se le dará el punto al otro player.
4.- fin del juego: Cuando se termine el juego se encenderán los
leds del player ganador o del empate en cuestión.
5.- espera en el botón: Hasta que se vuelva a presionar el botón se
podrá volver a jugar, si no se quedara en pausa el juego.
Diagrama eléctrico
CIRCUITO FUNCIONANDO
Evidencia del encendido de leds
Objetivo de esta etapa: En esta etapa del circuito, es de ver si
los leds pueden prender y hacer la espera hasta que se oprima el
botón de “start”
Evidencia de los saques de los players
Objetivo de esa etapa: En esta etapa el objetivo es que el player
1 y el player 2 puedan hacer el saque y que los leds puedan hacer
el recorrido.
Player 1 - Saque
Player 2 - Saque
Empate del juego
Objetivo de esta etapa: El objetivo de esta etapa es que al
momento de que los players cuando hagan sus respectivos saques
pueda hacer el empate y se es el caso, además de que los leds
puedan prender
Ganador player 1
Objetivo de la etapa: El objetivo de esta etapa es que cuando los
dos players estén haciendo sus respectivos saques, el programa si
pueda reconocer que en esta ocasión el player 1 es el ganador y
puedan prender los leds del respectivo player.
Ganador player 2
Objetivo de la etapa: El objetivo de esta etapa es que cuando los
dos players estén haciendo sus respectivos saques, el programa si
pueda reconocer que en esta ocasión el player 2 es el ganador y
puedan prender los leds del respectivo player.