1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

RaspberryPi Picoに液晶モジュールを付けて使ってみた

Posted at

の続き

色定義

液晶に色付きの表示をするために色コードを作ろうとサンプルコードを確認すると、色の設定は以下のような値になっていました。

        self.red   =   0x07E0
        self.green =   0x001f
        self.blue  =   0xf800

よく見ると普通のRGB888やRGB565だと

コード(RGB888) コード(RGB565)
red 0x00ff0000 0xf800
green 0x0000ff00 0x07e0
blue 0x000000ff 0x001f

になるはずなのに、ソースコードだと以下のような16進で定義されていて2進に直すと以下のような並びでした。

コード(16進) コード(2進)
red 0x07e0 0000011111100000
green 0x001f 0000000000011111
blue 0xf800 1111100000000000

並びと情報量を考えるとBRG565になりますね。
色のデータというとRGBやYMC、或いはYUVは扱ったことがあったのですが、BRGは初めてでした。

ということで、RGB888のデータをR/G/Bに分解して以下の式に入れてBRG565のデータを使って色を表示しました。

# Convert RGB888 to BRG565
brg = ((blue & 0xf8) << 8) | ((red & 0xfc) << 3) | (green >> 3)

色々と色データを使って表示させてみましたが、色が濃い感じでイメージした色にならなかったです。(^^;;

キー入力

サンプルコードだと、無限ループでPINをポーリングしている形だったので割り込みを使ってキー入力をとる形のコードに変えてみました。
キーに対応しているPinを作成して、そのPinに割り込みハンドラを設定しています。

ちなみに割り込みハンドラなどの情報は参考にしています。

割り込みハンドラの設定処理
    keyA = Pin(15,Pin.IN,Pin.PULL_UP)
    keyB = Pin(17,Pin.IN,Pin.PULL_UP)
    keyX = Pin(19 ,Pin.IN,Pin.PULL_UP)
    keyY= Pin(21 ,Pin.IN,Pin.PULL_UP)
    
    up = Pin(2,Pin.IN,Pin.PULL_UP)
    down = Pin(18,Pin.IN,Pin.PULL_UP)
    left = Pin(16,Pin.IN,Pin.PULL_UP)
    right = Pin(20,Pin.IN,Pin.PULL_UP)
    ctrl = Pin(3,Pin.IN,Pin.PULL_UP)
    
    keyA.irq( handler=lambda t:sample(keyA, 208, 15, LCD.blue) )
    keyB.irq( handler=lambda t:sample(keyB, 208, 75, LCD.red) )
    keyX.irq( handler=lambda t:sample(keyX, 208, 135, LCD.green) )
    keyY.irq( handler=lambda t:sample(keyY, 208, 195, LCD.yellow) )
    up.irq( handler=lambda t:sample(up, 60, 60, LCD.purple) )
    down.irq( handler=lambda t:sample(down, 60, 150, LCD.cyan) )
    left.irq( handler=lambda t:sample(left, 15, 105, LCD.black) )
    right.irq( handler=lambda t:sample(right, 105, 105, LCD.black) )
    ctrl.irq( handler=lambda t:sample(ctrl, 60, 105, LCD.black) )

矩形描画

プログラムの処理としては、サンプルと同じようにキーが押されたら対応した場所に矩形を描くというものです。
サンプルプログラムでは矩形は全部赤でしたが、ある程度色を変えるようにしてみました。

色の設定
        self.red     =   0x07e0
        self.green   =   0x001f
        self.blue    =   0xf800
        self.purple  =   0xffe0
        self.cyan    =   0xf81f
        self.yellow  =   0x07ff
        self.white   =   0xffff

矩形の描画の処理もまとめてみました。

矩形描画
def draw_block(x, y, color):
    LCD.rect(x, y, 30, 30, color)

def draw_fill_block(x, y, color):
    LCD.fill_rect(x, y, 30, 30, color)

def clear_block(x, y):
    LCD.fill_rect(x, y, 30, 30, LCD.white)

def sample( p, x, y, color ):
    print( p.value() )
    if p.value() == 0:
        draw_fill_block(x, y, color)
    else :
        clear_block(x, y)
        draw_block(x, y, color)
    LCD.show()

これで、キー入力の制御と矩形の描画ができたので、テトリスなんかが作れそうな気がする。w

1
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?