Documente Academic
Documente Profesional
Documente Cultură
El PIC Tetris juego (PICtris) generado a partir de una pregunta reciente RetroBrad en el foro. Quera saber cmo manipular los
LEDs y dibujar grficos en 2D. Yo soy ms de un tipo de hombre prctico y en el pasado, los grficos no son un motivo de
preocupacin. Yo estaba intrigado a adentrarse en el mundo de 2D a averiguar cmo funcionan las cosas motiva.
Los LEDs 64 y cuatro botones estn controlados por un nico PIC (18LF4520) y dos bateras AA. El cdigo fuente opera de
manera muy eficiente, y el programa es extremadamente sensible. Yo estaba preocupado por este ltimo, ya que estaba
decidido a utilizar algoritmos grficos basados en rotaciones con respecto a las constantes predefinidas. Desde aqu me vendra
bien un enfoque similar para crear otros juegos interactivos!
Como siempre, las nuevas caractersticas son una necesidad! Dado que el vdeo de arriba, he aadido lo siguiente:
Todas las caractersticas anteriores se incorporan en el cdigo fuente (que se encuentra a continuacin)
Creacin de grficos 2D
En el juego de Tetris, los grficos son tratados como objetos de pxel 8x16. Para aliviar la sobrecarga de diseo grfico, hice
una hoja de clculo de Excel que hace todo el trabajo duro por usted.
Hay un campo de 8x16 donde usted puede colocar una "x" para cada bloque del objeto. Cualquier bloque con una "x" se dar
formato a parecer que lo hace a continuacin (me pareci que el enfoque ms fcil de interpretar en comparacin con
dispersin de x). La hoja de clculo se calcula y muestra el cdigo necesario para el pez espada grfico! Simple. Aqu hay una
captura de pantalla:
otacin Grfico
/ / analizar cada
Qu est pasando? Pfuente La matriz contiene informacin grfica para el objeto. Cada byte representa una columna de
pxeles, que se puede denominar en X, Y formato de este modo:
pObject ( X ) . Bits ( Y )
pObject es de tipo Word . Esto significa que cada ndice tiene 16 bits (dos bytes). Esto permite que dos pantallas 8x8 para
ser unido y forman una sola pantalla 8x16 . Considere la posibilidad de cualquier objeto en la pantalla:
Teniendo en cuenta que la esquina superior izquierda es 0,0 pxel : Slo hay cuatro pixels que
estn habilitados, que son:
X = 3, Y = 2
X = 4, Y = 2
X = 5, Y = 2
X = 4, Y = 3
Ahora tenemos una gran variedad de informacin de los pxeles que se puede utilizar de todos modos queremos.
Rotacin de pxeles
En el juego de Tetris, que estaba originalmente rotacin de objetos CCW, aunque ahora ha cambiado a CW. Como este
ejemplo fue escrito antes de que el cambio, se centrar en convertir un objeto hacia la izquierda. Si desea girar un objeto hacia
otro lado, a continuacin, comprobar el cdigo fuente - ambas frmulas estn incluidos. Frmula Rotacin de CCW
X2 = (Y1 + PX - PY)
Y2 = (PX + PY - X1 - Q)
Paso 2
Defina la longitud del objeto / anchura (Q)
Estamos trabajando en un solo pxel por pxel medio ambiente. Esto significa que la longitud y la anchura (Q) de cada pxel es
siempre 0. He incluido este paso para su uso con otras condiciones.
Paso 3
Definir el pxel a ser movido (X1, Y2)
Al principio, me voy a girar pixel (3,2).
Paso 4
Ejecutar las matemticas
Si
PX = 4
PY = 2
= 3 X1
Y1 = 2
Q = 0
Y
X2 = (Y1 + PX - PY)
Y2 = (PX + PY - X1 - Q)
Por lo tanto
X2 = 4
Y2 = 3
Cdigo Fuente
PICtris (Tetris en un microcontrolador PIC)
"V1.0
"liberacin del cdigo fuente. Tetris sin campanas + silbidos.
" v1.1
scorekeeping Aadido 'y Puntuaciones. El juego mostrar la puntuacin ms alta por ltima vez en el
principio.
" Si su puntaje es mejor que la puntuacin ms alta, se guardan en la EEPROM como el nuevo alto
PROGRAMA
Const mS_Inc = 2
Const DebounceDelay = 10
/ / FORMAS!
/ / Asegrese de actualizar "NumberOfShapes" si se aaden ms (o algunos se eliminan)
/ / # # #
/ /
# # #
/ /
# # #
/ /
# #
/ /
# # #
/ /
# # #
/ /
interrupcin TMR2_Interrupt ( 2 )
Guardar ( 0 ) / / Copia de seguridad de las variables del sistema
/ / Botn Debounces
/ / Asegura que el botn ha sido activado antes de realizar un rebote.
/ / por alarma, el usuario tiene X mS entre pulsaciones de botn.
/ / Evita prensas y dobles y minimizar la posibilidad de chasquido del interruptor.
/ / La rutina de sub 'CheckButtons' controla el estado de diversas banderas aqu.
/ / comprueba si el botn izquierdo requiere
comprobar si el botn derecho requiere
/ / llenar y
habilitar un eje x (la correcta para actual eje Y)
Si CurrentX < 4 Entonces
Porta. pedacitos ( CurrentX ) = 0
Else
PORTB. pedacitos ( CurrentX ) = 0
EndIf
/ / incrementa eje x, listo para el prximo multiplex
Inc ( CurrentX )
Si CurrentX = 8 Entonces
CurrentX = 0
EndIf
/ / Esta es la rutina semforo primaria. Si el programa utiliza los recursos compartidos, esta rutina se
llama.
Sub PauseMultiplexing ( )
WaitForInterrupt
UpdateScreen = 0
'TMR2IE = 0
End Sub
Una forma extremadamente rpida para girar los objetos 90 / -90 grados.
/ /
/ / Notas:
. / / Calcula el centro del bloque (para ser utilizado como un punto de pivote), es decir, el centro de
la forma de bloqueo de llamadas que ( px, py).
/ / Cada ladrillo que forma la forma de bloque girar en torno a ese punto. Para cada ladrillo, se puede
aplicar el siguiente clculo.
/ / Dnde ancho cada ladrillo y la altura es q, la ubicacin actual del ladrillo (de la esquina
superior izquierda) es (x1, y1) y la ubicacin de ladrillo nuevo (x2, y2):
/ / x2 = (y1 + px - py)
/ / y2 = (px + py - x1 - q)
/ / Para girar la direccin opuesta:
/ / x2 = (px + py - y1 - q)
/ / y2 = (x1 + py - px)
/ /
/ / Sobre la base de una matriz afn 2D
/ / Cuenta la cantidad de pxeles que la igualdad "1". Estndar operadores bit a bit no se adaptaba
/ / Esta rutina como pxeles podra muy bien terminar en cualquier lugar despus de un
/ / Comprobar el estado de cada botn. Debido a que esta rutina se llama a menudo, las posibilidades de
perder slo pulsar un botn
/ / son muy poco probables.
Sub CheckButtons ( )
/ / comprueba si el botn izquierdo pulsado
Si Izquierda = 0 Y Left_Debounce = 0 Entonces
/ / semforo - variables compartidas estn a punto de ser visitada
PauseMultiplexing
/ / asegurar que el objeto no es ya contra la pared de la izquierda
Si CheckForLeftWall ( ObjectData ) = 0 Entonces
/ / mover el objeto a un bfer temporal
MergeObjects ( ObjectData, tmpObjectData, 0 )
/ / Disminuir el eje x
MoveObjectX ( tmpObjectData, 1 )
/ / asegurar que no hay colisiones con el fondo
Si CollisionDetect ( tmpObjectData, BackgroundData ) = 0 entonces
/ / todo ha ido bien, combinar la matriz en la memoria intermedia de trabajo
MergeObjects ( tmpObjectData, ObjectData, 0 )
/ / activar el temporizador antirrebote (evita que se pulse dobles etc)
Left_Delay = DebounceDelay
Left_Debounce = 1
/ / siempre la posibilidad de que una nueva lnea se hizo slo
CheckForNewLines = 1
EndIf
EndIf
ResumeMultiplexing
EndIf
/ / comprueba si el botn derecho se pulsa
/ / NOTA: ESTOS COMENTARIOS son casi las mismas que el anterior, excluidos por eso
si Derecha = 0 Y Right_Debounce = 0 Entonces
/ / semforo - variables compartidas estn a punto de acceder
PauseMultiplexing
/ / asegurar que no se encuentra en el derecho
Y )
NumberOfLines = NumberOfLines + 1
EndIf
pxeles = 0
Next
End Sub
/ / inicializar TMR2
privadas Sub Initialise_TMR2 ( )
TMR2ON = 0 / / Desactivar TMR2
TMR2IE = 0 / / Apagar TMR2 interrumpe
mS = 0 / / Inicia mS
PR2 = 199 / / TMR2 Perodo de registro PR2
T2CON = % 00100011 / / T2CON 0:1 = preescala
/ / 00 = preescalador es de 1:1
/ / 01 = preescalador es de 1:4
/ / 1x = preescalador es 1:16
/ / 03:06 = Postscale
/ / 0000 = 1:1 postscale
/ / 0001 = 1:2 postscale
/ / 0010 = 1:3 postscale ...
/ / 1111 = uno y diecisis postscale
/ / Inicia el programa
Sub InitialiseProgram ( )
/ / hacer todas las entradas digitales
Utils. SetAllDigital
/ / configurar E / S
TRISB = $ 0F
PORTB = $ 00
TRISC = $ 00
PORTC = $ 00
TRISD = $ 00
PORTD = $ 00
TRISA = $ 00
PORTA = $ 11
/ / habilitar weakpullups PORTB
INTCON2. 7 = 0
/ / intialise
inicializar eventos
DropObject = 0
EndOfGame = 0
CheckForNewLines = 0
sWDT = 0
/ / inicializar
Para i = 0 a 7
semforo - variables compartidas estn a punto de acceder
PauseMultiplexing
tmpObjectData )
/ / cambiar el resultado hacia abajo, dependiendo de ndice
Seleccione i
Caso 2
MoveObjectY ( tmpObjectData, 0 , 5 )
Caso 3
MoveObjectY ( tmpObjectData, 0 , 10 )
End Select
/ / o resultado con objeto grfico
MergeObjects ( tmpObjectData, ObjectData, 1 )
Siguiente
ResumeMultiplexing
/ / realizar botn
Repetir
/ / comprobar si la bandera cada de objeto se ha establecido (invocado produce por la
interrupcin "TimerObjectDrop")
Si DropObject = 1 Entonces
DropObject = 0
MoveObjectDown ( ObjectData )
EndIf
/ / comprobar si hay lneas completas. cualquier rutina que se mueve un objeto debe habilitar
esta opcin.
Si CheckForNewLines = 1 Then
CheckForLines ( BackgroundData )
EndIf
/ / botones de escaneado y acciones como necesarias
CheckButtons ( )
/ watch / reset software temporizador perro
sWDT = 0
/ / bucle infinito, o hasta que el evento EndOfGame se establece verdadero
Hasta EndOfGame = 1
Si bien Verdadero
/ / entrar en el programa principal del juego, se quedar all hasta que se produce un evento END
MainGameLoop
Wend
Esquemtico
Algunas consideraciones con este esquema:
He utilizado dos ctodo comn 8x8 LED matriz. No he incluido ninguna disposicin de las patillas para ellos en el pinout
vara tanto entre los fabricantes. Usted tendr que comprobar la hoja de datos para su matriz especfica.
Resistencias podra ser cualquier valor por debajo de 200ohms (menos hasta que tenga el brillo deseado - Sola
80ohms).
Por favor, intente una "Blinky", programa en el PIC no debe despedir a su circuito y trabajar por primera vez. Te puedo
garantizar que esta disposicin funciona, he utilizado la lista de conexiones desde este mismo schyematic para desarrollar mi
PCB.
El smbolo de un tringulo con una lnea atravesada significa Vdd (5V). Tal ULN2803 Pin 10.
Otros consejos:
Para nodo comn pantallas LED de tipo, tendr que modificar el cdigo fuente. Usted tendr que cambiar el ULN2803
Haga clic
aqu para enarlge la imagen. Nota: He utilizado la variante de baja tensin de los anteriores Micro PIC, su nmero de parte es
18LF4520.
El PCB
Debido a peticin popular, tambin estoy compartiendo los archivos Gerber para el PCB se muestra a continuacin:
Trabajo:
Ruben Arbizu
Catedras: Tecnologia Y
Taller Digital