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