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 |