コード例 #1
0
uint32_t lcd_setbias(uint32_t o)
{
  uint32_t param, w, h;

  #define MEM_Y   (7) //MY row address order
  #define MEM_X   (6) //MX column address order 
  #define MEM_V   (5) //MV row / column exchange 
  #define MEM_L   (4) //ML vertical refresh order
  #define MEM_H   (2) //MH horizontal refresh order
  #define MEM_BGR (3) //RGB-BGR Order 

  switch(o)
  {
    default:
    case 0:
    //case 36:
    //case 360:
      w     = LCD_WIDTH;
      h     = LCD_HEIGHT;
      param = (1<<MEM_BGR) | (1<<MEM_X) | (1<<MEM_Y);
      break;
    case 9:
    case 90:
      w     = LCD_HEIGHT;
      h     = LCD_WIDTH;
      param = (1<<MEM_BGR) | (1<<MEM_X) | (1<<MEM_V);
      break;
    case 18:
    case 180:
      w     = LCD_WIDTH;
      h     = LCD_HEIGHT;
      param = (1<<MEM_BGR) | (1<<MEM_L);
      break;
    case 27:
    case 270:
    case 14: //270&0xFF
      w     = LCD_HEIGHT;
      h     = LCD_WIDTH;
      param = (1<<MEM_BGR) | (1<<MEM_Y) | (1<<MEM_V);
      break;
  }

  lcd_enable();

  lcd_wrcmd8(LCD_CMD_MEMACCESS_CTRL);
  lcd_wrdata8(param);

  lcd_setarea(0, 0, w-1, h-1);

  lcd_disable();

  return (w<<16) | (h<<0);
}
コード例 #2
0
void lcd_reset(void)
{
  uint32_t c, i, j;
  uint8_t initdata[] = 
  {
    //0x40| 1, LCD_CMD_RESET,
    //0xC0|60,
    //0xC0|60,
    0x40| 1, LCD_CMD_DISPLAY_OFF,
    0xC0|20,
    0x40| 1, LCD_CMD_POWER_CTRLB,
    0x80| 3, 0x00, 0x83, 0x30, //0x83 0x81 0xAA
    0x40| 1, LCD_CMD_POWERON_SEQ_CTRL,
    0x80| 4, 0x64, 0x03, 0x12, 0x81, //0x64 0x67
    0x40| 1, LCD_CMD_DRV_TIMING_CTRLA,
    0x80| 3, 0x85, 0x01, 0x79, //0x79 0x78
    0x40| 1, LCD_CMD_POWER_CTRLA,
    0x80| 5, 0x39, 0X2C, 0x00, 0x34, 0x02,
    0x40| 1, LCD_CMD_PUMP_RATIO_CTRL,
    0x80| 1, 0x20,
    0x40| 1, LCD_CMD_DRV_TIMING_CTRLB,
    0x80| 2, 0x00, 0x00,
    0x40| 1, LCD_CMD_POWER_CTRL1,
    0x80| 1, 0x26, //0x26 0x25
    0x40| 1, LCD_CMD_POWER_CTRL2,
    0x80| 1, 0x11,
    0x40| 1, LCD_CMD_VCOM_CTRL1,
    0x80| 2, 0x35, 0x3E,
    0x40| 1, LCD_CMD_VCOM_CTRL2,
    0x80| 1, 0xBE, //0xBE 0x94
    0x40| 1, LCD_CMD_FRAME_CTRL,
    0x80| 2, 0x00, 0x1B, //0x1B 0x70
    0x40| 1, LCD_CMD_ENABLE_3G,
    0x80| 1, 0x08, //0x08 0x00
    0x40| 1, LCD_CMD_GAMMA,
    0x80| 1, 0x01, //G2.2
    0x40| 1, LCD_CMD_POS_GAMMA,
    0x80|15, 0x1F, 0x1A, 0x18, 0x0A, 0x0F, 0x06, 0x45, 0x87, 0x32, 0x0A, 0x07, 0x02, 0x07, 0x05, 0x00,
  //0x80|15, 0x0F, 0x1A, 0x18, 0x0A, 0x0F, 0x06, 0x45, 0x87, 0x32, 0x0A, 0x07, 0x02, 0x07, 0x05, 0x00,
    0x40| 1, LCD_CMD_NEG_GAMMA,
    0x80|15, 0x00, 0x25, 0x27, 0x05, 0x10, 0x09, 0x3A, 0x78, 0x4D, 0x05, 0x18, 0x0D, 0x38, 0x3A, 0x1F,
  //0x80|15, 0x00, 0x25, 0x27, 0x05, 0x10, 0x09, 0x3A, 0x78, 0x4D, 0x05, 0x18, 0x0D, 0x38, 0x3A, 0x0F,
    0x40| 1, LCD_CMD_DISPLAY_CTRL,
    0x80| 4, 0x0A, 0x82, 0x27, 0x00,
    0x40| 1, LCD_CMD_ENTRY_MODE,
    0x80| 1, 0x07,
    0x40| 1, LCD_CMD_PIXEL_FORMAT,
    0x80| 1, 0x55, //16bit
    0x40| 1, LCD_CMD_MEMACCESS_CTRL,
    0x80| 1, (1<<MEM_BGR) | (1<<MEM_X) | (1<<MEM_Y),
    0x40| 1, LCD_CMD_COLUMN,
    0x80| 2, 0x00, 0x00,
    0x80| 2, ((LCD_HEIGHT-1)>>8)&0xFF, (LCD_HEIGHT-1)&0xFF,
    0x40| 1, LCD_CMD_PAGE,
    0x80| 2, 0x00, 0x00,
    0x80| 2, ((LCD_WIDTH-1)>>8)&0xFF, (LCD_WIDTH-1)&0xFF,
    0x40| 1, LCD_CMD_SLEEPOUT,
    0xC0|60,
    0xC0|60,
    0x40| 1, LCD_CMD_DISPLAY_ON,
    0xC0|20,
  };

  //init pins
  INIT_PINS();

  //hardware reset
  GPIO_CLRPIN(LCD_PORT, RST_PIN);
  delay_ms(20);
  GPIO_SETPIN(LCD_PORT, RST_PIN);
  delay_ms(120);

  lcd_enable();

  //send init commands and data
  for(i=0; i<sizeof(initdata);)
  {
    c = initdata[i++];
    switch(c&0xC0)
    {
      case 0x40: //command
        for(j=c&0x3F; j!=0; j--)
        {
          c = initdata[i++];
          lcd_wrcmd8(c);
        }
        break;

      case 0x80: //data
        for(j=c&0x3F; j!=0; j--)
        {
          c = initdata[i++];
          lcd_wrdata8(c);
        }
        break;

      case 0xC0: //delay
        delay_ms(c&0x3F);
        break;
    }
  }

  //clear display buffer
  lcd_drawstart();
  for(i=(LCD_WIDTH*LCD_HEIGHT); i!=0; i--)
  {
    lcd_draw(0);
  }
  lcd_drawstop();

  lcd_disable();

  return;
}
コード例 #3
0
ファイル: lcd.c プロジェクト: horazont/hint
void lcd_init()
{
    const uint8_t MEM_BGR = 3;
    const uint8_t MEM_X = 6;
    const uint8_t MEM_Y = 7;

    uint8_t init_sequence[] = {
        VCMD_COMMAND | 1, LCD_CMD_RESET,
        VCMD_SLEEP   |20,
        VCMD_COMMAND | 1, LCD_CMD_DISPLAY_OFF,
        VCMD_SLEEP   |20,
        VCMD_COMMAND | 1, LCD_CMD_POWER_CTRLB,
        VCMD_DATA    | 3, 0x00, 0x83, 0x30, //0x83 0x81 0xAA
        VCMD_COMMAND | 1, LCD_CMD_POWERON_SEQ_CTRL,
        VCMD_DATA    | 4, 0x64, 0x03, 0x12, 0x81, //0x64 0x67
        VCMD_COMMAND | 1, LCD_CMD_DRV_TIMING_CTRLA,
        VCMD_DATA    | 3, 0x85, 0x01, 0x79, //0x79 0x78
        VCMD_COMMAND | 1, LCD_CMD_POWER_CTRLA,
        VCMD_DATA    | 5, 0x39, 0X2C, 0x00, 0x34, 0x02,
        VCMD_COMMAND | 1, LCD_CMD_PUMP_RATIO_CTRL,
        VCMD_DATA    | 1, 0x20,
        VCMD_COMMAND | 1, LCD_CMD_DRV_TIMING_CTRLB,
        VCMD_DATA    | 2, 0x00, 0x00,
        VCMD_COMMAND | 1, LCD_CMD_POWER_CTRL1,
        VCMD_DATA    | 1, 0x26, //0x26 0x25
        VCMD_COMMAND | 1, LCD_CMD_POWER_CTRL2,
        VCMD_DATA    | 1, 0x11,
        VCMD_COMMAND | 1, LCD_CMD_VCOM_CTRL1,
        VCMD_DATA    | 2, 0x35, 0x3E,
        VCMD_COMMAND | 1, LCD_CMD_VCOM_CTRL2,
        VCMD_DATA    | 1, 0xBE, //0xBE 0x94
        VCMD_COMMAND | 1, LCD_CMD_FRAME_CTRL,
        VCMD_DATA    | 2, 0x00, 0x1B, //0x1B 0x70
        VCMD_COMMAND | 1, LCD_CMD_ENABLE_3G,
        VCMD_DATA    | 1, 0x08, //0x08 0x00
        VCMD_COMMAND | 1, LCD_CMD_GAMMA,
        VCMD_DATA    | 1, 0x01, //G2.2
        VCMD_COMMAND | 1, LCD_CMD_POS_GAMMA,
        VCMD_DATA    |15, 0x1F, 0x1A, 0x18, 0x0A, 0x0F, 0x06, 0x45, 0x87, 0x32, 0x0A, 0x07, 0x02, 0x07, 0x05, 0x00,
        VCMD_COMMAND | 1, LCD_CMD_NEG_GAMMA,
        VCMD_DATA    |15, 0x00, 0x25, 0x27, 0x05, 0x10, 0x09, 0x3A, 0x78, 0x4D, 0x05, 0x18, 0x0D, 0x38, 0x3A, 0x1F,
        VCMD_COMMAND | 1, LCD_CMD_DISPLAY_CTRL,
        VCMD_DATA    | 4, 0x0A, 0x82, 0x27, 0x00,
        VCMD_COMMAND | 1, LCD_CMD_ENTRY_MODE,
        VCMD_DATA    | 1, 0x07,
        VCMD_COMMAND | 1, LCD_CMD_PIXEL_FORMAT,
        VCMD_DATA    | 1, 0x55, //16bit
        VCMD_COMMAND | 1, LCD_CMD_MEMACCESS_CTRL,
        VCMD_DATA    | 1, (1<<MEM_BGR) | (1<<MEM_X) | (1<<MEM_Y),
        VCMD_COMMAND | 1, LCD_CMD_COLUMN,
        VCMD_DATA    | 2, 0x00, 0x00,
        VCMD_DATA    | 2, ((LCD_HEIGHT-1)>>8)&0xFF, (LCD_HEIGHT-1)&0xFF,
        VCMD_COMMAND | 1, LCD_CMD_PAGE,
        VCMD_DATA    | 2, 0x00, 0x00,
        VCMD_DATA    | 2, ((LCD_WIDTH-1)>>8)&0xFF, (LCD_WIDTH-1)&0xFF,
        VCMD_COMMAND | 1, LCD_CMD_SLEEPOUT,
        VCMD_SLEEP   |60,
        VCMD_SLEEP   |60,
        VCMD_COMMAND | 1, LCD_CMD_DISPLAY_ON,
        VCMD_SLEEP   |20,
    };

    DISABLE_IRQ();

    // initialize pins
    IOCON_PIO2_0  &= ~IOCON_PIO2_0_FUNC_MASK;
    IOCON_PIO2_1  &= ~IOCON_PIO2_1_FUNC_MASK;
    IOCON_PIO2_2  &= ~IOCON_PIO2_2_FUNC_MASK;
    IOCON_PIO2_3  &= ~IOCON_PIO2_3_FUNC_MASK;
    IOCON_PIO2_4  &= ~IOCON_PIO2_4_FUNC_MASK;
    IOCON_PIO2_5  &= ~IOCON_PIO2_5_FUNC_MASK;
    IOCON_PIO2_6  &= ~IOCON_PIO2_6_FUNC_MASK;
    IOCON_PIO2_7  &= ~IOCON_PIO2_7_FUNC_MASK;
    IOCON_PIO2_8  &= ~IOCON_PIO2_8_FUNC_MASK;
    IOCON_PIO2_9  &= ~IOCON_PIO2_9_FUNC_MASK;
    IOCON_PIO2_10 &= ~IOCON_PIO2_10_FUNC_MASK;
    IOCON_PIO2_11 &= ~IOCON_PIO2_11_FUNC_MASK;

    IOCON_PIO3_5  &= ~IOCON_PIO3_5_FUNC_MASK;

    // set all 12 pins to output mode
    GPIO_GPIO2DIR |= 0xFFF;
    // set all pins high
    LCD_GPIO |= 0xFFF;

    // set pin 5 of gpio 3 to output mode
    GPIO_GPIO3DIR |= LCD_RD_MASK;
    GPIO_GPIO3DATA |= LCD_RD_MASK;

    ENABLE_IRQ();

    // trigger hard-reset
    LCD_MASKED_GPIO(LCD_RST_MASK, 0);
    delay_ms(20);
    LCD_MASKED_GPIO(LCD_RST_MASK, LCD_RST_MASK);
    delay_ms(120);

    lcd_enable();
    delay_ms(1);

    for (unsigned int i = 0; i < sizeof(init_sequence);) {
        uint8_t instruction = init_sequence[i++];
        switch (instruction & 0xC0) {
        case VCMD_COMMAND:
        {
            //~ printf("cmd 0x%02x", instruction & 0x3f);
            for (int j = (instruction & 0x3f); j > 0; j--) {
                uint8_t data = init_sequence[i++];
                //~ printf(" 0x%02x", data);
                lcd_wrcmd8(data);
            }
            //~ printf("\n");
            break;
        }
        case VCMD_DATA:
        {
            //~ printf("data 0x%02x\n", instruction & 0x3f);
            for (int j = (instruction & 0x3f); j > 0; j--) {
                uint8_t data = init_sequence[i++];
                //~ printf(" 0x%02x", data);
                lcd_wrdata8(data);
            }
            //~ printf("\n");
            break;
        }
        case VCMD_SLEEP:
        {
            //~ printf("sleep %d\n", instruction & 0x3f);
            delay_ms(instruction & 0x3f);
            break;
        }
        default:
            // cannot happen :)
            continue;
        };
    }

    lcd_drawstart();
    for (int i = (LCD_WIDTH*LCD_HEIGHT/8); i > 0; i--) {
        lcd_draw(0);
        lcd_draw(0);
        lcd_draw(0);
        lcd_draw(0);
        lcd_draw(0);
        lcd_draw(0);
        lcd_draw(0);
        lcd_draw(0);
    }
    lcd_drawstop();

    lcd_disable();
}