Paso 6: El código
Así tengo un montón de código muerto que había planeado hacer muchas animaciones diferentes, pero como la Navidad partido se acercó me atajo todo y simplemente enciende el LED en secuencia.
Esto salió muy eficazmente como que había conectado los LEDs sin ningún orden en particular, por lo que apareció al azar, y ayudó a ocultar los LEDs que habían fallado.
Así, el código...
Lo pongo en GitHub:
https://github.com/NathanWilliams/GingerbreadHouse2011
Puede navegar, lo horquilla o simplemente descargar una postal desde allí.
Para entender el código, el mejor lugar para empezar es hal.cpp (capa de abstracción de Hardware).
Para hacer una matriz de charlieplexed como si todos los LEDs están en a la vez, necesitamos para ellos con la suficiente rapidez para engañar el ojo.
Para ello usé un temporizador AVR para provocar una interrupción cuando ha pasado cierta cantidad de tiempo.
Cuando el temporizador de interrupción fuegos, se muestra el siguiente LED.
Depende de si está activado o desactivado en la "pantalla" que es una matriz de 42 valores booleanos, true si un LED debe ser encendido, false para apagado.
Pantalla LED la combinación correcta de pines de salida y todo lo demás a "desconectado" (alta impedancia).
Todo sucede en el archivo principal (sí, todo lo demás es código muerto...).
Incluso la mayoría del código en este archivo es código muerto, pero lo dejé como punto de partida para el próximo año.
Todo lo que realmente importa es setup y FrameCallback.
FrameCallback es una función que se pasa como una función de callback que se llama de la interrupción de actualización basada en el número de fotogramas que han sido elaborados.
Como yo estoy dibujando a 60 FPS, puse la devolución de llamada para cada 15 fotogramas, o ~ 250ms.