void setup() { pinMode(8, OUTPUT); pinMode(9, OUTPUT); digitalWrite(8, HIGH); digitalWrite(9, HIGH); Serial.begin(115200); // DDRB |= (1 << DDB0) | (1 << DDB1); // PORTB |= (1 << PORTB0); // PORTB |= (1 << PORTB1); /* // Set Timer1 CTC TCCR1B = (TCCR1B & ~_BV(WGM13)) | _BV(WGM12); TCCR1A = TCCR1A & ~(_BV(WGM11) | _BV(WGM10)); // No prescaler (p.134) TCCR1B = (TCCR1B & ~(_BV(CS12) | _BV(CS11))) | _BV(CS10); OCR1A = 0; TIMSK1 |= _BV(OCIE1A);*/ } #define nop() __asm volatile ("nop") #define nop1() nop(); #include #define onD() PORTB = (1 << PORTB0); #define onC() PORTB = (1 << PORTB1); #define onB() PORTB = (1 << PORTB0) | (1 << PORTB1); #define offB() PORTB = 0; #define off() nop10(); PORTB = 0; #define off2() nop10(); PORTB = 0; nop10(); #define DH() PORTB |= (1 << PORTB0) #define CH() PORTB |= (1 << PORTB1) #define DL() PORTB &= ~(1 << PORTB0) #define CL() PORTB &= ~(1 << PORTB1) #include #define D_ALL 0b01010001 #define C_ALL 0b00001101 #define D_PIXEL 0b01100011 #define D_GREEN 0b00010000 #define D_RED 0b00001000 #define D_BLUE 0b00000100 #define D_WHITE 0b00011100 #define D_BLACK 0b00000000 #define C_PIXEL 0b01000100 #define D_P69 0b01000010 #define C_P69 0b00100100 #define C_MYSTERY1 0b01000000 #define C_MYSTERY2 0b00011000 #define DELAY 50 // cccccc-ddddddd #define CMD_RAINBOW 0b11111000110001 // shifts a pixel for pwm #define CMD_DOPWM 0b10101000101000 // enables pwm mixing #define CMD_DOSWIPE 0b10101000100100 // enables backwards shifting? #define CMD_SHIFT 0b10001000110001 // shifts a pixel into the register #define CMD_CLS1 0b01001000111000 //?? before foreground paint #define CMD_SWIPE 0b01001000100001 //?? responsible for program 69 #define CMD_CLS2 0b00101000100000 //?? before background paint #define CMD_BG 0b01001000110000 // paint background, broken #define CMD_FG 0b00001000101000 // paint foreground #define CMD_EMPTY 0b00001000100001 // shifts pixels, removed bg, but not all of it #define CMD_SETPWM 0b10001000100000 // pwm speed for fading // fade in : CMD_SETPWM + CMD_BG // fade out: CMD_SETPWM + CMD_BG | BG_OFF #define PWM_1 0b00100000000000 #define PWM_2 0b00010000000000 #define PWM_3 0b00000000001000 #define PWM_4 0b00000000000100 #define PWM_5 0b00000000000010 #define SHIFT_CGREEN 0b01000000000000 #define SHIFT_CRED 0b00100000000000 #define SHIFT_CBLUE 0b00010000000000 // bitmap // cccccc-ddddddd //#define RAINBOW+COL 0b111110 011***1 // shifts a pixel for pwm //#define SWIPE+M1+M2 0b111110 010***1 //#define SWIPE+MYST1 0b110010 010***1 //#define CMD_SETPWM 0b10**100010***0 // pwm speed for fading //#define CMD_SHIFT 0b1***10 011***1 // shifts a pixel into the register //#define SWIPE+MYST2 0b011110 010***1 //#define CMD_CLS1 0b01**10 0111*00 //?? before foreground paint, set background as well //#define CMD_BG 0b01**10 0110*00 // paint background //#define CMD_SWIPE 0b010010 010***1 //?? responsible for program 69 //#define CMD_CLS2 0b001010 0100000 //?? before background paint //#define CMD_FG 0b00**10 0101*00 // paint foreground //#define CMD_EMPTY 0b000010 0100001 // shifts pixels, removed bg, but not all of it // parameters #define BG_BLUE 0b00000000000100 #define BG_GREEN 0b00010000000000 #define BG_PERS 0b00100000000000 #define BG_PERS2 0b00000000000010 #define BG_RED 0b00000000001000 #define BG_WHITE 0b00110000000100 #define BG_OFF 0b00100000000000 #define FG_RED 0b00000000000100 #define FG_BLUE 0b00010000000000 #define FG_GREEN 0b00100000000000 #define FG_WHITE 0b00110000000100 #define FG_OFF 0b00100000000000 #define SHIFT_RED 0b00000000000100 #define SHIFT_BLUE 0b00000000000010 #define SHIFT_GREEN 0b00000000001000 #define SHIFT_WHITE 0b00000000001110 #define SWIPE_MYST1 0b10000000000000 #define SWIPE_MYST2 0b00110000000000 #define SWIPE_RED SHIFT_RED #define SWIPE_BLUE SHIFT_BLUE #define SWIPE_GREEN SHIFT_GREEN #define SWIPE_WHITE SHIFT_WHITE #define R CMD_FG | FG_RED #define B CMD_FG | FG_BLUE #define G CMD_FG | FG_GREEN #define W CMD_FG | FG_WHITE uint8_t wait; int pos = 0, pos2 = 10, pos3 = 16; int d = 1; int max = 160; int first = 0; #define ap(x) abs(159 - x) void pp(int p1, int p2, int p3) { for (int i = 0; i < 160; i++) { int c = 0; if (i == p1) c |= SHIFT_CRED; if (i == p2) c |= SHIFT_CGREEN; if (i == p3) c |= SHIFT_CBLUE; writeOne(CMD_SHIFT | c); } _delay_ms(10); } char buffer[160]; void loop() { while (Serial.read() != 0xFF); for (int i = 0; i < 160; i++) buffer[i] = Serial.read(); noInterrupts(); for (int i = 0; i < 160; i++) writeOne(CMD_SHIFT | buffer[i]); interrupts(); /* while (Serial.available()) { int c = CMD_SHIFT | (Serial.read() << 10); writeOne(c); }7 */ return; writeOne(CMD_SHIFT | SHIFT_CBLUE | SHIFT_BLUE); writeOne(CMD_SHIFT | SHIFT_BLUE ); writeOne(CMD_SHIFT | SHIFT_CGREEN | SHIFT_GREEN); writeOne(CMD_SHIFT | SHIFT_CGREEN | SHIFT_GREEN ); writeOne(CMD_SHIFT | SHIFT_CGREEN | SHIFT_GREEN ); writeOne(CMD_SHIFT | SHIFT_CGREEN | SHIFT_GREEN ); writeOne(CMD_SHIFT | SHIFT_GREEN ); writeOne(CMD_SHIFT | SHIFT_CRED | SHIFT_RED ); writeOne(CMD_SHIFT | SHIFT_CRED | SHIFT_RED ); writeOne(CMD_SHIFT | SHIFT_CRED | SHIFT_RED ); writeOne(CMD_SHIFT | SHIFT_CRED | SHIFT_RED ); writeOne(CMD_SHIFT | SHIFT_CRED | SHIFT_RED ); writeOne(CMD_SHIFT | SHIFT_BLUE ); writeOne(CMD_SHIFT | SHIFT_CBLUE | SHIFT_BLUE); writeOne(CMD_SHIFT | SHIFT_CBLUE | SHIFT_BLUE); writeOne(CMD_SHIFT | SHIFT_RED ); _delay_ms(5000); writeOne(CMD_SHIFT | SHIFT_BLUE); writeOne(CMD_SHIFT | SHIFT_BLUE); writeOne(CMD_SHIFT | SHIFT_BLUE); writeOne(CMD_SHIFT | SHIFT_BLUE); writeOne(CMD_SHIFT | SHIFT_BLUE); writeOne(CMD_SHIFT | SHIFT_BLUE); writeOne(CMD_SHIFT | SHIFT_BLUE); writeOne(CMD_SHIFT | SHIFT_BLUE); writeOne(CMD_SHIFT | SHIFT_BLUE); writeOne(CMD_SHIFT | SHIFT_BLUE); writeOne(CMD_SHIFT | SHIFT_BLUE); writeOne(CMD_SHIFT | SHIFT_BLUE); writeOne(CMD_SHIFT | SHIFT_BLUE); writeOne(CMD_SHIFT | SHIFT_BLUE); writeOne(CMD_SHIFT | SHIFT_BLUE); writeOne(CMD_SHIFT | SHIFT_BLUE); _delay_ms(5000); /* writeOne(CMD_SHIFT | SHIFT_CBLUE); _delay_ms(500); */ } // ? ? ? ? ? GG RR BB ? // DTI + 16 , 16 | 10 , 14 | 26 | 16 , 16 | 18 , 16 | 18 , 18 | 14 , 20 | 12 , 22 | 14 + // CKI | 16 , 16 , 10 | 14 , 26 , 16 | 16 , 18 | 16 , 18 | 18 , 14 | 20 , 12 | 22 , 14 | // ? ? ? // ? ? ? ? ? GG RR BB ? // DTI + 34 | 10 , 14 | 26 | 17 , 17 | 17 , 17 | 17 , 17 | 17 , 17 | 17 , 17 | 17 + // CKI | 34 , 10 | 14 , 26 , 17 | 17 , 17 | 17 , 17 | 17 , 17 | 17 , 17 | 17 , 17 | // ? ? ? #define _bit2(r, b, nops) if (C & (1 << b)) \ r##H(); \ \ else \ r##L(); \ \ nop##nops(); \ #define _bit(r, b, nops) if (r & (1 << b)) \ r##H(); \ \ else \ r##L(); \ \ nop##nops(); \ void writeOne(uint16_t C) { CL(); nop46(); _bit2(D, 6, 8); _bit2(C, 13, 18); _bit2(D, 5, 38); _bit2(D, 4, 15); _bit2(C, 12, 21); _bit2(D, 3, 21); _bit2(C, 11, 21); _bit2(D, 2, 21); _bit2(C, 10, 21); _bit2(D, 1, 21); _bit2(C, 9, 21); _bit2(D, 0, 21); _bit2(C, 8, 21); DH(); nop32(); CH(); _delay_us(DELAY); } inline void writeByte(uint8_t D, uint8_t C) { _bit(C, 7, 46); _bit(D, 7, 8); _bit(C, 6, 18); _bit(D, 6, 38); _bit(D, 5, 15); _bit(C, 5, 21); _bit(D, 4, 21); _bit(C, 4, 21); _bit(D, 3, 21); _bit(C, 3, 21); _bit(D, 2, 21); _bit(C, 2, 21); _bit(D, 1, 21); _bit(C, 1, 21); DH(); nop32(); CH(); } inline void writeByteCD(uint8_t C, uint8_t D) { writeByte(D, C); _delay_us(DELAY); } // volatile uint8_t times[] = { 32, 22, 26, 66, 36, 14, 34, 18, 16, 0xFF, 32, 24, 24, 36, 68, 20, 34, 16, 18, 0xFF }; // * 100.0ns< // volatile uint8_t cmds [] = { CL, DL, DH, DL, DH, DL, CH, CL, DH, CH, W0, CL, DL, DH, DL, DH, DL, CH, CL, DH, CH, W1 }; // volatile uint8_t times[] = { 32, 22, 26, 66, 36, 14, 34, 18, 16, 0xFF, 32, 24, 24, 36, 16, 16, 16, 37, 35, 16, 18, 0xFF }; // * 100.0 ns< // volatile uint8_t cmds [] = { CL, DL, DH, DL, DH, DL, CH, CL, DH, CH, W0, CL, DL, DH, DL, DH, BH, DL, CL, CH, CL, DH, CH, W1 }; // volatile uint8_t times[] = { 32, 22, 26, 66, 36, 14, 34, 18, 16, 0xFF, 32, 24, 24, 36, 34, 18, 70, 18, 16, 0xFF }; // * 100.0 ns< // volatile uint8_t cmds [] = { CL, DL, DH, DL, DH, DL, CH, CL, DH, CH, W0, CL, DL, DH, DL, DH, DL, CH, CL, DH, CH, W1 };