Raspberry Pi Pico 用の LCD 1.3 Waveshare のためのページ

(0)

(1)

#define LCD_RST_PIN  12
#define LCD_DC_PIN   8
#define LCD_BL_PIN   13
#define LCD_CS_PIN   9
#define LCD_CLK_PIN  10
#define LCD_MOSI_PIN 11
#define LCD_SCL_PIN  7
#define LCD_SDA_PIN  6

void GPIO_Init()
{
  pinMode(LCD_RST_PIN, OUTPUT);
  pinMode(LCD_DC_PIN, OUTPUT);
  pinMode(LCD_CS_PIN, OUTPUT);
  pinMode(LCD_BL_PIN, OUTPUT);
  digitalWrite(LCD_CS_PIN, 1);
  digitalWrite(LCD_DC_PIN, 0);
  digitalWrite(LCD_BL_PIN, 1);
}

int slice_num;

void Module_Init()
{
  _spi_init(spi1, 10000 * 1000);
  gpio_set_function(LCD_CLK_PIN, GPIO_FUNC_SPI);
  gpio_set_function(LCD_MOSI_PIN, GPIO_FUNC_SPI);
 
  // GPIO Config
  GPIO_Init();

  // PWM Config
  gpio_set_function(LCD_BL_PIN, GPIO_FUNC_PWM);
  slice_num = pwm_gpio_to_slice_num(LCD_BL_PIN);
  pwm_set_wrap(slice_num, 100);
  pwm_set_chan_level(slice_num, PWM_CHAN_B, 1);  // setPwm(1);
  pwm_set_clkdiv(slice_num,50);
  pwm_set_enabled(slice_num, true);
  
  //I2C Config
  _i2c_init(i2c1,300*1000);
  gpio_set_function(LCD_SDA_PIN,GPIO_FUNC_I2C);
  gpio_set_function(LCD_SCL_PIN,GPIO_FUNC_I2C);
  gpio_pull_up(LCD_SDA_PIN);
  gpio_pull_up(LCD_SCL_PIN);
}

void LCD_1IN3_Reset()
{
  digitalWrite(LCD_RST_PIN, 1);
  delay(100);
  digitalWrite(LCD_RST_PIN, 0);
  delay(100);
  digitalWrite(LCD_RST_PIN, 1);
  delay(100);
}

void LCD_1IN3_SendCommand(uint8_t dat)
{
  digitalWrite(LCD_DC_PIN, 0);
  digitalWrite(LCD_CS_PIN, 0);
  spi_write_blocking(spi1, &dat, 1);
  digitalWrite(LCD_CS_PIN, 1);
}

void LCD_1IN3_SendData_8Bit(int dat)
{
  uint8_t a[1];
  a[0] = dat & 0xff;
  digitalWrite(LCD_DC_PIN, 1);
  digitalWrite(LCD_CS_PIN, 0);
  spi_write_blocking(spi1, a, 1);
  digitalWrite(LCD_CS_PIN, 1);
}

void LCD_1IN3_SentData_16Bit(int dat)
{
  digitalWrite(LCD_DC_PIN, 1);
  digitalWrite(LCD_CS_PIN, 0);
  uint8_t a[2];
  a[0] = (dat >> 8) & 0xff;
  a[1] = dat & 0xff;
  spi_write_blocking(spi1, a, 2);
  digitalWrite(LCD_CS_PIN, 1);
}

