Raspberry Pi Pico 用の LCD 1.3 Waveshare のためのページ
(0)
(1)
- なるほどー。Arduino IDEのC言語では static void func(int a) { ... } みたいに、関数にstatic属性を付けるとうまくコンパイルできないことがあるんだなー。
- これがわからなくて30分くらい悩んでしまった(笑)。
- 書き方変更。
- [1]コンパイル済みのサンプルコードは動いた。
- [2]サンプルをソースからビルドする環境が用意できなかったので、初期化ルーチンを見よう見まねで作ってみた。
- [3]苦労したら、とりあえずコンパイルエラーが出ない程度にはなった。
- [4]さあ実行だ!・・・まあ当然だけど、見事にぶっ壊れて、picoに書き込むたびにArduino-IDEの再起動と、picoのBOTSEL押しながら再接続が必要になった。つらい。
- [5]なるほど、スタックを食いつぶしたせいでpicoがおかしくなっていたようだ。そのほか、picoをおかしくする重度のバグを直したら、IDEの再起動をしなくても平気になった。これではかどる!
- [6]しかしそれにしても画面には何も出ない。なんか出ないと前進しているのかどうかよくわからない。
- [7]お!ついになんか出たぞ!これはありがたい。・・・でも期待しているのとは違う・・・。
- [8]もしかしてエンディアンか?picoはビッグエンディアンじゃないのか??
- [9]エンディアンに依存しないように書き直したら・・・おお変わった!・・・うーん、まだおかしい。なんでそんな色になるんだよう。
- [10]な、なるほど・・・RGBではなく、BGRになっているっぽいな・・・。設定を直せば直るのだろうか。
- [11]適当にいじったら、RGBになった・・・かも?(オリジナルのソースコードのコメントの逆にしたらうまくいった!)
- [12]色については不満なし!しかし今度は座標系がおかしい。そういえばさっき、座標系のことが書いてあったな・・・。
- [13]座標系も直ったー。よっしゃー。
#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);
}