/* COLORS */ #define BLACK 0xFFFF #define WHITE 0x0000 #define GREY 0xF800 #define GREEN 0x7E0 /* Comand-Pins */ #define LCD_CS_BIT 2 #define LCD_RS_BIT 3 #define LCD_WR_BIT 4 #define LCD_RD_BIT 5 #define LCD_RESET_BIT 6 /* Set Comand-Pins */ #define LCD_CS_LOW PORTE.OUT &= ~(1 << LCD_CS_BIT) #define LCD_CS_HIGH PORTE.OUT |= 1 << LCD_CS_BIT #define LCD_RS_LOW PORTE.OUT &= ~(1 << LCD_RS_BIT) #define LCD_RS_HIGH PORTE.OUT |= 1 << LCD_RS_BIT #define LCD_WR_LOW PORTE.OUT &= ~(1 << LCD_WR_BIT) #define LCD_WR_HIGH PORTE.OUT |= 1 << LCD_WR_BIT #define LCD_RD_LOW PORTE.OUT &= ~(1 << LCD_RD_BIT) #define LCD_RD_HIGH PORTE.OUT |= 1 << LCD_RD_BIT #define LCD_RESET_LOW PORTD.OUT &= ~(1 << LCD_RESET_BIT) #define LCD_RESET_HIGH PORTD.OUT |= 1 << LCD_RESET_BIT /* Data-Pins */ #define LCD_DATA_PORT PORTB.OUT #define LCD_DATA_PIN PORTB.IN #define LCD_DATA_OUT PORTB.DIR = 0xFF #define LCD_DATA_IN PORTB.DIR = 0 /********************************************/ void LCD_WR_Trigger() { _delay_us(1); LCD_WR_LOW; _delay_us(1); LCD_WR_HIGH; } /********************************************/ uint8_t LCD_RD_Trigger() { _delay_us(1); LCD_RD_LOW; uint8_t value = LCD_DATA_PIN; _delay_us(1); LCD_RD_HIGH; return value; } /********************************************/ uint16_t LCD_RD_Trigger16() // 16bit { uint16_t value = LCD_RD_Trigger() * 256; value += LCD_RD_Trigger(); return value; } /********************************************/ void LCD_WriteCMD (uint8_t value) { LCD_RS_LOW; /* DC low: command DC high: data */ LCD_CS_LOW; LCD_DATA_PORT = value; LCD_WR_Trigger(); LCD_CS_HIGH; } /********************************************/ void LCD_WriteData (uint8_t value) { LCD_RS_HIGH; /* DC low: command DC high: data */ LCD_CS_LOW; LCD_DATA_PORT = value; LCD_WR_Trigger(); LCD_CS_HIGH; } /********************************************/ void LCD_Write16 (uint16_t value) { LCD_RS_HIGH; /* RS low: command RS high: data */ LCD_CS_LOW; LCD_DATA_PORT = value >> 8; LCD_WR_Trigger(); LCD_DATA_PORT = value; LCD_WR_Trigger(); LCD_CS_HIGH; } /********************************************/ void LCD_WriteReg (uint8_t address, uint16_t value) { LCD_WriteCMD(address); LCD_Write16(value); } uint16_t LCD_Name EEMEM = 12345; uint16_t LCD_Name1 EEMEM = 12345; uint16_t LCD_Name2 EEMEM = 12345; void Read_Reg(uint8_t address) { LCD_RS_HIGH; LCD_CS_LOW; LCD_DATA_OUT; LCD_DATA_PORT = address; LCD_WR_Trigger(); LCD_DATA_IN; uint16_t value = LCD_RD_Trigger16(); eeprom_write_word(LCD_Name, value); value = LCD_RD_Trigger16(); eeprom_write_word(LCD_Name1, value); value = LCD_RD_Trigger16(); eeprom_write_word(LCD_Name2, value); LCD_CS_HIGH; LCD_DATA_OUT; } /********************************************/ void TFT_Set_XYRange (uint16_t xstart, uint16_t xend, uint16_t ystart, uint16_t yend) { LCD_WriteCMD (0x2A); // column addr set LCD_Write16 (xstart); LCD_Write16 (xend); LCD_WriteCMD (0x2B); // row addr set LCD_Write16 (ystart); LCD_Write16 (yend); } /********************************************/ void TFT_Draw_Rectangle(uint16_t xstart, uint16_t xend, uint16_t ystart, uint16_t yend, uint32_t color) { TFT_Set_XYRange (xstart, xend, ystart, yend); LCD_WriteCMD (0x2C); // memory write uint32_t am_pixel = (xend - xstart) * (yend - ystart); while(am_pixel--) LCD_Write16(color); } /********************************************/ int Init_LCD(void) { // Initializing Outputs PORTE.DIR |= (1 << LCD_CS_BIT) | (1 << LCD_RS_BIT) | (1 << LCD_WR_BIT) | (1 << LCD_RD_BIT); PORTD.DIR |= (1 << LCD_RESET_BIT); LCD_CS_HIGH; LCD_WR_HIGH; LCD_RD_HIGH; LCD_RS_HIGH; LCD_RESET_HIGH; LCD_DATA_OUT; // Reset ILI LCD_RESET_HIGH; _delay_ms(100); LCD_RESET_LOW; _delay_ms(100); LCD_RESET_HIGH; _delay_ms(100); LCD_WriteReg(0x0001, 0x0100); // Von oben nach unten malen LCD_WriteReg(0x0002, 0x0700); // Line inversion (?) LCD_WriteReg(0x0003, 0xD030); // 1100 0000 0011 0000 (0x1030) // 3x6-bit Übertragung, GRAM-Counter beide aufwärts LCD_WriteReg(0x0004, 0x0000); // Resizing LCD_WriteReg(0x0008, 0x0202); // Front Porch and Back Porch (?) (have to be set!) LCD_WriteReg(0x0009, 0x0000); // Display Control (?) LCD_WriteReg(0x000a, 0x0000); // Display Control (?) LCD_WriteReg(0x000c, 0x0000); // Display Control (?) LCD_WriteReg(0x000d, 0x0000); // Display Control (?) LCD_WriteReg(0x000f, 0x0000); // Display Control (?) LCD_WriteReg(0x0010, 0x0000); // Sleep Mode/Stand By -> power savings LCD_WriteReg(0x0011, 0x0000); // Power Control LCD_WriteReg(0x0012, 0x0000); // Power Control LCD_WriteReg(0x0013, 0x0000); // Power Control _delay_ms(200); LCD_WriteReg(0x0010, 0x17b0); // Power Control LCD_WriteReg(0x0011, 0x0037); // Power Control LCD_WriteReg(0x0012, 0x0138); // Power Control LCD_WriteReg(0x0013, 0x1700); // Power Control _delay_ms(200); LCD_WriteReg(0x0029, 0x000d); // Internal VcomH Voltage: VREG1OUT * 0,75 LCD_WriteReg(0x0020, 0x0000); // Startaddress for running throw picture (0,0) LCD_WriteReg(0x0021, 0x0000); // Startaddress for running throw picture (0,0) LCD_WriteReg(0x0030,0x0004); LCD_WriteReg(0x0031,0x0307); LCD_WriteReg(0x0032,0x0002);//0006 LCD_WriteReg(0x0035,0x0206); LCD_WriteReg(0x0036,0x0408); LCD_WriteReg(0x0037,0x0507); LCD_WriteReg(0x0038,0x0204);//0200 LCD_WriteReg(0x003C,0x0405);//0504 LCD_WriteReg(0x003D,0x0F02); LCD_WriteReg(0x0050, 0x0000); // Setting Window position to all LCD_WriteReg(0x0051, 0x00ef); // Setting Window position to all LCD_WriteReg(0x0052, 0x0000); // Setting Window position to all LCD_WriteReg(0x0053, 0x013f); // Setting Window position to all LCD_WriteReg(0x0060, 0x2700); // Setting Scan Start Position LCD_WriteReg(0x0061, 0x0001); // Source Driver Output Level in non-display area, Scanning Direction, Greyscaleinversion = 1 LCD_WriteReg(0x006a, 0x0000); // no vertical scroll LCD_WriteReg(0x0090, 0x0010); // Synchronising speed of ili9325 display operations LCD_WriteReg(0x0092, 0x0000); // wie 90 LCD_WriteReg(0x0095, 0x0120); // 0x0101 bad value -> (?) LCD_WriteReg(0x0097, 0x0000); // (?) LCD_WriteReg(0x0007, 0x016B); // no partial image, basee image is displayed, Display on, 8-color-display mode, and normal display! LCD_WriteReg(0x003A, 0x0101); Read_Reg(0x0); TFT_Draw_Rectangle(0, 0b1111111, 0, 0b1111111, BLACK); while(1); }