/* 4*4 MATRIX */ #include #include #include #include #include #define XTAL 1000000L #define REFRESH 100 #define PRESCALE 256 #define RELOAD (0xff-(XTAL/(REFRESH*4)/PRESCALE)) #define MAXCOL 4 #define MAXROW 4 #define COLPORT PORTD #define COLDDR DDRD #define ROWPORT PORTC #define ROWDDR DDRC #define L0000 0x00 #define L0001 0x01 #define L0010 0x02 #define L0011 0x03 #define L0100 0x04 #define L0101 0x05 #define L0110 0x06 #define L0111 0x07 #define L1000 0x08 #define L1001 0x09 #define L1010 0x0a #define L1011 0x0b #define L1100 0x0c #define L1101 0x0d #define L1110 0x0e #define L1111 0x0f #define ENDSEQ 0 #define DELAY0 20 #define DELAY1 50 #define DELAY2 100 #define DELAY3 200 const unsigned char updo[] PROGMEM = { // lines up down DELAY2,L0001,L0001,L0001,L0001, // up DELAY2,L0010,L0010,L0010,L0010, DELAY2,L0100,L0100,L0100,L0100, DELAY2,L1000,L1000,L1000,L1000, DELAY2,L0100,L0100,L0100,L0100, // down DELAY2,L0010,L0010,L0010,L0010, DELAY2,L0001,L0001,L0001,L0001, ENDSEQ }; const unsigned char leri[] PROGMEM = { // lines left right DELAY2,L1111,L0000,L0000,L0000, DELAY2,L0000,L1111,L0000,L0000, DELAY2,L0000,L0000,L1111,L0000, DELAY2,L0000,L0000,L0000,L1111, DELAY2,L0000,L0000,L1111,L0000, DELAY2,L0000,L1111,L0000,L0000, DELAY2,L1111,L0000,L0000,L0000, ENDSEQ }; const unsigned char redblink[] PROGMEM = { DELAY2,L1010,L0101,L1010,L0101, DELAY2,L0000,L0000,L0000,L0000, ENDSEQ }; const unsigned char yellowblink[] PROGMEM = { DELAY2,L0101,L1010,L0101,L1010, DELAY2,L0000,L0000,L0000,L0000, ENDSEQ }; const unsigned char twist[] PROGMEM = { DELAY0,L1000,L0000,L0000,L0000, DELAY0,L0000,L1000,L0000,L0000, DELAY0,L0000,L0000,L1000,L0000, DELAY0,L0000,L0000,L0000,L1000, DELAY0,L0000,L0000,L0000,L0100, DELAY0,L0000,L0000,L0000,L0010, DELAY0,L0000,L0000,L0000,L0001, DELAY0,L0000,L0000,L0001,L0000, DELAY0,L0000,L0001,L0000,L0000, DELAY0,L0001,L0000,L0000,L0000, DELAY0,L0010,L0000,L0000,L0000, DELAY0,L0100,L0000,L0000,L0000, DELAY0,L0000,L0100,L0000,L0000, DELAY0,L0000,L0000,L0100,L0000, DELAY0,L0000,L0000,L0010,L0000, DELAY0,L0000,L0010,L0000,L0000, ENDSEQ }; #define MAXSEQ 5 const unsigned char *sequences[] PROGMEM ={updo,leri,redblink, yellowblink,twist}; volatile unsigned char col[MAXCOL]; // unsigned char colbuffer[MAXCOL]; volatile unsigned char actcol; SIGNAL(SIG_OVERFLOW0) { TCNT0=RELOAD; if (actcol=MAXSEQ) random_seq(); else play_sequence(actseq); } return 0; }