void LCD_1IN3_InitReg()
{
  LCD_1IN3_SendCommand(0x3A);
  LCD_1IN3_SendData_8Bit(0x05);

  LCD_1IN3_SendCommand(0xB2);
  LCD_1IN3_SendData_8Bit(0x0C);
  LCD_1IN3_SendData_8Bit(0x0C);
  LCD_1IN3_SendData_8Bit(0x00);
  LCD_1IN3_SendData_8Bit(0x33);
  LCD_1IN3_SendData_8Bit(0x33);

  LCD_1IN3_SendCommand(0xB7);  //Gate Control
  LCD_1IN3_SendData_8Bit(0x35);

  LCD_1IN3_SendCommand(0xBB);  //VCOM Setting
  LCD_1IN3_SendData_8Bit(0x19);

  LCD_1IN3_SendCommand(0xC0); //LCM Control     
  LCD_1IN3_SendData_8Bit(0x2C);

  LCD_1IN3_SendCommand(0xC2);  //VDV and VRH Command Enable
  LCD_1IN3_SendData_8Bit(0x01);
  LCD_1IN3_SendCommand(0xC3);  //VRH Set
  LCD_1IN3_SendData_8Bit(0x12);
  LCD_1IN3_SendCommand(0xC4);  //VDV Set
  LCD_1IN3_SendData_8Bit(0x20);

  LCD_1IN3_SendCommand(0xC6);  //Frame Rate Control in Normal Mode
  LCD_1IN3_SendData_8Bit(0x0F);
 
  LCD_1IN3_SendCommand(0xD0);  // Power Control 1
  LCD_1IN3_SendData_8Bit(0xA4);
  LCD_1IN3_SendData_8Bit(0xA1);

  LCD_1IN3_SendCommand(0xE0);  //Positive Voltage Gamma Control
  LCD_1IN3_SendData_8Bit(0xD0);
  LCD_1IN3_SendData_8Bit(0x04);
  LCD_1IN3_SendData_8Bit(0x0D);
  LCD_1IN3_SendData_8Bit(0x11);
  LCD_1IN3_SendData_8Bit(0x13);
  LCD_1IN3_SendData_8Bit(0x2B);
  LCD_1IN3_SendData_8Bit(0x3F);
  LCD_1IN3_SendData_8Bit(0x54);
  LCD_1IN3_SendData_8Bit(0x4C);
  LCD_1IN3_SendData_8Bit(0x18);
  LCD_1IN3_SendData_8Bit(0x0D);
  LCD_1IN3_SendData_8Bit(0x0B);
  LCD_1IN3_SendData_8Bit(0x1F);
  LCD_1IN3_SendData_8Bit(0x23);

  LCD_1IN3_SendCommand(0xE1);  //Negative Voltage Gamma Control
  LCD_1IN3_SendData_8Bit(0xD0);
  LCD_1IN3_SendData_8Bit(0x04);
  LCD_1IN3_SendData_8Bit(0x0C);
  LCD_1IN3_SendData_8Bit(0x11);
  LCD_1IN3_SendData_8Bit(0x13);
  LCD_1IN3_SendData_8Bit(0x2C);
  LCD_1IN3_SendData_8Bit(0x3F);
  LCD_1IN3_SendData_8Bit(0x44);
  LCD_1IN3_SendData_8Bit(0x51);
  LCD_1IN3_SendData_8Bit(0x2F);
  LCD_1IN3_SendData_8Bit(0x1F);
  LCD_1IN3_SendData_8Bit(0x1F);
  LCD_1IN3_SendData_8Bit(0x20);
  LCD_1IN3_SendData_8Bit(0x23);

  LCD_1IN3_SendCommand(0x21);  //Display Inversion On
  LCD_1IN3_SendCommand(0x11);  //Sleep Out
  LCD_1IN3_SendCommand(0x29);  //Display On
}

void LCD_1IN3_Init()
{
  pwm_set_chan_level(slice_num, PWM_CHAN_B, 90); // setPwm(90);
  //Hardware reset
  LCD_1IN3_Reset();

  //Set the resolution and scanning method of the screen
  LCD_1IN3_SendCommand(0x36); //MX, MY, RGB mode
  LCD_1IN3_SendData_8Bit(0x70);	//0x08 set RGB
 
  //Set the initialization register
  LCD_1IN3_InitReg();
}

uint16_t col(int r, int g, int b)
// r5:g6:b5 形式を計算してエンディアンをひっくり返す.
{
  return (b << 8 | g << 13 | g >> 3 | r << 3) & 0xffff;
}

void bitblt(int sx, int sy, int x0, int y0, uint16_t *buf, int xBufSiz)
{
  LCD_1IN3_SendCommand(0x2A);
  LCD_1IN3_SendData_8Bit(0x00);
  LCD_1IN3_SendData_8Bit(x0);
  LCD_1IN3_SendData_8Bit(0x00);
  LCD_1IN3_SendData_8Bit(x0 + sx - 1);

  //set the Y coordinates
  LCD_1IN3_SendCommand(0x2B);
  LCD_1IN3_SendData_8Bit(0x00);
  LCD_1IN3_SendData_8Bit(y0);
  LCD_1IN3_SendData_8Bit(0x00);
  LCD_1IN3_SendData_8Bit(y0 + sy - 1);

  LCD_1IN3_SendCommand(0X2C);
  digitalWrite(LCD_DC_PIN, 1);
  digitalWrite(LCD_CS_PIN, 0);
  int i, j;
  for (i = 0; i < sy; i++) {
    spi_write_blocking(spi1, (uint8_t *) buf, sx * 2);
    buf += xBufSiz;
  }
  digitalWrite(LCD_CS_PIN, 1);
  LCD_1IN3_SendCommand(0X29);
}

void setup()
{
  delay(100);
  Module_Init();
  pwm_set_chan_level(slice_num, PWM_CHAN_B, 50);  // setPwm(50);
  LCD_1IN3_Init();
  uint16_t *buf = (uint16_t *) malloc(240 * 240 * 2);
  int x, y, i = 0;
  for (y = 0; y < 240; y++) {
    for (x = 0; x < 240; x++) {
      buf[i++] = buf[i++] = col((y + 144) / 12, (x + 144) / 6, 0); 
    }
  }
  bitblt(240, 240, 0, 0, buf, 240);
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(1000);
}

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS