// Reset = PortB.4 // CS = PortB.0 (~SS) // GND = GND // SData = PortB.2 (MOSI) // SClk = PORTB.1 (SCK) #include #include #define CS 0 #define SCLK 1 #define SDATA 2 #define RESET 4 #define CMD 0 #define DATA 1 void delay5ms(void) { volatile int i; for(i=0; i<2200; i++); } void send(uint8_t data, uint8_t cd) { // CS auf Low setzen PORTB &= ~(0x01 << CS); // Kommando oder Daten? PORTB &= ~(0x01 << SCLK); if(cd == CMD) PORTB &= ~(0x01 << SDATA); else PORTB |= 0x01 << SDATA; PORTB |= 0x01 << SCLK; // 1. Bit (MSB) PORTB &= ~(0x01 << SCLK); if((data & 0x80) == 0x80) PORTB |= 0x01 << SDATA; else PORTB &= ~(0x01 << SDATA); PORTB |= 0x01 << SCLK; // 2. Bit (MSB) PORTB &= ~(0x01 << SCLK); if((data & 0x40) == 0x40) PORTB |= 0x01 << SDATA; else PORTB &= ~(0x01 << SDATA); PORTB |= 0x01 << SCLK; // 3. Bit (MSB) PORTB &= ~(0x01 << SCLK); if((data & 0x20) == 0x20) PORTB |= 0x01 << SDATA; else PORTB &= ~(0x01 << SDATA); PORTB |= 0x01 << SCLK; // 4. Bit (MSB) PORTB &= ~(0x01 << SCLK); if((data & 0x10) == 0x10) PORTB |= 0x01 << SDATA; else PORTB &= ~(0x01 << SDATA); PORTB |= 0x01 << SCLK; // 5. Bit (MSB) PORTB &= ~(0x01 << SCLK); if((data & 0x08) == 0x08) PORTB |= 0x01 << SDATA; else PORTB &= ~(0x01 << SDATA); PORTB |= 0x01 << SCLK; // 6. Bit (MSB) PORTB &= ~(0x01 << SCLK); if((data & 0x04) == 0x04) PORTB |= 0x01 << SDATA; else PORTB &= ~(0x01 << SDATA); PORTB |= 0x01 << SCLK; // 7. Bit (MSB) PORTB &= ~(0x01 << SCLK); if((data & 0x02) == 0x02) PORTB |= 0x01 << SDATA; else PORTB &= ~(0x01 << SDATA); PORTB |= 0x01 << SCLK; // 8. Bit (MSB) PORTB &= ~(0x01 << SCLK); if((data & 0x01) == 0x01) PORTB |= 0x01 << SDATA; else PORTB &= ~(0x01 << SDATA); PORTB |= 0x01 << SCLK; } void cs(void) { PORTB |= 0x01 << CS; // CS wieder auf 1 } int main(void) { uint16_t i; uint8_t s; DDRB = 0xFF; // PortB = Output // LCD Hardware Reset PORTB &= ~(0x01 << 4); delay5ms(); PORTB |= 0x01 << 4; PORTB |= 0x01 << CS; PORTB |= 0x01 << SCLK; PORTB |= 0x01 << SDATA; send(0x01, CMD); // LCD Software Reset cs(); delay5ms(); send(0xC6, CMD); // Initial Escape cs(); send(0xB9, CMD); // Refresh set send(0x00, DATA); cs(); send(0xB6, CMD); // Display Control send(128, DATA); send(128, DATA); send(129, DATA); send(84, DATA); send(69, DATA); send(82, DATA); send(67, DATA); cs(); send(0xB3, CMD); // Gray Scale Position send(1, DATA); send(2, DATA); send(4, DATA); send(8, DATA); send(16, DATA); send(30, DATA); send(40, DATA); send(50, DATA); send(60, DATA); send(70, DATA); send(80, DATA); send(90, DATA); send(100, DATA); send(110, DATA); send(127, DATA); cs(); send(0xB5, CMD); // Gamma Curve Set send(1, DATA); cs(); send(0xBE, CMD); // Power Control send(4, DATA); cs(); send(0x11, CMD); // Sleep out cs(); send(0xB7, CMD); // Temperature gradient set for(i=0; i<14; i++) { send(0, DATA); } cs(); send(0x03, CMD); // Booster Voltage ON cs(); for(i=0; i<8; i++) { // Booster Voltage stabilisieren lassen delay5ms(); } send(0x20, CMD); // Inversion control cs(); send(0x25, CMD); // Write contrast send(63, DATA); cs(); send(0x2C, CMD); // Memory Write // roter Balken s=0; for(i=0; i<1176; i++) { if(s == 0) send(15, DATA); else if(s == 1) send(240, DATA); else if(s == 2) send(255, DATA); if(++s == 3) s = 0; } // grüner Balken s=0; for(i=0; i<1176; i++) { if(s == 0) send(240, DATA); else if(s == 1) send(255, DATA); else if(s == 2) send(15, DATA); if(++s == 3) s = 0; } // blauer Balken s=0; for(i=0; i<1176; i++) { if(s == 0) send(255, DATA); else if(s == 1) send(15, DATA); else if(s == 2) send(240, DATA); if(++s == 3) s = 0; } // gelber Balken s=0; for(i=0; i<1176; i++) { if(s == 0) send(0, DATA); else if(s == 1) send(240, DATA); else if(s == 2) send(15, DATA); if(++s == 3) s = 0; } // magenta Balken s=0; for(i=0; i<1176; i++) { if(s == 0) send(15, DATA); else if(s == 1) send(0, DATA); else if(s == 2) send(240, DATA); if(++s == 3) s = 0; } // cyan Balken s=0; for(i=0; i<1176; i++) { if(s == 0) send(240, DATA); else if(s == 1) send(15, DATA); else if(s == 2) send(0, DATA); if(++s == 3) s = 0; } // weißer Balken for(i=0; i<1176; i++) { send(0, DATA); } // schwarzer Balken for(i=0; i<1617; i++) { send(255, DATA); } cs(); send(0x29, CMD); // Display On cs(); while(1) {} return 0; }