avr-game

annotate avrgame.c @ 1:872e425f0e7f

foo
author John Tsiombikas <nuclear@member.fsf.org>
date Tue, 09 Sep 2014 06:49:28 +0300
parents 9db99968b55e
children 363acf3e61d4
rev   line source
nuclear@0 1 #include <avr/io.h>
nuclear@1 2 #include <avr/interrupt.h>
nuclear@0 3 #include <util/delay.h>
nuclear@0 4 #include "dotmatrix.h"
nuclear@0 5
nuclear@0 6 /* hardware setup
nuclear@0 7 * - Port B[1,5]: lcd signals (see dotmatrix.h)
nuclear@0 8 * - B1: clk
nuclear@0 9 * - B2: Din
nuclear@0 10 * - B3: DC
nuclear@0 11 * - B4: CE
nuclear@0 12 * - B5: RST
nuclear@1 13 * - Port C[0,3]: buttons
nuclear@0 14 */
nuclear@0 15
nuclear@1 16 enum {
nuclear@1 17 BN_LEFT,
nuclear@1 18 BN_RIGHT,
nuclear@1 19 BN_ROT,
nuclear@1 20 BN_DROP
nuclear@1 21 };
nuclear@1 22
nuclear@1 23 void redraw(void);
nuclear@0 24 /*int lcd_stream_write(char c, FILE *fp);*/
nuclear@1 25 /*FILE stream_lcd = FDEV_SETUP_STREAM(lcd_stream_write, NULL, _FDEV_SETUP_WRITE);*/
nuclear@0 26
nuclear@1 27 static int bx, by, brot;
nuclear@1 28 static unsigned char fb[DM_WIDTH * DM_HEIGHT / 8];
nuclear@0 29
nuclear@0 30 int main(void)
nuclear@0 31 {
nuclear@0 32 /* stdout = stderr = &stream_lcd; */
nuclear@1 33 DDRC = 0; /* input */
nuclear@1 34 PORTC = 0; /* disable pull-ups */
nuclear@1 35
nuclear@1 36 /* enable pin change interrupts (PCINT2) */
nuclear@1 37 PCICR = (1 << PCIE2);
nuclear@1 38 /* unmask interrupts PCINT16-19 (first 4 bits) */
nuclear@1 39 PCMSK2 = 0xf;
nuclear@0 40
nuclear@0 41 dm_init();
nuclear@1 42
nuclear@1 43 sei();
nuclear@0 44
nuclear@0 45 for(;;) {
nuclear@1 46 redraw();
nuclear@0 47 }
nuclear@0 48
nuclear@0 49 return 0;
nuclear@0 50 }
nuclear@0 51
nuclear@1 52 void redraw(void)
nuclear@1 53 {
nuclear@1 54 }
nuclear@1 55
nuclear@1 56 ISR(PCINT2_vect)
nuclear@1 57 {
nuclear@1 58 static unsigned char prev_st = 0xff;
nuclear@1 59 unsigned char st = PINC;
nuclear@1 60 unsigned char diff = st ^ prev_st;
nuclear@1 61
nuclear@1 62 if((diff & (1 << BN_LEFT)) & ~st) {
nuclear@1 63 bx -= 1;
nuclear@1 64 }
nuclear@1 65 if((diff & (1 << BN_RIGHT)) & ~st) {
nuclear@1 66 bx += 1;
nuclear@1 67 }
nuclear@1 68 if((diff & (1 << BN_ROT)) & ~st) {
nuclear@1 69 brot = (brot + 1) % 4;
nuclear@1 70 }
nuclear@1 71 if((diff & (1 << BN_DROP)) & ~st) {
nuclear@1 72 /* TODO */
nuclear@1 73 }
nuclear@1 74
nuclear@1 75 prev_st = st;
nuclear@1 76 }
nuclear@1 77
nuclear@0 78 #if 0
nuclear@0 79 int lcd_stream_write(char c, FILE *fp)
nuclear@0 80 {
nuclear@0 81 /* TODO terminal shit handling */
nuclear@0 82 return 0;
nuclear@0 83 }
nuclear@0 84 #endif