#include #include #include "franzis_pp.h" #include "framebuffer.h" void __attribute__ ((naked)) __attribute__ ((section (".init6"))) franzis_pingpong_init() { ROW0_DDR |= (1 << ROW0_PIN); ROW1_DDR |= (1 << ROW1_PIN); ROW2_DDR |= (1 << ROW2_PIN); ROW3_DDR |= (1 << ROW3_PIN); ROW4_DDR |= (1 << ROW4_PIN); ROW5_DDR |= (1 << ROW5_PIN); ROW6_DDR |= (1 << ROW6_PIN); ROW7_DDR |= (1 << ROW7_PIN); ROW8_DDR |= (1 << ROW8_PIN); ROW9_DDR |= (1 << ROW9_PIN); COLS_DDR |= (1 << COLS_STR); COLS_DDR |= (1 << COLS_DATA); COLS_DDR |= (1 << COLS_CLK); ROW2_PORT |= (1 << ROW2_PIN); COLS_PORT |= (1 << COLS_CLK); TCCR2 = (1 << CS22); TIMSK = (1 << TOIE2); sei(); } void franzis_pingpong_push(uint16_t data) { COLS_PORT |= (1 << COLS_STR); uint8_t i; for (i = 0; i<=11; i++) { COLS_PORT &= ~(1 << COLS_CLK); if (data & 1) { COLS_PORT &= ~(1 << COLS_DATA); } else { COLS_PORT |= (1 << COLS_DATA); } COLS_PORT |= (1 << COLS_CLK); data = data >> 1; } COLS_PORT &= ~(1 << COLS_STR); } void franzis_pingpong_clear_row() { ROW0_PORT &= ~(1 << ROW0_PIN); ROW1_PORT &= ~(1 << ROW1_PIN); ROW2_PORT &= ~(1 << ROW2_PIN); ROW3_PORT &= ~(1 << ROW3_PIN); ROW4_PORT &= ~(1 << ROW4_PIN); ROW5_PORT &= ~(1 << ROW5_PIN); ROW6_PORT &= ~(1 << ROW6_PIN); ROW7_PORT &= ~(1 << ROW7_PIN); ROW8_PORT &= ~(1 << ROW8_PIN); ROW9_PORT &= ~(1 << ROW9_PIN); } void franzis_pingpong_select_row(uint8_t row) { switch(row) { case 0: ROW0_PORT |= (1 << ROW0_PIN); break; case 1: ROW1_PORT |= (1 << ROW1_PIN); break; case 2: ROW2_PORT |= (1 << ROW2_PIN); break; case 3: ROW3_PORT |= (1 << ROW3_PIN); break; case 4: ROW4_PORT |= (1 << ROW4_PIN); break; case 5: ROW5_PORT |= (1 << ROW5_PIN); break; case 6: ROW6_PORT |= (1 << ROW6_PIN); break; case 7: ROW7_PORT |= (1 << ROW7_PIN); break; case 8: ROW8_PORT |= (1 << ROW8_PIN); break; case 9: ROW9_PORT |= (1 << ROW9_PIN); break; } } uint8_t fb_nextrow = 0; ISR(TIMER2_OVF_vect) { franzis_pingpong_clear_row(); uint16_t data = ( framebuffer[fb_nextrow][0] ) | ( framebuffer[fb_nextrow][1] << 8); franzis_pingpong_push(data); franzis_pingpong_select_row(fb_nextrow); fb_nextrow++; fb_nextrow = fb_nextrow % 10; }