ADSR入力方法実験中の動画
Facebookに紹介動画があります。(Facebookへのログインが必要です)
https://www.facebook.com/toshikazu.hyodo/videos/2882343948625022?idorvanity=247733226639836
用途(目的)
この作品は、FM音源(YMF825を想定)の音色を編集する仕組みに関するものです。
FM音源IC(YMF825)ADSRの設定をグラフィックに操作しようと試作中の作品です。
概要(作品全体の説明)
- FM音源IC(YMF825)のパラメータ設定を、タッチパネル付きLCDでグラフィックに操作するための実験プログラム紹介です。
- 将来的に2つのPicoをシリアル通信で連携させ、1つをPicoMainとし音源編集用、もう1つをPicoSubとし、PicoSub にはYMF825を接続してMIDI再生(発音)することを想定しています。
- ここで紹介するのは、PicoMain用のグラフィックに操作するための実験プログラムです。残念ながら全体のプログラムは完成していません。入力部分のみの紹介になります。全体が完成しましたら、改めて投稿したいと思います。
- パラメータを設定しやすいように編集用のPicoMainには、タッチパネル付き液晶(Waveshare 3.5型静電容量式タッチスクリーンディスプレイ 320 x 480 SPI接続)を接続しました。
回路図:
全体ブロック図
外観図の写真を参照ください。
- タッチパネルLCDユニットに、Picoを装着しただけです。追加したハードウェアはありません。
- Waveshare 3.5型静電容量式タッチスクリーンディスプレイ 320 x 480 SPI接続の背面にPicoを取り付けるための40Pinのソケットがありますので、Raspberry Pi Pico2 または Pimoroni Pico Plus 2にヘッダーピンを半田付けして装着するだけです。
SPIデバイス接続
Waveshare 3.5型静電容量式タッチスクリーンディスプレイ 320 x 480 とのSPI接続は次の通り接続されます。同じSPIバスで、CSでLCDとタッチパネルを切り替えて使用する構造になっています。TPがタッチパネルです。
信号名 gpio番号
LCD_DC = const(8)
LCD_CS = const(9)
LCD_SCK = const(10)
LCD_MOSI = const(11)
LCD_MISO = const(12)
LCD_BL = const(13)
LCD_RST = const(15)
TP_CS = const(16)
TP_IRQ = const(17)
開発環境
- Raspberry Pi 4B にRaspberry Pi OSを標準でインストールするとThonnyが入ります。そのThonnyだけを使って開発しています。
- Raspberry Pi Pico2 をUSBケーブルでRaspberry Pi 4BをUSB接続して、Thonnyを起動させれば準備完了ですが、初めて接続する場合には、Raspberry Pi Pico2 または
- Pimoroni Pico Plus 2に、ファームウェア(UF2 ファイル)を書き込む必要があります。ご存じない方は、ネットで検索してください。MicroPython用を導入してください。
- Raspberry Pi Pico2 の場合はThonnyからインストールできます。
- Thonnyのシェル画面に表示されるシリアル出力のみでデバッグしました。
プログラム
- プログラム言語はMicroPythonです。
- 実験用なので、あえてプログラム全体を1つのファイルに収めています。
- Picoのライブラリは、予めPicoに書き込む必要がありますが、今回は全部を1つのファイルに収めていますので、ライブラリとして管理する必要はありません。
- ベースとしたプログラムは、Waveshareから提供されたサンプルプログラムです。
- PicoでMicroPythonプログラムを動かす方法は、①Thonnyにプログラムを読み込み実行させる。②Picoにmain.pyの名前で書き込む。の2つの方法があります。
- MicroPythonのFramebufferを利用しています。これを利用することで、文字を描く、線を引く、点を打つ、四角を描くなどのプログラムが簡単に作れます。
PicoMainプログラム(今回の実験プログラムです)
PicoM_main_py.py
########################################################################
# WAVE SHARE Pico-ResTouch-LCD-3.5 Test Program
# 用意された main_3inch5.py をテスト・改良
# 2025/08/02 : ADSRの表示と入力、WSの表示、ALGの表示まで完成
# main_3inch5-scale-664.py
# 2025/09/03 : elchika 投稿用に命名
# PicoM_main_py.py
#
########################################################################
# ①初回の起動で表示しない
# self.spi = SPI(1,6_000_000) をコメントアウトでOK
#
# ②self.rotate = 270 では、タッチしても反転表示しないことを修正した。
# ⑤ で LCDの座標に合わせた形で返すように変更
#
# ③文字を整数倍の拡大文字を表示可能にした。(8x8 のフォントでは、判読困難)
# import framebuf で、ビットマップイメージを作成している関係から
# 8x8 のフォントしか扱えないようだ。
# def text_scaled(self, text, x, y, color, scale=1): を追加
# scale で指定した整数倍の拡大文字を表示可能にした。
#
# ④色の追加設定
# def rgb2color565(self, r, g, b): を用意して RBGから構成可能にした。
# Return color565 from RGB color value. Red Green Blue
# self.YELLOW = self.rgb2color565(0xFF, 0xFF, 0x00)
# self.PURPLE = self.rgb2color565(0xFF, 0x00, 0xFF)
# self.BLUEGREEN = self.rgb2color565(0x00, 0xFF, 0xFF)
#
# ⑤タッチパネルの座標をLCDの座標同様になるような形で返すように変更した。
# def self.touch_get(self): の中で、self.rotate を用いて、
# タッチパネルの座標が、LCDの座標(左上隅が 0 0)と一致させるようにした。
# X:横軸 Y:縦軸 左上隅が、X=0, Y=0
#
# ⑥1つのバッファで全画面の表示する 2025/07/15 (20925/07/11の間違いを修正)
# メモリが2倍の Pico2(RP2350)を使用して
# バッファをフルサイズ(480x320)にすれば、1つのバッファで全画面の表示ができる。
#
# ⑦ WS 波形表示
#
# ⑧ ALG パターン表示
#
# ⑨ Pico2(RP2350) 使用を前提にプログラムを整理
# def touch_get(self) の辺り
#
#
#
########################################################################
from machine import Pin,SPI,PWM
from micropython import const
import math
import framebuf
import time
import os
import gc # メモリ利用状況表示用
# for DEBUG
PRINT_TOUCH_POS = True # タッチ座標を表示する時
TOUCH_ADJ = True # タッチ座標を取得する時。ROTATE = const(180) にすること
LCD_DC = const(8)
LCD_CS = const(9)
LCD_SCK = const(10)
LCD_MOSI = const(11)
LCD_MISO = const(12)
LCD_BL = const(13)
LCD_RST = const(15)
TP_CS = const(16)
TP_IRQ = const(17)
##############################################################
# LCDの向きに合わせて設定する
# Set the rotation Angle to 0°, 90°, 180° or 270°
# 0:USBが左辺上 90:USBが下辺左 180:USBが右辺下 270:USBが上辺右
# タッチ座標を取得して調整するときは。ROTATE = const(180) にすること
##############################################################
ROTATE = const(180)
# この Pixel 分を上下左右に拡大したエリアをタッチ有効とする
# 一部、この倍の領域にしている
TOUCH = const(8)
class LCD_3inch5(framebuf.FrameBuffer):
def __init__(self):
self.RED = 0x07E0
self.GREEN = 0x001f
self.BLUE = 0xf800
self.WHITE = 0xffff
self.BLACK = 0x0000
# Return color565 from RGB color value.
# Red Green Blue
self.YELLOW = self.rgb2color565(0xFF, 0xFF, 0x00)
self.PURPLE = self.rgb2color565(0xFF, 0x00, 0xFF)
self.BLUEGREEN = self.rgb2color565(0x00, 0xFF, 0xFF)
# self.GRAY = self.rgb2color565(0x20, 0x28, 0x10)
self.GRAY = self.rgb2color565(0x30, 0x28, 0x10)
self.rotate = ROTATE
# 2025/07/15 ここの設定の修正が必要だった
if self.rotate == 0 or self.rotate == 180:
self.width = 320
# 2025/07/15 self.height = 240
self.height = 480
else:
self.width = 480
# 2025/07/15 self.height = 160
self.height = 320
# 制御信号端子の設定
self.cs = Pin(LCD_CS,Pin.OUT)
self.rst = Pin(LCD_RST,Pin.OUT)
self.dc = Pin(LCD_DC,Pin.OUT)
self.tp_cs =Pin(TP_CS,Pin.OUT)
self.irq = Pin(TP_IRQ,Pin.IN)
# 制御信号端子の初期状態設定
self.cs(1)
self.dc(1)
self.rst(1)
self.tp_cs(1)
# LCD(ILI9488) 40MHz
self.spi_lcd = SPI(1,baudrate=40_000_000,sck=Pin(LCD_SCK),\
mosi=Pin(LCD_MOSI),miso=Pin(LCD_MISO))
print(self.spi_lcd)
#################### このあたりが難解 ################################
# Pico2(RP2350) ならば、画面一杯をしてしてもメモリエラーにならない
self.buffer = bytearray(self.height * self.width * 2)
super().__init__(self.buffer, self.width, self.height, framebuf.RGB565)
#########################################################################
print('gc.mem_free() = ', gc.mem_free()) # メモリ利用状況
self.init_display()
# color565 is Blue:5bits, Red:6bits, and Green:5bits 16bits
# Return color565 from RGB color value.
def rgb2color565(self, r, g, b):
return (r & 0xFC) << 3 | (g & 0xF8) >> 3 | (b & 0xF8) << 8
def init_display(self):
self.rst(0)
time.sleep_ms(10)
self.rst(1)
time.sleep_ms(50)
# INVON = const(0x21) # Display inversion on
self.write_cmd(0x21)
# Power Control 3
self.write_cmd(0xC2)
self.write_data(0x33)
# VMCTR1 = const(0xC5) # VCOM control 1
self.write_cmd(0xC5)
self.write_data(0x00)
self.write_data(0x1e)
self.write_data(0x80)
# FRMCTR1 = const(0xB1) # Frame rate control (In normal mode/full colors)
self.write_cmd(0xB1)
self.write_data(0xB0)
# GMCTRP1 = const(0xE0) # Positive gamma correction
self.write_cmd(0xE0)
self.write_data(0x00)
self.write_data(0x13)
self.write_data(0x18)
self.write_data(0x04)
self.write_data(0x0F)
self.write_data(0x06)
self.write_data(0x3a)
self.write_data(0x56)
self.write_data(0x4d)
self.write_data(0x03)
self.write_data(0x0a)
self.write_data(0x06)
self.write_data(0x30)
self.write_data(0x3e)
self.write_data(0x0f)
# GMCTRN1 = const(0xE1) # Negative gamma correction
self.write_cmd(0xE1)
self.write_data(0x00)
self.write_data(0x13)
self.write_data(0x18)
self.write_data(0x01)
self.write_data(0x11)
self.write_data(0x06)
self.write_data(0x38)
self.write_data(0x34)
self.write_data(0x4d)
self.write_data(0x06)
self.write_data(0x0d)
self.write_data(0x0b)
self.write_data(0x31)
self.write_data(0x37)
self.write_data(0x0f)
# PIXFMT = const(0x3A) # COLMOD: Pixel format set
self.write_cmd(0x3A)
self.write_data(0x55) # 16bits/pixel
# SLPOUT = const(0x11) # Exit sleep mode
self.write_cmd(0x11)
time.sleep_ms(120)
self.write_cmd(0x29)
# DFUNCTR = const(0xB6) # Display function control
self.write_cmd(0xB6)
self.write_data(0x00)
self.write_data(0x62)
# MADCTL = const(0x36) # Memory access control
self.write_cmd(0x36) # Sets the memory access mode for rotation
# bit 7-6:パネル方向 bit 5=0:横長 1:縦長
# bit 3は、常に1 bit 7654 3210
if self.rotate == 0:
self.write_data(0x88) # 1000 1000
elif self.rotate == 180:
self.write_data(0x48) # 0100 1000
elif self.rotate == 90:
self.write_data(0xe8) # 1110 1000
else:
self.write_data(0x28) # 0010 1000
def write_cmd(self, cmd):
self.cs(1)
self.dc(0)
self.cs(0)
self.spi_lcd.write(bytearray([cmd]))
self.cs(1)
def write_data(self, buf):
self.cs(1)
self.dc(1)
self.cs(0)
#self.spi_lcd.write(bytearray([0x00]))
self.spi_lcd.write(bytearray([buf]))
self.cs(1)
# 全エリアに描画
def show(self):
if self.rotate == 0 or self.rotate == 180:
# SET_COLUMN = const(0x2A) # Column address set
self.write_cmd(0x2A)
self.write_data(0x00) # Start Column
self.write_data(0x00) # 0x0000
self.write_data(0x01) # End Column
self.write_data(0x3f) # 0x013f:319
# SET_PAGE = const(0x2B) # Page address set
self.write_cmd(0x2B)
self.write_data(0x00) # Start Page
self.write_data(0x00) # 0x0000
self.write_data(0x01) # End Page
self.write_data(0xdf) # 0x01df:479
else: # self.rotate == 90 or self.rotate == 270:
# SET_COLUMN = const(0x2A) # Column address set
self.write_cmd(0x2A)
self.write_data(0x00) # Start Column
self.write_data(0x00) # 0x0000
self.write_data(0x01) # End Column
self.write_data(0xdf) # 0x01df:479
# SET_PAGE = const(0x2B) # Page address set
self.write_cmd(0x2B)
self.write_data(0x00) # Start Page
self.write_data(0x00) # 0x0000
self.write_data(0x01) # End Page
self.write_data(0x3f) # 0x013f:319
# WRITE_RAM = const(0x2C) # Memory write
self.write_cmd(0x2C)
self.cs(1)
self.dc(1)
self.cs(0)
self.spi_lcd.write(self.buffer)
self.cs(1)
# 2025/06/29 Add
# 拡大表示するテキスト描画関数
# scale:拡大率(整数)
def text_scaled(self, text, x, y, color, scale=1):
# 一時的なフレームバッファを作成(文字描画用)
temp_fb = framebuf.FrameBuffer(bytearray(8 * len(text) * 8),\
8 * len(text), 8, framebuf.MONO_HLSB)
temp_fb.fill(0) # 背景をクリア
temp_fb.text(text, 0, 0, 1) # 文字を描画
# 各ピクセルを拡大して描画
for yy in range(8):
for xx in range(8 * len(text)):
if temp_fb.pixel(xx, yy): # 文字のピクセルがある場合
self.fill_rect(x + xx * scale, y + yy * scale,\
scale, scale, color)
def bl_ctrl(self,duty):
pwm = PWM(Pin(LCD_BL))
pwm.freq(1000)
if(duty>=100):
pwm.duty_u16(65535)
else:
pwm.duty_u16(655*duty)
def touch_get(self):
if self.irq() == 0:
# spi1 Switching to Touch Panel
# 2025/07/03 : 使用都度、設定し直す、この方法が良いようだ。
# Touch Panel(XPT2046) 4MHz
self.spi_touch = SPI(1, baudrate=4_000_000, sck=Pin(LCD_SCK),\
mosi=Pin(LCD_MOSI), miso=Pin(LCD_MISO))
self.tp_cs(0)
time.sleep_ms(1)
for i in range(0,3):
self.spi_touch.write(bytearray([0xD0]))
Read_date = self.spi_touch.read(2)
time.sleep_us(10)
x_touch = ((Read_date[0] <<8) + Read_date[1]) >>3
self.spi_touch.write(bytearray([0x90]))
Read_date = self.spi_touch.read(2)
time.sleep_us(10)
y_touch = ((Read_date[0] <<8) + Read_date[1]) >>3
self.tp_cs(1)
# DEBUG ADJ 用 ####################################################
if PRINT_TOUCH_POS:
print('x_touch = ', x_touch, ' y_touch = ', y_touch)
###################################################################
# spi1 Switching to LCD
# 2025/07/03 : 使用が終われば、設定を元に戻す。この方法が良いようだ。
# LCD(ILI9488) 40MHz
self.spi_lcd = SPI(1, baudrate=40_000_000, sck=Pin(LCD_SCK),\
mosi=Pin(LCD_MOSI), miso=Pin(LCD_MISO))
##############################
# Set Here Adjuste Parameter
# x_min ===> x_max
# 4800 7350
# y_min -----------------
# | |
# 4700 | + + |
# | |
# | LCD Panel |
# | |_
# | | | USB connector
# 7700 | + + |~
# | |
# y_max -----------------
# ~~ USB connector
###########################################################
# 2025/07/24 ADJ
# 四隅ではなく、各40Pixcel 中央寄りの四隅の値を基準に決める方法に変更
# 左上の XT XY の値
result40_40 = [4900,4800] # [4800,4700]
# 右上の XT XY の値
result280_40 = [7450,4800] # [7350,4700]
# 左下の XT XY の値
result40_440 = [4900,7800] # [4800,7700]
# 右下の XT XY の値
result280_440 = [7450,7800] # [7350,7700]
# 右下の XT XY の値は、利用していない
x_min = int(result40_40[0] - ((result280_40[0] - result40_40[0]) *40 /(280 -40)))
x_max = int(result280_40[0] + ((result280_40[0] - result40_40[0]) *40 /(280 -40)))
y_min = int(result40_40[1] - ((result40_440[1] - result40_40[1]) *40 /(440 -40)))
y_max = int(result40_440[1] + ((result40_440[1] - result40_40[1]) *40 /(440 -40)))
#########################
x_range = x_max - x_min
y_range = y_max - y_min
#########################
# Result_list = [touch_,touch_Y]
# 2025/07/02 : self.rotate の方向で、LCD位置に合わせた座標を返す
if self.rotate == 0 or self.rotate == 180:
if self.rotate == 0: # X軸Y軸の座標入替なし and X軸Y軸とも 数値変換なし
X_Point = 320 - int((x_touch - x_min) *320 /x_range)
Y_Point = 480 - int((y_touch - y_min) *480 /y_range)
elif self.rotate == 180: # X軸Y軸の座標入替なし and Y軸は 数値大小入替
X_Point = int((x_touch - x_min) *320 /x_range)
Y_Point = int((y_touch - y_min) *480 /y_range)
# 範囲内に収める 2025/07/17 修正
if X_Point >= 320:
X_Point = 319
elif X_Point < 0:
X_Point = 0
if Y_Point >= 480:
Y_Point = 479
elif Y_Point < 0:
Y_Point = 0
else: # self.rotate == 90 or self.rotate == 270:
if self.rotate == 90: # X軸Y軸の座標入替あり and X軸は 数値大小入替
X_Point = 480 - int((y_touch - y_min) *480 /y_range)
Y_Point = int((x_touch - x_min) *320 /x_range)
elif self.rotate == 270: # X軸Y軸の座標入替あり and Y軸は 数値大小入替
X_Point = int((y_touch - y_min) *480 /y_range)
Y_Point = 320 - int((x_touch - x_min) *320 /x_range)
# 範囲内に収める 2025/07/17 修正
if X_Point >= 480:
X_Point = 479
elif X_Point < 0:
X_Point = 0
if Y_Point >= 320:
Y_Point = 319
elif Y_Point < 0:
Y_Point = 0
if TOUCH_ADJ: # タッチポイント調整用に生のポイントデータを返す
# 2025/07/23
Result_list = [X_Point, Y_Point, x_touch, y_touch]
else: # LCD Pixcel に変換したデータのみを返す
Result_list = [X_Point, Y_Point]
# 2025/06/27 : タッチされた座標を表示
print(Result_list)
return(Result_list)
# ここ以降は、main Python 関連の関数
# X_Poin と Y_Point が 共に zoneS ~ zoneE の範囲内にあるか否か
def in_zone(zoneS, zoneE, X_Point, Y_Point):
if zoneS[0] <= X_Point and X_Point <= zoneE[0] \
and zoneS[1] <= Y_Point and Y_Point <= zoneE[1]:
# X_Poin と Y_Point が 共に zoneS ~ zoneE の範囲内ならば True
return True
else:
return False
# AR TL SL DR SR RR の数値を表示する(編集中に再表示するので集約した。
def dspAR(now_AR):
# AR 数値表示 文字領域を 白色にしてから表示
LCD.fill_rect( 10,ys+160,16*5,20, LCD.WHITE)
LCD.text_scaled(f'AR {now_AR}', 10,ys+160,LCD.BLACK, 2)
def dspRR(now_RR):
# AR 数値表示 文字領域を 白色にしてから表示
LCD.fill_rect(230,ys+160,16*5,20, LCD.WHITE)
LCD.text_scaled(f'RR {now_RR}',230,ys+160,LCD.BLACK, 2)
def dspTL(now_TL):
# AR 数値表示 文字領域を 白色にしてから表示
LCD.fill_rect(10, ys+10,16*5,20, LCD.WHITE)
LCD.text_scaled(f'TL {now_TL}', 10, ys+10,LCD.BLACK, 2)
def dspDR(now_DR):
# AR 数値表示 文字領域を 白色にしてから表示
LCD.fill_rect(200, ys+10,16*5,20, LCD.WHITE)
LCD.text_scaled(f'DR {now_DR}',200, ys+10,LCD.BLACK, 2)
def dspSL(now_SL):
# AR 数値表示 文字領域を 白色にしてから表示
LCD.fill_rect(200, ys+30,16*5,20, LCD.WHITE)
LCD.text_scaled(f'SL {now_SL}',200, ys+30,LCD.BLACK, 2)
def dspSR(now_SR):
# AR 数値表示 文字領域を 白色にしてから表示
LCD.fill_rect(220, ys+50,16*5,20, LCD.WHITE)
LCD.text_scaled(f'SR {now_SR}',220, ys+50,LCD.BLACK, 2)
def dsp_KSL(now_KSL):
# KSL 数値表示 背景を黄色にし、文字色は紫色
if now_KSL == 3:
LCD.fill_rect(20,ys+70,16*3,20, LCD.YELLOW) # KSL = 3
LCD.text_scaled(f'6.0', 20,ys+70 +2,LCD.PURPLE, 2) # KSL=3
elif now_KSL == 1:
LCD.fill_rect(20,ys+90,16*3,20, LCD.YELLOW) # KSL = 1
LCD.text_scaled(f'3.0', 20,ys+90 +2,LCD.PURPLE, 2) # KSL=1
elif now_KSL == 2:
LCD.fill_rect(20,ys+110,16*3,20, LCD.YELLOW) # KSL = 2
LCD.text_scaled(f'1.5', 20,ys+110 +2,LCD.PURPLE, 2) # KSL=2
else:
LCD.fill_rect(20,ys+130,16*3,20, LCD.YELLOW) # KSL = 0
LCD.text_scaled(f'0.0', 20,ys+130 +2,LCD.PURPLE, 2) # KSL=0
def dsp_KSR(now_KSR):
# KSR 数値表示 背景を黄色にし、文字色は紫色
if now_KSR == 1:
LCD.fill_rect(240,ys+100,16*3,20, LCD.YELLOW) # KSR = 1
LCD.text_scaled(f'On ',240,ys+100 +2,LCD.PURPLE, 2) # KSR=1
else:
LCD.fill_rect(240,ys+120,16*3,20, LCD.YELLOW) # KSR = 0
LCD.text_scaled(f'Off',240,ys+120 +2,LCD.PURPLE, 2) # KSR=0
def bold_pixel(x, y, color, scale):
if scale >= 2:
s = int(scale /2)
x = 0 if (x -s) < 0 else x -s
y = 0 if (y -s) < 0 else y -s
LCD.fill_rect(x, y, scale, scale, color)
# 座標ポイント zs ze で指定された2点のPixel および、その周囲の8点同士を線で描く
def bold_line(zs, ze, color):
for x in range(-1,2):
for y in range(-1,2):
LCD.line(zs[0] +x, zs[1] +y, ze[0] +x, ze[1] +y, color)
# 座標ポイント で指定された2点のPixel および、右側と下側 4点同士を線で描く
def bold_line2(zs, ze, color):
for x in range(2):
for y in range(2):
LCD.line(zs[0] +x, zs[1] +y, ze[0] +x, ze[1] +y, color)
# ALG op(オペレーション)の四角の枠と数値を表示する
def alg_op(op_num_text, zl, fb,color_line, color_back, color_text, scale):
xb = 2 # line X の太さ(pixel数)
yb = 2 # line Y の太さ(pixel数)
xf = 7 # FB line の位置 x差分
yf = 11 # FB line の位置 y差分
xt = 2 # Text の開始位置 x差分
yt = -3 # Text の開始位置 y差分
if scale == 2:
zt = [zl[0] +xt*scale, zl[1] +yt*scale]
zs = [zl[0] , zl[1] -5*scale]
zf = [zl[0] -xf*scale, zl[1] -yf*scale]
w_op = 24*scale # 文字幅 8 pixel 文字 x 3文字
h_op = 8*scale # 文字高さ
else:
zt = [zl[0] +xt, zl[1] +yt]
zs = [zl[0] , zl[1] -5]
zf = [zl[0] -xf, zl[1] -yf]
w_op = 24 # 文字幅 8 pixel 文字 x 3文字
h_op = 8 # 文字高さ
if scale == 2:
if fb ==1: # フィードバックの枠線を描く、中抜き方式
LCD.fill_rect(zf[0], zf[1], w_op +xb*2 +xf*2*scale, yf*scale +yb ,color_line)
LCD.fill_rect(zf[0] +xb, zf[1] +yb, w_op +xf*2*scale, yf*scale -yb ,LCD.WHITE)
LCD.fill_rect(zs[0], zs[1], w_op +xb*2, h_op +yb*2, color_line)
LCD.fill_rect(zs[0] +xb, zs[1] +yb, w_op, h_op, color_back)
# LCD.text(op_num_text, zt[0], zt[1], color_text)
LCD.text_scaled(op_num_text, zt[0], zt[1], color_text, scale)
else:
if fb ==1: # フィードバックの枠線を描く、中抜き方式
LCD.fill_rect(zf[0], zf[1], w_op +xb*2 +xf*2, yf +yb ,color_line)
LCD.fill_rect(zf[0] +xb, zf[1] +yb, w_op +xf*2, yf -yb ,LCD.WHITE)
LCD.fill_rect(zs[0], zs[1], w_op +xb*2, h_op +yb*2, color_line)
LCD.fill_rect(zs[0] +xb, zs[1] +yb, w_op, h_op, color_back)
LCD.text(op_num_text, zt[0], zt[1], color_text)
# タブ の四角の枠とタブの名前を表示する
def tab(tab_name, zs, chr_num, color_line, color_back, color_text):
chr_w = 16
chr_h = 16
xb = 2 # line X の太さ(pixel数)
yb = 2 # line Y の太さ(pixel数)
LCD.fill_rect(zs[0], zs[1], chr_w *chr_num +xb*2, chr_h +yb*2, color_line)
LCD.fill_rect(zs[0] +xb, zs[1] +yb, chr_w *chr_num, chr_h, color_back)
LCD.text_scaled(tab_name,zs[0] +xb, zs[1] +yb, color_text, 2)
# main menu
def dsp_main_menu():
tab_get = [ 6,2]
tab_com = [ 86,2]
tab_op = [166,2]
tab_send = [246,2]
chr_num = 4
color_line = LCD.BLUE
color_back = LCD.GRAY
color_text = LCD.BLACK
tab('get' , tab_get, chr_num, color_line, color_back, color_text)
tab('com' , tab_com, chr_num, color_line, color_back, color_text)
tab('op' , tab_op, chr_num, color_line, color_back, color_text)
tab('send', tab_send,chr_num, color_line, color_back, color_text)
# sub menu
def dsp_sub_menu():
tab_ws = [ 6,240]
tab_mul = [ 86,240]
tab_adsr = [166,240]
tab_dam = [246,240]
chr_num = 4
color_line = LCD.BLUE
color_back = LCD.GRAY
color_text = LCD.BLACK
tab('ws' , tab_ws, chr_num, color_line, color_back, color_text)
tab('mul' , tab_mul, chr_num, color_line, color_back, color_text)
tab('adsr', tab_adsr,chr_num, color_line, color_back, color_text)
tab('dam' , tab_dam, chr_num, color_line, color_back, color_text)
# ALG を下半分の決まった位置に表示する。+ 画面上半分に stageで指定されたものを拡大表示
def alg_patarn(alg, stage, color_line, color_back, color_text):
# scale == 2 の場合は、2倍に拡大して上段に表示する。その位置の設定
zl_algS = [10, 40] # 拡大して表示する場合の開始位置
# 下半分の決まった位置に表示する各アルゴリズム基準となる OP左端の上下中心点の設定
zl_alg0 = [173 +28, 245 +12+16 +5]
zl_alg1 = [ 31 +28, 245 +12+16 +5]
zl_alg2 = [ 31 +28, 245 +12+16*3 +22 +3]
zl_alg3 = [173, 245 +12+16*3 +3]
zl_alg4 = [173, 245 +12+16*5 +22]
zl_alg5 = [173 +28, 245 +12+16*7 +22]
zl_alg6 = [173, 245 +12+16*9 +22*2]
zl_alg7 = [ 31, 245 +12+16*5 +22*4]
# ALG タイトル表示位置
alg_textS = [10, 35] # 拡大して表示する場合の開始位置
alg_text0 = [165 -27, 245 +12 +10]
alg_text1 = [ 5, 245 +12 +10]
alg_text2 = [ 5, 245 +12+16*2 +22 +30]
alg_text3 = [165 -27, 245 +12+16*2 +10 +3]
alg_text4 = [165 -27, 245 +12+16*4 +22]
alg_text5 = [165 -27, 245 +12+16*6 +22 +10]
alg_text6 = [165 -27, 245 +12+16*8 +22*2 +10]
alg_text7 = [ 5, 245 +12+16*4 +22*4 +20]
# 暗号化された stage を復号
alg_on_stage = int(stage /3)
only_down = False
only_up = False
both = False
if stage %3 == 0:
only_down = True # 下半分のみ表示
elif stage %3 == 1:
only_up = True # 上半分のみ表示
else: # stage %3 == 2
both = True # 両方表示
if alg == 0:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0] +28 +14 , z_op1[1]]
z_je = [z_op2[0] +28 +14 , z_op2[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg0
z_op2 = [z_op1[0] +28 +14 , z_op1[1]]
z_je = [z_op2[0] +28 +14 , z_op2[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text0
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 1:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0], z_op1[1] +22]
z_je = [z_op1[0] +28 +14*2, z_op1[1]]
z_j1 = [z_op1[0] +28 +14 , z_op1[1]]
z_j2 = [z_op2[0] +28 +14 , z_op2[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
z_j1 = [z_j1[0]*2, z_j1[1]*2]
z_j2 = [z_j2[0]*2, z_j2[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j2, color_line)
bold_line2(z_j1 , z_j2, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg1
z_op2 = [z_op1[0], z_op1[1] +22]
z_je = [z_op1[0] +28 +14*2, z_op1[1]]
z_j1 = [z_op1[0] +28 +14 , z_op1[1]]
z_j2 = [z_op2[0] +28 +14 , z_op2[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j2, color_line)
bold_line2(z_j1 , z_j2, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text1
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 2:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0], z_op1[1] +22]
z_op3 = [z_op1[0], z_op1[1] +22*2]
z_op4 = [z_op1[0], z_op1[1] +22*3]
z_je = [z_op1[0] +28 +14*2, z_op1[1]]
z_j1 = [z_op1[0] +28 +14 , z_op1[1]]
z_j2 = [z_op2[0] +28 +14 , z_op2[1]]
z_j3 = [z_op3[0] +28 +14 , z_op3[1]]
z_j4 = [z_op4[0] +28 +14 , z_op4[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_op3 = [z_op3[0]*2, z_op3[1]*2]
z_op4 = [z_op4[0]*2, z_op4[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
z_j1 = [z_j1[0]*2, z_j1[1]*2]
z_j2 = [z_j2[0]*2, z_j2[1]*2]
z_j3 = [z_j3[0]*2, z_j3[1]*2]
z_j4 = [z_j4[0]*2, z_j4[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j2, color_line)
bold_line2(z_op3, z_j3, color_line)
bold_line2(z_op4, z_j4, color_line)
bold_line2(z_j1 , z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
alg_op(' 3 ', z_op3, 1, color_line, color_back, color_text, 2)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg2
z_op2 = [z_op1[0], z_op1[1] +22]
z_op3 = [z_op1[0], z_op1[1] +22*2]
z_op4 = [z_op1[0], z_op1[1] +22*3]
z_je = [z_op1[0] +28 +14*2, z_op1[1]]
z_j1 = [z_op1[0] +28 +14 , z_op1[1]]
z_j2 = [z_op2[0] +28 +14 , z_op2[1]]
z_j3 = [z_op3[0] +28 +14 , z_op3[1]]
z_j4 = [z_op4[0] +28 +14 , z_op4[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j2, color_line)
bold_line2(z_op3, z_j3, color_line)
bold_line2(z_op4, z_j4, color_line)
bold_line2(z_j1 , z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
alg_op(' 3 ', z_op3, 1, color_line, color_back, color_text, 1)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text2
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 3:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0] , z_op1[1] +22]
z_op3 = [z_op1[0] +28 +14 , z_op1[1] +22]
z_op4 = [z_op1[0] +28*2 +14*3 , z_op1[1]]
z_je = [z_op4[0] +28 +14 , z_op4[1]]
z_j1 = [z_op1[0] +28*2 +14*2 , z_op1[1]]
z_j3 = [z_op3[0] +28 +14 , z_op3[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_op3 = [z_op3[0]*2, z_op3[1]*2]
z_op4 = [z_op4[0]*2, z_op4[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
z_j1 = [z_j1[0]*2, z_j1[1]*2]
z_j3 = [z_j3[0]*2, z_j3[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j3, color_line)
bold_line2(z_j1, z_j3, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 2)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg3
z_op2 = [z_op1[0] , z_op1[1] +22]
z_op3 = [z_op1[0] +28 +14 , z_op1[1] +22]
z_op4 = [z_op1[0] +28*2 +14*3 , z_op1[1]]
z_je = [z_op4[0] +28 +14 , z_op4[1]]
z_j1 = [z_op1[0] +28*2 +14*2 , z_op1[1]]
z_j3 = [z_op3[0] +28 +14 , z_op3[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j3, color_line)
bold_line2(z_j1, z_j3, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 1)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text3
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 4:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0] +28 +14 , z_op1[1]]
z_op3 = [z_op2[0] +28 +7 , z_op1[1]]
z_op4 = [z_op3[0] +28 +7 , z_op1[1]]
z_je = [z_op4[0] +28 +14 , z_op2[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_op3 = [z_op3[0]*2, z_op3[1]*2]
z_op4 = [z_op4[0]*2, z_op4[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
# op 表示
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 2)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg4
z_op2 = [z_op1[0] +28 +14 , z_op1[1]]
z_op3 = [z_op2[0] +28 +7 , z_op1[1]]
z_op4 = [z_op3[0] +28 +7 , z_op1[1]]
z_je = [z_op4[0] +28 +14 , z_op2[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 1)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text4
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 5:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0] +28 +14 , z_op1[1]]
z_op3 = [z_op1[0] , z_op1[1] +22]
z_op4 = [z_op2[0] , z_op2[1] +22]
z_je = [z_op2[0] +28 +14*2 , z_op2[1]]
z_j2 = [z_op2[0] +28 +14 , z_op2[1]]
z_j4 = [z_op4[0] +28 +14 , z_op4[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_op3 = [z_op3[0]*2, z_op3[1]*2]
z_op4 = [z_op4[0]*2, z_op4[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
z_j2 = [z_j2[0]*2, z_j2[1]*2]
z_j4 = [z_j4[0]*2, z_j4[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op3, z_j4, color_line)
bold_line2(z_j2, z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
alg_op(' 3 ', z_op3, 1, color_line, color_back, color_text, 2)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg5
z_op2 = [z_op1[0] +28 +14 , z_op1[1]]
z_op3 = [z_op1[0] , z_op1[1] +22]
z_op4 = [z_op2[0] , z_op2[1] +22]
z_je = [z_op2[0] +28 +14*2 , z_op2[1]]
z_j2 = [z_op2[0] +28 +14 , z_op2[1]]
z_j4 = [z_op4[0] +28 +14 , z_op4[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op3, z_j4, color_line)
bold_line2(z_j2, z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
alg_op(' 3 ', z_op3, 1, color_line, color_back, color_text, 1)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text5
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 6:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0] , z_op1[1] +22]
z_op3 = [z_op2[0] +28 +14 , z_op2[1]]
z_op4 = [z_op3[0] +28 +7 , z_op3[1]]
z_je = [z_op1[0] +28*2 +7 +14*5 , z_op1[1]]
z_j1 = [z_op1[0] +28*2 +7 +14*4 , z_op1[1]]
z_j4 = [z_op4[0] +28 +14 , z_op4[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_op3 = [z_op3[0]*2, z_op3[1]*2]
z_op4 = [z_op4[0]*2, z_op4[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
z_j1 = [z_j1[0]*2, z_j1[1]*2]
z_j4 = [z_j4[0]*2, z_j4[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j4, color_line)
bold_line2(z_j1, z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 2)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg6
z_op2 = [z_op1[0] , z_op1[1] +22]
z_op3 = [z_op2[0] +28 +14 , z_op2[1]]
z_op4 = [z_op3[0] +28 +7 , z_op3[1]]
z_je = [z_op1[0] +28*2 +7 +14*5 , z_op1[1]]
z_j1 = [z_op1[0] +28*2 +7 +14*4 , z_op1[1]]
z_j4 = [z_op4[0] +28 +14 , z_op4[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j4, color_line)
bold_line2(z_j1, z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 1)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text6
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 7:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op2 = [zl_algS[0], zl_algS[1] +22]
# op2 を起点にする
z_op1 = [z_op2[0] +35, z_op2[1] -22]
z_op3 = [z_op2[0] +28 +14, z_op2[1]]
z_op4 = [z_op1[0] , z_op1[1] +22*2]
z_je = [z_op1[0] +28 +21 +14, z_op1[1]]
z_j1 = [z_op1[0] +28 +21 , z_op1[1]]
z_j3 = [z_op3[0] +28 +14 , z_op3[1]]
z_j4 = [z_op4[0] +28 +21 , z_op4[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_op3 = [z_op3[0]*2, z_op3[1]*2]
z_op4 = [z_op4[0]*2, z_op4[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
z_j1 = [z_j1[0]*2, z_j1[1]*2]
z_j3 = [z_j3[0]*2, z_j3[1]*2]
z_j4 = [z_j4[0]*2, z_j4[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j3, color_line)
bold_line2(z_op4, z_j4, color_line)
bold_line2(z_j1 , z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 2)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op2 = [zl_alg7[0], zl_alg7[1] +22]
# op2 を起点にする
z_op1 = [z_op2[0] +35, z_op2[1] -22]
z_op3 = [z_op2[0] +28 +14, z_op2[1]]
z_op4 = [z_op1[0] , z_op1[1] +22*2]
z_je = [z_op1[0] +28 +21 +14, z_op1[1]]
z_j1 = [z_op1[0] +28 +21 , z_op1[1]]
z_j3 = [z_op3[0] +28 +14 , z_op3[1]]
z_j4 = [z_op4[0] +28 +21 , z_op4[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j3, color_line)
bold_line2(z_op4, z_j4, color_line)
bold_line2(z_j1 , z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 1)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text7
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
def one_write_line(zl, color_wave):
# zl[[zs], [z1], [z2], [z3], [z4], ]
if len(zl) >= 2:
z_end = zl[0]
for i in range(1, len(zl)):
z_start = z_end
# y軸は、反転することに注意
z_end =[zl[0][0] +zl[i][0], zl[0][1] -zl[i][1]]
bold_line(z_start, z_end, color_wave)
# WS 波形をLCD下半分の決まった位置に表示する
def wave_form(ws, color_back, color_wave):
xs = 0
xb = 8 # 枠の幅 x
ys = 264 # 240~259:[WS]Tab 260~263:Line
yl = ys +18 # 240~259:[WS]Tab 260~263:Line 中央の線
yb = 3 # 枠の幅 y
w = 64 # セルの全体幅
wx = 48 # セルの波形幅
h = 36 # セルの全体高さ
hy = 15 # セルの波形高さの半分 sin価数を利用するため 1/2 にしている
# ws 番号から描画開始位置を決めるためのテーブル
# ws=0, 1, 2, 3, 4,
zone_xs = [xs +w*0, xs +w*1, xs +w*2, xs +w*0, xs +w*3, \
# ws=5, 6, 7, 8, 9,
xs +w*4, xs +w*0, xs +w*4, xs +w*0, xs +w*1, \
# ws=10, 11, 12, 13, 14,
xs +w*2, xs +w*1, xs +w*3, xs +w*4, xs +w*1, \
# ws=15, 16, 17, 18, 19,
xs +w*0, xs +w*0, xs +w*1, xs +w*2, xs +w*2, \
# ws=20, 21, 22, 23, 24,
xs +w*3, xs +w*4, xs +w*2, xs +w*0, xs +w*0, \
# ws=25, 26, 27, 28, 29, 30,
xs +w*1, xs +w*2, xs +w*3, xs +w*3, xs +w*4, xs +w*3]
# ws=0, 1, 2, 3, 4,
zone_ys = [ys +h*0, ys +h*0, ys +h*0, ys +h*5, ys +h*0, \
# ws=5, 6, 7, 8, 9,
ys +h*0, ys +h*4, ys +h*4, ys +h*1, ys +h*1, \
# ws=10, 11, 12, 13, 14,
ys +h*1, ys +h*5, ys +h*1, ys +h*1, ys +h*4, \
# ws=15, 16, 17, 18, 19,
ys +h*0, ys +h*2, ys +h*2, ys +h*2, ys +h*5, \
# ws=20, 21, 22, 23, 24,
ys +h*2, ys +h*2, ys +h*4, ys +h*0, ys +h*3, \
# ws=25, 26, 27, 28, 29, 30,
ys +h*3, ys +h*3, ys +h*5, ys +h*3, ys +h*3, ys +h*4]
# 波形の Y軸 0 line 上下中心線
zone_yl = [yl +h*0, yl +h*0, yl +h*0, yl +h*5, yl +h*0, \
yl +h*0, yl +h*4, yl +h*4, yl +h*1, yl +h*1, \
yl +h*1, yl +h*5, yl +h*1, yl +h*1, yl +h*4, \
yl +h*0, yl +h*2, yl +h*2, yl +h*2, yl +h*5, \
yl +h*2, yl +h*2, yl +h*4, yl +h*0, yl +h*3, \
yl +h*3, yl +h*3, yl +h*5, yl +h*3, yl +h*3, yl +h*4]
if ws == 0:
for i in range(wx):
xp = zone_xs[ws] +i +xb
# 円周360度を 60分割してサイン波形をプロットする
# yp = zone_ys[ws] +yb +int(hy*2 - (math.sin(math.radians(i *(360/wx))) *hy +hy))
yp = zone_yl[ws] -int(math.sin(math.radians(i *(360/wx))) *hy)
bold_pixel(xp, yp, color_wave, 3)
elif ws == 1:
for i in range(int(wx/2)+1):
xp = zone_xs[ws] +i +xb
# 円周360度を 60分割してサイン波形をプロットする
yp = zone_yl[ws] -int(math.sin(math.radians(i *(360/wx))) *hy)
bold_pixel(xp, yp, color_wave, 3)
# 直線部分を描く
xp = zone_xs[ws] +xb +24
yp = zone_yl[ws]
# 起点 1 2 3 4 5 6 7 8
zl = [[xp,yp], [+24,0]]
one_write_line(zl, color_wave)
elif ws == 2:
for i in range(wx):
xp = zone_xs[ws] +i +xb
# 円周360度を 60分割してサイン波形をプロットする
yp = zone_yl[ws] -int(abs(math.sin(math.radians(i *(360/wx))) *hy))
bold_pixel(xp, yp, color_wave, 3)
elif ws == 3:
# 円周360度を 60分割してサイン波形の 1/4 をプロットする
for i in range(0, 12):
xp = zone_xs[ws] +i +xb
yp = zone_yl[ws] -int(abs(math.sin(math.radians(i *(360/wx))) *hy))
bold_pixel(xp, yp, color_wave, 3)
# 円周360度を 60分割してサイン波形の 3/4 をプロットする
for i in range(24, 36):
xp = zone_xs[ws] +i +xb
yp = zone_yl[ws] -int(abs(math.sin(math.radians(i *(360/wx))) *hy))
bold_pixel(xp, yp, color_wave, 3)
# 直線部分を描く
z1 = [zone_xs[ws] +xb +12, zone_ys[ws] +yb +0]
z2 = [zone_xs[ws] +xb +12, zone_ys[ws] +yb +hy]
z3 = [zone_xs[ws] +xb +24, zone_ys[ws] +yb +hy]
bold_line(z1, z2, color_wave)
bold_line(z2, z3, color_wave)
z4 = [zone_xs[ws] +xb +36, zone_ys[ws] +yb +0]
z5 = [zone_xs[ws] +xb +36, zone_ys[ws] +yb +hy]
z6 = [zone_xs[ws] +xb +48, zone_ys[ws] +yb +hy]
bold_line(z4, z5, color_wave)
bold_line(z5, z6, color_wave)
elif ws == 4:
# 円周360度を 60分割してサイン波形をプロットする
for i in range(30+1):
xp = zone_xs[ws] +i +xb *2
yp = zone_yl[ws] -int(math.sin(math.radians(i *(360/30))) *hy)
bold_pixel(xp, yp, color_wave, 3)
elif ws == 5:
# 円周360度を 60分割してサイン波形をプロットする
for i in range(30+1):
xp = zone_xs[ws] +i +xb *2
yp = zone_yl[ws] -int(abs(math.sin(math.radians(i *(360/30))) *hy))
bold_pixel(xp, yp, color_wave, 3)
elif ws == 6:
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [0,+hy], [24,+hy], [24,-hy], [48,-hy], [48,0]]
one_write_line(zl, color_wave)
elif ws == 7:
# サイン波形の 180~270 をプロットする
for i in range(0, 24):
xp = zone_xs[ws] +i +xb
yp = zone_ys[ws] +yb +int(hy*2 - (abs(math.sin(math.radians(i *(360/(wx*2)) +180))) *(-1) *hy +hy*2))
bold_pixel(xp, yp, color_wave, 3)
# サイン波形の 270~360 をプロットする
for i in range(24, 48):
xp = zone_xs[ws] +i +xb
yp = zone_ys[ws] +yb +int(hy*2 - (abs(math.sin(math.radians(i *(360/(wx*2)) +0))) *hy))
bold_pixel(xp, yp, color_wave, 3)
# 直線部分を描く
z1 = [zone_xs[ws] +xb +0, zone_ys[ws] +yb +0]
z2 = [zone_xs[ws] +xb +0, zone_ys[ws] +yb +hy]
z3 = [zone_xs[ws] +xb +48, zone_ys[ws] +yb +hy*2]
z4 = [zone_xs[ws] +xb +48, zone_ys[ws] +yb +hy]
bold_line(z1, z2, color_wave)
bold_line(z3, z4, color_wave)
elif ws == 8:
# 円周360度を 60分割してサイン波形をプロットする
for i in range(wx):
xp = zone_xs[ws] +i +xb
y = -int(math.sin(math.radians(i *(360/wx))) *hy)
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
elif ws == 9:
# 円周360度を 60分割してサイン波形をプロットする
for i in range(int(wx/2)+1):
xp = zone_xs[ws] +i +xb
y = -int(math.sin(math.radians(i *(360/wx))) *hy)
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
z1 = [zone_xs[ws] +xb +24, zone_ys[ws] +yb +hy]
z2 = [zone_xs[ws] +xb +48, zone_ys[ws] +yb +hy]
bold_line(z1, z2, color_wave)
elif ws == 10:
# 円周360度を 60分割してサイン波形をプロットする
for i in range(wx):
xp = zone_xs[ws] +i +xb
y = -int(abs(math.sin(math.radians(i *(360/wx))) *hy))
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
elif ws == 11:
# 円周360度を 60分割してサイン波形の 1/4 をプロットする
for i in range(0, 12):
xp = zone_xs[ws] +i +xb
y = -int(abs(math.sin(math.radians(i *(360/wx))) *hy))
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
# 円周360度を 60分割してサイン波形の 3/4 をプロットする
for i in range(24, 36):
xp = zone_xs[ws] +i +xb
y = -int(abs(math.sin(math.radians(i *(360/wx))) *hy))
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
# 直線部分を描く
z1 = [zone_xs[ws] +xb +12, zone_ys[ws] +yb +5]
z2 = [zone_xs[ws] +xb +12, zone_ys[ws] +yb +hy]
z3 = [zone_xs[ws] +xb +24, zone_ys[ws] +yb +hy]
bold_line(z1, z2, color_wave)
bold_line(z2, z3, color_wave)
z4 = [zone_xs[ws] +xb +36, zone_ys[ws] +yb +5]
z5 = [zone_xs[ws] +xb +36, zone_ys[ws] +yb +hy]
z6 = [zone_xs[ws] +xb +48, zone_ys[ws] +yb +hy]
bold_line(z4, z5, color_wave)
bold_line(z5, z6, color_wave)
elif ws == 12:
# 円周360度を 60分割してサイン波形をプロットする
for i in range(30+1):
xp = zone_xs[ws] +i +xb *2
y = -int(math.sin(math.radians(i *(360/30))) *hy)
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
elif ws == 13:
# 円周360度を 60分割してサイン波形をプロットする
for i in range(30+1):
xp = zone_xs[ws] +i +xb *2
y = -int(abs(math.sin(math.radians(i *(360/30))) *hy))
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
elif ws == 14:
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [0,+hy], [24,+hy], [24,0], [48,0]]
one_write_line(zl, color_wave)
elif ws == 15:
# Notthing
pass
elif ws == 16:
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [12,+hy], [36,-hy], [48,0]]
one_write_line(zl, color_wave)
elif ws == 17:
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [12,+hy], [24,0], [48,0]]
one_write_line(zl, color_wave)
elif ws == 18:
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [12,+hy], [24,0], [36,+hy], [48,0]]
one_write_line(zl, color_wave)
elif ws == 19:
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [12,+hy], [12,0], [24,0], [36,+hy], [36,0], [48,0]]
one_write_line(zl, color_wave)
elif ws == 20:
# 直線部分を描く
xp = zone_xs[ws] +xb*2
yp = zone_yl[ws]
zl = [[xp,yp], [7,+hy], [21,-hy], [28,0]]
one_write_line(zl, color_wave)
elif ws == 21:
# 直線部分を描く
xp = zone_xs[ws] +xb*2
yp = zone_yl[ws]
zl = [[xp,yp], [7,+hy], [14,0], [21,+hy], [28,0]]
one_write_line(zl, color_wave)
elif ws == 22:
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
# 起点 1 2 3 4 5 6 7 8
zl = [[xp,yp], [0,+hy], [12,+hy], [12,0], [24,0], [24,+hy], [36,+hy], [36,0], [48,0]]
one_write_line(zl, color_wave)
elif ws == 23:
# Notthing
pass
elif ws == 24:
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [24,+hy], [24,-hy], [48,0]]
one_write_line(zl, color_wave)
elif ws == 25:
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [24,+hy], [24,0], [48,0]]
one_write_line(zl, color_wave)
elif ws == 26:
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [24,+hy], [24,0], [48,+hy], [48,0]]
one_write_line(zl, color_wave)
elif ws == 27:
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [12,+hy], [12,0], [24,0], [36,+hy], [36,0], [48,0]]
one_write_line(zl, color_wave)
elif ws == 28:
# 直線部分を描く
xp = zone_xs[ws] +xb*2
yp = zone_yl[ws]
zl = [[xp,yp], [14,+hy], [14,-hy], [28,0]]
one_write_line(zl, color_wave)
elif ws == 29:
# 直線部分を描く
xp = zone_xs[ws] +xb*2
yp = zone_yl[ws]
zl = [[xp,yp], [14,+hy], [14,0], [28,+hy], [28,0]]
one_write_line(zl, color_wave)
elif ws == 30:
# 直線部分を描く
xp = zone_xs[ws] +xb*2
yp = zone_yl[ws]
zl = [[xp,yp], [0,+hy], [12,+hy], [12,0], [36,0]]
one_write_line(zl, color_wave)
elif ws == 31:
# Nothing
pass
if __name__=='__main__':
###########################################################
print('gc.mem_free() = ', gc.mem_free()) # メモリ利用状況
###########################################################
LCD = LCD_3inch5()
LCD.bl_ctrl(100)
# カラー表示テスト
lcd_color_list = [LCD.BLACK, LCD.RED, LCD.GREEN, LCD.BLUE, LCD.YELLOW,\
LCD.PURPLE, LCD.BLUEGREEN, LCD.GRAY, LCD.WHITE]
for i in range(len(lcd_color_list)):
LCD.fill(lcd_color_list[i])
LCD.show()
time.sleep_ms(500)
LCD.fill(LCD.WHITE)
###########################################################
print('gc.mem_free() = ', gc.mem_free()) # メモリ利用状況
###########################################################
print('LCD.rotate = ', LCD.rotate)
# ws 波形の表示
LCD.fill(LCD.WHITE)
dsp_main_menu()
tab('ws', [6,240], 4, LCD.BLACK, LCD.BLUEGREEN, LCD.RED)
for ws in range(31):
wave_form(ws, LCD.WHITE, LCD.BLACK)
LCD.show()
time.sleep_ms(200)
time.sleep(2)
# alg patarn 表示
LCD.fill(LCD.WHITE)
ONLY_DOWN = 0
ONLY_UP = 1
BOTH = 2
for i in range(8):
alg = i
alg_on_stage = alg # 拡大して上半分に表示したい alg番号
stage = alg_on_stage *3 + BOTH # 暗号化
alg_patarn(alg, stage, LCD.BLACK, LCD.YELLOW, LCD.RED)
LCD.show()
time.sleep(1)
LCD.fill(LCD.WHITE)
dsp_main_menu()
tab('ALG ', [6,240], 4, LCD.BLACK, LCD.BLUEGREEN, LCD.RED)
###########################################################
print('gc.mem_free() = ', gc.mem_free()) # メモリ利用状況
###########################################################
LCD.fill(LCD.WHITE)
dsp_main_menu()
tab('ALG ', [6,240], 4, LCD.BLACK, LCD.BLUEGREEN, LCD.RED)
alg = 2
alg_on_stage = alg # 拡大して上半分に表示したい alg番号
stage = alg_on_stage *3 + BOTH # 暗号化
for i in range(8):
alg_patarn(i, stage, LCD.BLACK, LCD.YELLOW, LCD.RED)
LCD.show()
time.sleep(2)
###########################################################
print('gc.mem_free() = ', gc.mem_free()) # メモリ利用状況
###########################################################
if LCD.rotate == 0 or LCD.rotate == 180: # 縦長表示
# ADSR グラフから入力 if LCD.rotate == 0 or LCD.rotate == 180: # 縦長表示 の直後
# 座標開始位置
xs = 30 # x_start
# ys = 30 # y_start
# ys = 260 # y_start
ys = 270 # y_start
# ADSR 上限値設定
max_TL = 48 # 最小は 63 だが 実用的に 48 とする
max_SL = 15
max_AR = 15
max_DR = 15
max_SR = 15
max_RR = 15
# ADSR 初期値設定
now_TL = 0
now_SL = 15
now_AR = 15
now_DR = 15
now_SR = 8
now_RR = 8
now_KSL = 3
now_KSR = 0
# タッチパネル初期設定
col_old = 6
row_old = 24
cell_cnt = 0
edt_mode = '' # AT TL DR(SL) SR RR
cnt_TL = 0
cnt_SL = 0
cnt_AR = 0
cnt_DR = 0
cnt_SR = 0
cnt_RR = 0
cnt_KSL0 = 0
cnt_KSL1 = 0
cnt_KSL2 = 0
cnt_KSL3 = 0
cnt_KSR0 = 0
cnt_KSR1 = 0
while True:
get = LCD.touch_get()
if get != None:
# タッチされているなら
X_Point = get[0]
Y_Point = get[1]
if edt_mode == '':
if in_zone(zone_ARs, zone_ARe, X_Point, Y_Point):
# AR ポイント周辺ならば
print('zone_AR')
cnt_AR += 1
if cnt_AR >= 3:
# 差分検出用に現在値を記録(Pixcel値)
edt_Xs = X_Point
edt_mode = 'AR'
cnt_AR = 0
elif in_zone(zone_RRs, zone_RRe, X_Point, Y_Point):
# RR ポイント周辺ならば
print('zone_RR')
cnt_RR += 1
if cnt_RR >= 3:
# 差分検出用に現在値を記録(Pixcel値)
edt_Xs = X_Point
edt_mode = 'RR'
cnt_RR = 0
elif in_zone(zone_TLs, zone_TLe, X_Point, Y_Point):
# TL ポイント周辺ならば
print('zone_TL')
cnt_TL += 1
if cnt_TL >= 3:
# 差分検出用に現在値を記録(Pixcel値)
edt_Ys = Y_Point
edt_mode = 'TL'
cnt_TL = 0
elif in_zone(zone_SRs, zone_SRe, X_Point, Y_Point):
# SR ポイント周辺ならば
print('zone_SR')
cnt_SR += 1
if cnt_SR >= 3:
# 差分検出用に現在値を記録(Pixcel値)
edt_Ys = Y_Point
edt_mode = 'SR'
cnt_SR = 0
elif in_zone(zone_DRs, zone_DRe, X_Point, Y_Point):
# DR ポイント周辺ならば
print('zone_DR')
cnt_DR += 1
if cnt_DR >= 3:
# 差分検出用に現在値を記録(Pixcel値)
edt_Xs = X_Point
edt_Ys = Y_Point
edt_mode = 'DR'
cnt_DR = 0
elif in_zone(zone_KSL0s, zone_KSL0e, X_Point, Y_Point):
# KSL0 ポイントならば
print('zone_KSL0')
cnt_KSL0 += 1
if cnt_KSL0 >= 3:
# 差分検出用に現在値を記録(Pixcel値)
edt_Xs = X_Point
edt_Ys = Y_Point
now_KSL = 0
# KSL 数値表示 背景を黄色にし、文字色は紫色
dsp_KSL(now_KSL)
edt_mode = 'KSL0'
cnt_KSL0 = 0
elif in_zone(zone_KSL1s, zone_KSL1e, X_Point, Y_Point):
# KSL1 ポイントならば
print('zone_KSL1')
cnt_KSL1 += 1
if cnt_KSL1 >= 3:
# 差分検出用に現在値を記録(Pixcel値)
edt_Xs = X_Point
edt_Ys = Y_Point
now_KSL = 1
# KSL 数値表示 背景を黄色にし、文字色は紫色
dsp_KSL(now_KSL)
edt_mode = 'KSL1'
cnt_KSL1 = 0
elif in_zone(zone_KSL2s, zone_KSL2e, X_Point, Y_Point):
# KSL2 ポイントならば
print('zone_KSL2')
cnt_KSL2 += 1
if cnt_KSL2 >= 3:
# 差分検出用に現在値を記録(Pixcel値)
edt_Xs = X_Point
edt_Ys = Y_Point
now_KSL = 2
# KSL 数値表示 背景を黄色にし、文字色は紫色
dsp_KSL(now_KSL)
edt_mode = 'KSL2'
cnt_KSL2 = 0
elif in_zone(zone_KSL3s, zone_KSL3e, X_Point, Y_Point):
# KSL3 ポイントならば
print('zone_KSL3')
cnt_KSL3 += 1
if cnt_KSL3 >= 3:
# 差分検出用に現在値を記録(Pixcel値)
edt_Xs = X_Point
edt_Ys = Y_Point
now_KSL = 3
# KSL 数値表示 背景を黄色にし、文字色は紫色
dsp_KSL(now_KSL)
edt_mode = 'KSL3'
cnt_KSL3 = 0
elif in_zone(zone_KSR0s, zone_KSR0e, X_Point, Y_Point):
# KSR0 ポイントならば
print('zone_KSR0')
cnt_KSR0 += 1
if cnt_KSR0 >= 3:
# 差分検出用に現在値を記録(Pixcel値)
edt_Xs = X_Point
edt_Ys = Y_Point
now_KSR = 0
# KSL 数値表示 背景を黄色にし、文字色は紫色
dsp_KSR(now_KSR)
edt_mode = 'KSR0'
cnt_KSR0 = 0
elif in_zone(zone_KSR1s, zone_KSR1e, X_Point, Y_Point):
# KSR1 ポイントならば
print('zone_KSR1')
cnt_KSR1 += 1
if cnt_KSR1 >= 3:
# 差分検出用に現在値を記録(Pixcel値)
edt_Xs = X_Point
edt_Ys = Y_Point
now_KSR = 1
# KSL 数値表示 背景を黄色にし、文字色は紫色
dsp_KSR(now_KSR)
edt_mode = 'KSR1'
cnt_KSR1 = 0
elif edt_mode == 'AR':
if in_zone(guide_ARs, guide_ARe, X_Point, Y_Point):
# AR 編集ゾーンならば
print('edt_mode AR')
if edt_Xs != X_Point:
# 操作感度を上げる
# edt_def = int((X_Point - edt_Xs) /4)
edt_def = int((X_Point - edt_Xs) /3)
now_AR += edt_def
# 範囲に収める処理
now_AR = 0 if now_AR < 0 else now_AR
now_AR = 15 if now_AR > 15 else now_AR
# AR ポジション更新
pos_AR = [now_AR, 63]
# 座標位置を3倍の位置に展開
pos_AR = [xs +pos_AR[0] *3, ys +pos_AR[1] *3]
# AR ポインタ 倍角で表示
LCD.fill_rect(pos_AR[0], pos_AR[1], 16, 16, LCD.PURPLE)
# AR 数値表示 文字領域を 白色にしてから表示
dspAR(now_AR)
# edt_Xs 更新
edt_Xs = pos_AR[0]
elif edt_mode == 'RR':
if in_zone(guide_RRs, guide_RRe, X_Point, Y_Point):
# RR 編集ゾーンならば
print('edt_mode RR')
if edt_Xs != X_Point:
# 操作感度を上げる
# edt_def = int((X_Point - edt_Xs) /4)
edt_def = int((X_Point - edt_Xs) /3)
now_RR -= edt_def
# 範囲に収める処理
now_RR = 0 if now_RR < 0 else now_RR
now_RR = 15 if now_RR > 15 else now_RR
# RR ポジション更新 計算方法は項目ごとに異なるので注意
pos_RR = [79 -now_RR, 63]
# 座標位置を3倍の位置に展開
pos_RR = [xs +pos_RR[0] *3, ys +pos_RR[1] *3]
# RR ポインタ 倍角で表示
LCD.fill_rect(pos_RR[0], pos_RR[1], 16, 16, LCD.PURPLE)
# RR 数値表示 文字領域を 白色にしてから表示
dspRR(now_RR)
# edt_Xs 更新
edt_Xs = pos_RR[0]
elif edt_mode == 'TL':
if in_zone(guide_TLs, guide_TLe, X_Point, Y_Point):
# TL 編集ゾーンならば
print('edt_mode TL')
if edt_Ys != Y_Point:
# 操作感度を下げる
# edt_def = int((X_Point - edt_Xs) /4)
edt_def = int((Y_Point - edt_Ys) /8)
now_TL += edt_def
# 範囲に収める処理
now_TL = 0 if now_TL < 0 else now_TL
now_TL = 48 if now_TL > 48 else now_TL
# RR ポジション更新 計算方法は項目ごとに異なるので注意
pos_TL = [23, now_TL]
# 座標位置を3倍の位置に展開
pos_TL = [xs +pos_TL[0] *3, ys +pos_TL[1] *3]
# RR ポインタ 倍角で表示
LCD.fill_rect(pos_TL[0], pos_TL[1], 16, 16, LCD.PURPLE)
# RR 数値表示 文字領域を 白色にしてから表示
dspTL(now_TL)
# edt_Xs 更新
edt_Ys = pos_TL[1]
elif edt_mode == 'SR':
if in_zone(guide_SRs, guide_SRe, X_Point, Y_Point):
# SR 編集ゾーンならば
print('edt_mode SR')
if edt_Ys != Y_Point:
# 操作感度を上げる
# edt_def = int((X_Point - edt_Xs) /4)
edt_def = int((Y_Point - edt_Ys) /3)
now_SR += edt_def
# 範囲に収める処理
now_SR = 0 if now_SR < 0 else now_SR
now_SR = 15 if now_SR > 15 else now_SR
# SR ポジション更新 計算方法は項目ごとに異なるので注意
pos_SR = [55, now_TL +now_SL +now_SR]
# 座標位置を3倍の位置に展開
pos_SR = [xs +pos_SR[0] *3, ys +pos_SR[1] *3]
# SR ポインタ 倍角で表示
LCD.fill_rect(pos_SR[0], pos_SR[1], 16, 16, LCD.PURPLE)
# SR 数値表示 文字領域を 白色にしてから表示
dspSR(now_SR)
# edt_Xs 更新
edt_Ys = pos_SR[1]
elif edt_mode == 'DR':
if in_zone(guide_DRs, guide_DRe, X_Point, Y_Point):
# DR 編集ゾーンならば
print('edt_mode DR')
if edt_Ys != Y_Point:
# 操作感度を下げる
# edt_def = int((X_Point - edt_Xs) /4)
edt_def_X = int((X_Point - edt_Xs) /3)
edt_def_Y = int((Y_Point - edt_Ys) /3)
now_DR -= edt_def_X
now_SL += edt_def_Y
# 範囲に収める処理
now_DR = 0 if now_DR < 0 else now_DR
now_DR = 15 if now_DR > 15 else now_DR
now_SL = 0 if now_SL < 0 else now_SL
now_SL = 15 if now_SL > 15 else now_SL
# DR ポジション更新 計算方法は項目ごとに異なるので注意
pos_DR = [47 -now_DR, now_TL +now_SL]
# 座標位置を3倍の位置に展開
pos_DR = [xs +pos_DR[0] *3, ys +pos_DR[1] *3]
# DR ポインタ 倍角で表示
# LCD.fill_rect(pos_DR[0], pos_DR[1], 16, 16, LCD.PURPLE)
LCD.fill_rect(pos_DR[0], pos_DR[1], 8, 8, LCD.PURPLE)
# SL 数値表示 文字領域を 白色にしてから表示
dspSL(now_SL)
# DR 数値表示 文字領域を 白色にしてから表示
dspDR(now_DR)
# edt_Xs 更新
edt_Xs = pos_DR[0]
edt_Ys = pos_DR[1]
else: # get == None
edt_mode = ''
# タッチした状態からスタートするとバグる可能性あり
# タッチされていないなら、設定内容を表示する
# 座標設定(Pixcel単位)
pos_TL = [23, now_TL]
pos_AR = [now_AR, 63]
pos_DR = [47 -now_DR, now_TL +now_SL]
pos_SR = [55, now_TL +now_SL +now_SR]
pos_RR = [79 -now_RR, 63]
# 座標位置を3倍の位置に展開
pos_TL = [xs +pos_TL[0] *3, ys +pos_TL[1] *3]
pos_AR = [xs +pos_AR[0] *3, ys +pos_AR[1] *3]
pos_DR = [xs +pos_DR[0] *3, ys +pos_DR[1] *3]
pos_SR = [xs +pos_SR[0] *3, ys +pos_SR[1] *3]
pos_RR = [xs +pos_RR[0] *3, ys +pos_RR[1] *3]
# 編集ゾーン設定( 8 Pixcel四方)
# 2025/07/20 16 Pixcel に変更 TOUCH
zone_TLs = [None] *2
zone_TLs[0] = 0 if pos_TL[0] < TOUCH else pos_TL[0] - TOUCH
zone_TLs[1] = 0 if pos_TL[1] < TOUCH else pos_TL[1] - TOUCH
zone_TLe = [None] *2
zone_TLe[0] = 319 if (pos_TL[0] + TOUCH) >= 320 else pos_TL[0] + TOUCH
zone_TLe[1] = 479 if (pos_TL[1] + TOUCH) >= 480 else pos_TL[1] + TOUCH
zone_ARs = [None] *2
zone_ARs[0] = 0 if pos_AR[0] < TOUCH else pos_AR[0] - TOUCH
zone_ARs[1] = 0 if pos_AR[1] < TOUCH else pos_AR[1] - TOUCH
zone_ARe = [None] *2
zone_ARe[0] = 319 if (pos_AR[0] + TOUCH) >= 320 else pos_AR[0] + TOUCH
zone_ARe[1] = 479 if (pos_AR[1] + TOUCH) >= 480 else pos_AR[1] + TOUCH
zone_DRs = [None] *2
zone_DRs[0] = 0 if pos_DR[0] < TOUCH else pos_DR[0] - TOUCH
zone_DRs[1] = 0 if pos_DR[1] < TOUCH else pos_DR[1] - TOUCH
zone_DRe = [None] *2
zone_DRe[0] = 319 if (pos_DR[0] + TOUCH) >= 320 else pos_DR[0] + TOUCH
zone_DRe[1] = 479 if (pos_DR[1] + TOUCH) >= 480 else pos_DR[1] + TOUCH
zone_SRs = [None] *2
zone_SRs[0] = 0 if pos_SR[0] < TOUCH else pos_SR[0] - TOUCH
zone_SRs[1] = 0 if pos_SR[1] < TOUCH else pos_SR[1] - TOUCH
zone_SRe = [None] *2
zone_SRe[0] = 319 if (pos_SR[0] + TOUCH) >= 320 else pos_SR[0] + TOUCH
zone_SRe[1] = 479 if (pos_SR[1] + TOUCH) >= 480 else pos_SR[1] + TOUCH
zone_RRs = [None] *2
# 2025/07/21 Change
# zone_RRs[0] = 0 if pos_RR[0] < TOUCH else pos_RR[0] - TOUCH
zone_RRs[0] = 0 if pos_RR[0] < TOUCH *2 else pos_RR[0] - TOUCH *2
zone_RRs[1] = 0 if pos_RR[1] < TOUCH else pos_RR[1] - TOUCH
zone_RRe = [None] *2
zone_RRe[0] = 319 if (pos_RR[0] + TOUCH) >= 320 else pos_RR[0] + TOUCH
zone_RRe[1] = 479 if (pos_RR[1] + TOUCH) >= 480 else pos_RR[1] + TOUCH
########################################################################
# TL AR 直線上の設定範囲
slide_TLs = [23, 0]
slide_TLe = [23, max_TL +2]
slide_ARs = [0, 63]
slide_ARe = [max_AR +1, 63]
# DR SL 操作可能エリア
slide_DRs = [47 -max_DR, now_TL]
slide_DRe = [47 +2, now_TL +max_SL +2]
# SR 直線上の設定範囲
slide_SRs = [55, now_TL +now_SL]
slide_SRe = [55, now_TL +now_SL +max_SR +2]
# RR 直線上の設定範囲
slide_RRs = [63, 63]
slide_RRe = [63 +max_RR, 63]
# 操作ガイドを3倍の位置に展開
slide_TLs = [xs +slide_TLs[0] *3, ys +slide_TLs[1] *3]
slide_TLe = [xs +slide_TLe[0] *3, ys +slide_TLe[1] *3]
slide_ARs = [xs +slide_ARs[0] *3, ys +slide_ARs[1] *3]
slide_ARe = [xs +slide_ARe[0] *3, ys +slide_ARe[1] *3]
slide_DRs = [xs +slide_DRs[0] *3, ys +slide_DRs[1] *3]
slide_DRe = [xs +slide_DRe[0] *3, ys +slide_DRe[1] *3]
slide_DRw = slide_DRe[0] - slide_DRs[0]
slide_DRh = slide_DRe[1] - slide_DRs[1]
slide_SRs = [xs +slide_SRs[0] *3, ys +slide_SRs[1] *3]
slide_SRe = [xs +slide_SRe[0] *3, ys +slide_SRe[1] *3]
slide_RRs = [xs +slide_RRs[0] *3, ys +slide_RRs[1] *3]
slide_RRe = [xs +slide_RRe[0] *3, ys +slide_RRe[1] *3]
# 長方形の操作可能範囲 16 Pixcel
guide_TLs = [None] *2
# 2025/07/21 Change
# guide_TLs[0] = 0 if slide_TLs[0] < TOUCH else slide_TLs[0] - TOUCH
guide_TLs[0] = 0 if slide_TLs[0] < TOUCH *2 else slide_TLs[0] - TOUCH *2
guide_TLs[1] = 0 if slide_TLs[1] < TOUCH else slide_TLs[1] - TOUCH
guide_TLe = [None] *2
guide_TLe[0] = 319 if (slide_TLe[0] + TOUCH) >= 320 else slide_TLe[0] + TOUCH
guide_TLe[1] = 479 if (slide_TLe[1] + TOUCH) >= 480 else slide_TLe[1] + TOUCH
guide_ARs = [None] *2
# 2025/07/21 Change
# guide_ARs[0] = 0 if slide_ARs[0] < TOUCH else slide_ARs[0] - TOUCH
guide_ARs[0] = 0 if slide_ARs[0] < TOUCH *2 else slide_ARs[0] - TOUCH *2
guide_ARs[1] = 0 if slide_ARs[1] < TOUCH else slide_ARs[1] - TOUCH
guide_ARe = [None] *2
guide_ARe[0] = 319 if (slide_ARe[0] + TOUCH) >= 320 else slide_ARe[0] + TOUCH
guide_ARe[1] = 479 if (slide_ARe[1] + TOUCH) >= 480 else slide_ARe[1] + TOUCH
guide_DRs = [None] *2
guide_DRs[0] = 0 if slide_DRs[0] < TOUCH else slide_DRs[0] - TOUCH
guide_DRs[1] = 0 if slide_DRs[1] < TOUCH else slide_DRs[1] - TOUCH
guide_DRe = [None] *2
guide_DRe[0] = 319 if (slide_DRe[0] + TOUCH) >= 320 else slide_DRe[0] + TOUCH
guide_DRe[1] = 479 if (slide_DRe[1] + TOUCH) >= 480 else slide_DRe[1] + TOUCH
guide_SRs = [None] *2
# 2025/07/21 Change
# guide_SRs[0] = 0 if slide_SRs[0] < TOUCH else slide_SRs[0] - TOUCH
guide_SRs[0] = 0 if slide_SRs[0] < TOUCH *2 else slide_SRs[0] - TOUCH *2
guide_SRs[1] = 0 if slide_SRs[1] < TOUCH else slide_SRs[1] - TOUCH
guide_SRe = [None] *2
guide_SRe[0] = 319 if (slide_SRe[0] + TOUCH) >= 320 else slide_SRe[0] + TOUCH
guide_SRe[1] = 479 if (slide_SRe[1] + TOUCH) >= 480 else slide_SRe[1] + TOUCH
guide_RRs = [None] *2
# 2025/07/21 Change
# guide_RRs[0] = 0 if slide_RRs[0] < TOUCH else slide_RRs[0] - TOUCH
guide_RRs[0] = 0 if slide_RRs[0] < TOUCH *2 else slide_RRs[0] - TOUCH *2
guide_RRs[1] = 0 if slide_RRs[1] < TOUCH else slide_RRs[1] - TOUCH
guide_RRe = [None] *2
guide_RRe[0] = 319 if (slide_RRe[0] + TOUCH) >= 320 else slide_RRe[0] + TOUCH
guide_RRe[1] = 479 if (slide_RRe[1] + TOUCH) >= 480 else slide_RRe[1] + TOUCH
LCD.fill(LCD.WHITE)
dsp_main_menu()
dsp_sub_menu()
tab('adsr', [166,240], 4, LCD.BLACK, LCD.BLUEGREEN, LCD.RED)
# SR SL 操作ガイドを表示
LCD.fill_rect(slide_DRs[0], slide_DRs[1], slide_DRw, slide_DRh, LCD.YELLOW)
# slide Line 水平方向のガイド(水平方向に4回線を引く)
# AR RR
for y in range(4):
LCD.line(slide_ARs[0], slide_ARs[1]+y, slide_ARe[0]+4, slide_ARe[1]+y, LCD.GREEN)
LCD.line(slide_RRs[0], slide_RRs[1]+y, slide_RRe[0]+4, slide_RRe[1]+y, LCD.GREEN)
# slide Line 垂直方向のガイド(垂直方向に4回線を引く)
# TL SR
for x in range(4):
LCD.line(slide_TLs[0]+x, slide_TLs[1], slide_TLe[0]+x, slide_TLe[1]+4, LCD.GREEN)
LCD.line(slide_SRs[0]+x, slide_SRs[1], slide_SRe[0]+x, slide_SRe[1]+4, LCD.GREEN)
# ADSR Line
for x in range(4):
for y in range(4):
LCD.line(pos_AR[0]+x, pos_AR[1]+y, pos_TL[0]+x, pos_TL[1]+y, LCD.BLUE)
LCD.line(pos_TL[0]+x, pos_TL[1]+y, pos_DR[0]+x, pos_DR[1]+y, LCD.BLUE)
LCD.line(pos_DR[0]+x, pos_DR[1]+y, pos_SR[0]+x, pos_SR[1]+y, LCD.BLUE)
LCD.line(pos_SR[0]+x, pos_SR[1]+y, pos_RR[0]+x, pos_RR[1]+y, LCD.BLUE)
# AR TL DR SR RR の操作ポイント(サイズ 8x8)を表示する
LCD.fill_rect(pos_TL[0], pos_TL[1], 8, 8, LCD.RED)
LCD.fill_rect(pos_AR[0], pos_AR[1], 8, 8, LCD.RED)
LCD.fill_rect(pos_DR[0], pos_DR[1], 8, 8, LCD.RED)
LCD.fill_rect(pos_SR[0], pos_SR[1], 8, 8, LCD.RED)
LCD.fill_rect(pos_RR[0], pos_RR[1], 8, 8, LCD.RED)
# AR TL SL DR SR RR の数値を表示する(編集中に再表示することに留意)
dspAR(now_AR)
dspRR(now_RR)
dspTL(now_TL)
dspDR(now_DR)
dspSL(now_SL)
dspSR(now_SR)
# KSL タッチゾーンの設定
zone_KSL0s = [20,ys+130]
zone_KSL0e = [zone_KSL0s[0] +16*3,zone_KSL0s[1]+20]
zone_KSL1s = [20,ys+90]
zone_KSL1e = [zone_KSL1s[0] +16*3,zone_KSL1s[1]+20]
zone_KSL2s = [20,ys+110]
zone_KSL2e = [zone_KSL2s[0] +16*3,zone_KSL2s[1]+20]
zone_KSL3s = [20,ys+70]
zone_KSL3e = [zone_KSL3s[0] +16*3,zone_KSL3s[1]+20]
# KSL の表示
LCD.text_scaled(f'KSL', 20,80+230,LCD.RED, 2)
# KSL 数値表示 文字領域を 緑色にしてから表示、文字色は一旦灰色
LCD.fill_rect(20,ys+70,16*3,20*4, LCD.GREEN)
LCD.text_scaled(f'6.0', 20,ys+70 +2,LCD.GRAY, 2) # KSL=3
LCD.text_scaled(f'3.0', 20,ys+90 +2,LCD.GRAY, 2) # KSL=1
LCD.text_scaled(f'1.5', 20,ys+110 +2,LCD.GRAY, 2) # KSL=2
LCD.text_scaled(f'0.0', 20,ys+130 +2,LCD.GRAY, 2) # KSL=0
# KSL 設定値の表示
dsp_KSL(now_KSL)
# KSR タッチゾーンの設定
zone_KSR0s = [240,ys+120]
zone_KSR0e = [zone_KSR0s[0] +16*3,zone_KSR0s[1]+20]
zone_KSR1s = [240,ys+100]
zone_KSR1e = [zone_KSR1s[0] +16*3,zone_KSR1s[1]+20]
# KSR エリアの表示
LCD.text_scaled(f'KSR',240,ys+80,LCD.RED, 2)
# KSR 数値表示 文字領域を 緑色にしてから表示、文字色は一旦灰色
LCD.fill_rect(240,ys+100,16*3,20*2, LCD.GREEN)
LCD.text_scaled(f'On',240,ys+100,LCD.GRAY, 2) # KSR=1
LCD.text_scaled(f'Off',240,ys+120,LCD.GRAY, 2) # KSR=0
dsp_KSR(now_KSR)
LCD.show()
else: # LCD.rotate == 90 or LCD.rotate == 270 : 横長表示
#color BRG
LCD.fill(LCD.WHITE)
LCD.fill_rect(140,5,200,30,LCD.RED)
# LCD.text("Raspberry Pi Pico",170,17,LCD.WHITE)
# 黄文字表示
LCD.text("Raspberry Pi Pico",170,17,LCD.YELLOW)
LCD.text("3.5' IPS LCD TEST",170,47,LCD.BLACK)
display_color = 0x001F
for i in range(len("Raspberry Pi Pico")):
LCD.fill_rect(i*16+108,70,14,20,(display_color))
display_color = display_color << 1
# 2025/06/29:Add 2倍の拡大文字を表示
LCD.text_scaled("Raspberry Pi Pico",108,72,LCD.BLUEGREEN, 2)
# 右下 隅 のセルを赤色にする
LCD.fill_rect(59 *8, 19 *8, 8, 8, LCD.RED)
LCD.fill_rect(59 *8, 39 *8, 8, 8, LCD.RED)
display_color = 0x001F
for i in range(0,12):
# LCD.fill_rect(i*30+60,100,30,50,(display_color))
LCD.fill_rect(i*30+60,120,30,50,(display_color))
display_color = display_color << 1
LCD.show()
# Touch Point 表示
while True:
get = LCD.touch_get()
if get != None:
# 8bits 単位のセルに変換
X_Point = int(get[0] /8)
Y_Point = int(get[1] /8)
if X_Point_Old != X_Point or Y_Point_Old != Y_Point:
# 前回と異なるセルならば
# 前回のセルを黄色にする
if Y_Point_Old < 40:
# LCD.show_up エリアならば
LCD.fill_rect(X_Point_Old *8, Y_Point_Old *8, 8, 8, LCD.YELLOW)
LCD.show()
# 今回のセルを赤色にする
if Y_Point < 40:
# LCD.show_up エリアならば
LCD.fill_rect(X_Point *8, Y_Point *8, 8, 8, LCD.RED)
LCD.show()
# Old Pointer 更新
X_Point_Old = X_Point
Y_Point_Old = Y_Point
time.sleep_ms(100)
'''
### 調整用ポイントの座標の設定 if LCD.rotate == 0 or LCD.rotate == 180: # 縦長表示 の直後
# 調整用ポイントの座標の設定
pos40_40 = [ 40, 40]
pos280_40 = [280, 40]
pos40_440 = [ 40,440]
pos280_440 = [280,440]
#color BRG
LCD.fill(LCD.WHITE)
# 調整用ポイントの座標を 5Pixel x 5Pixel で表示する
LCD.fill_rect(pos40_40[0]-2, pos40_40[1]-2, 5, 5, LCD.RED)
LCD.fill_rect(pos280_40[0]-2, pos280_40[1]-2, 5, 5, LCD.RED)
LCD.fill_rect(pos40_440[0]-2, pos40_440[1]-2, 5, 5, LCD.RED)
LCD.fill_rect(pos280_440[0]-2, pos280_440[1]-2, 5, 5, LCD.RED)
LCD.show()
scope = 10 # 移動平均 Average 個数
X_listT = [None] * scope
Y_listT = [None] * scope
X_listL = [None] * scope
Y_listL = [None] * scope
cnt_scope = 0
# 各ポジションの集計結果を利用可能(10回以上計測)になればセット
flag40_40 = 0
flag280_40 = 0
flag40_440 = 0
flag280_440 = 0
# 測定結果が出たらセット
flag_result = 0
# Touch Point 表示
while True:
get = LCD.touch_get()
if get != None:
# タッチされているなら
if TOUCH_ADJ:
# 調整モードなら、タッチ生データ get[2], get[3] を取得
X_PointL = get[0]
Y_PointL = get[1]
X_PointT = get[2]
Y_PointT = get[3]
else:
# LCD 座標変換データ取得
X_PointL = get[0]
Y_PointL = get[1]
# 移動平均計算用にデータを記録
X_listL[cnt_scope] = X_PointL
Y_listL[cnt_scope] = Y_PointL
X_listT[cnt_scope] = X_PointT
Y_listT[cnt_scope] = Y_PointT
if flag_result == 0:
cnt_scope += 1
if cnt_scope >= scope:
cnt_scope = 0
if flag_result == 0:
flag_result = 1
else:
# 移動平均 10 計算
X_totalL = 0
Y_totalL = 0
X_totalT = 0
Y_totalT = 0
for i in range(scope):
X_totalL += X_listL[i]
Y_totalL += Y_listL[i]
X_totalT += X_listT[i]
Y_totalT += Y_listT[i]
# 移動平均 10
X_aveL = int(X_totalL / scope)
Y_aveL = int(Y_totalL / scope)
X_aveT = int(X_totalT / scope)
Y_aveT = int(Y_totalT / scope)
# 領域別に表示
# 初期状態 中心と思われる 4800 4700 の +400 +400
if X_aveT < 5200 and Y_aveT < 5100:
# pos40_40 の 値を収録
ave40_40 = [X_aveT, Y_aveT]
flag40_40 += 1
if flag40_40 >= 10:
# 文字領域を 白色にしてから表示
LCD.fill_rect(20,80,16*8,80, LCD.WHITE)
LCD.text_scaled(f'XL:{X_aveL}',20, 80,LCD.BLUE, 2)
LCD.text_scaled(f'XT:{X_aveT}',20,100,LCD.BLUE, 2)
LCD.text_scaled(f'YL:{Y_aveL}',20,120,LCD.BLUE, 2)
LCD.text_scaled(f'YT:{Y_aveT}',20,140,LCD.BLUE, 2)
# 初期状態 中心と思われる 7350 4700 の -400 +400
elif X_aveT > 6950 and Y_aveT < 5100:
# pos280_40 の 値を収録
ave280_40 = [X_aveT, Y_aveT]
flag280_40 += 1
if flag280_40 >= 10:
# 文字領域を 白色にしてから表示
LCD.fill_rect(180,80,16*8,80, LCD.WHITE)
LCD.text_scaled(f'XL:{X_aveL}',180, 80,LCD.BLUE, 2)
LCD.text_scaled(f'XT:{X_aveT}',180,100,LCD.BLUE, 2)
LCD.text_scaled(f'YL:{Y_aveL}',180,120,LCD.BLUE, 2)
LCD.text_scaled(f'YT:{Y_aveT}',180,140,LCD.BLUE, 2)
# 初期状態 中心と思われる 4800 7700 の +400 -400
elif X_aveT < 5200 and Y_aveT > 7300:
# pos40_440 の 値を収録
ave40_440 = [X_aveT, Y_aveT]
flag40_440 += 1
if flag40_440 >= 10:
# 文字領域を 白色にしてから表示
LCD.fill_rect(20,340,16*8,80, LCD.WHITE)
LCD.text_scaled(f'XL:{X_aveL}',20,340,LCD.BLUE, 2)
LCD.text_scaled(f'XT:{X_aveT}',20,360,LCD.BLUE, 2)
LCD.text_scaled(f'YL:{Y_aveL}',20,380,LCD.BLUE, 2)
LCD.text_scaled(f'YT:{Y_aveT}',20,400,LCD.BLUE, 2)
# 初期状態 中心と思われる 7350 7700 の -400 -400
elif X_aveT > 6950 and Y_aveT > 7300:
# pos280_440 の 値を収録
ave280_440 = [X_aveT, Y_aveT]
flag280_440 += 1
if flag280_440 >= 10:
# 文字領域を 白色にしてから表示
LCD.fill_rect(180,340,16*8,80, LCD.WHITE)
LCD.text_scaled(f'XL:{X_aveL}',180,340,LCD.BLUE, 2)
LCD.text_scaled(f'XT:{X_aveT}',180,360,LCD.BLUE, 2)
LCD.text_scaled(f'YL:{Y_aveL}',180,380,LCD.BLUE, 2)
LCD.text_scaled(f'YT:{Y_aveT}',180,400,LCD.BLUE, 2)
# 四隅のデータが揃ったら結果を表示する
if flag280_40 >= 10 and flag280_40 >= 10 and flag40_440 >= 10 and flag280_440 >= 10:
LCD.fill_rect(10,200,310,120, LCD.WHITE)
LCD.text_scaled(f'Set def Result Data',10,200,LCD.BLACK, 2)
LCD.text_scaled(f'def touch_get(self):',10,220,LCD.BLACK, 2)
LCD.text_scaled(f'rt40_40 ={ave40_40[0]},{ave40_40[1]}',10,240,LCD.BLACK, 2)
LCD.text_scaled(f'rt280_40 ={ave280_40[0]},{ave280_40[1]}',10,260,LCD.BLACK, 2)
LCD.text_scaled(f'rt40_440 ={ave40_440[0]},{ave40_440[1]}',10,280,LCD.BLACK, 2)
LCD.text_scaled(f'rt280_440={ave280_440[0]},{ave280_440[1]}',10,300,LCD.BLACK, 2)
LCD.show()
else:
cnt_scope = 0
flag_result = 0
time.sleep_ms(50)
###
Excel もどき表示とセル選択実験 LCD.rotate == 0 180: # 縦長表示
# Parameter List を生成 Row:24 Col:6
param_list24_6 = [None] *24
for i in range(24):
param_list24_6[i] = [i, i+1, i+2, i+3, i+4, i+5]
print('param_list24_6 = ', param_list24_6)
h = 20 # 行間隔 20Pixel
w = 16 # 文字間隔 16Pixel
LCD.fill(LCD.BLACK)
for i in range(24): # 6列表示を 24行繰り返す
# LCD.fill_rect(x, y, w, h, LCD.color)
LCD.fill_rect(w*0+1, h*i+1,w*5-2,h-2,LCD.BLUEGREEN) # Column 0
LCD.fill_rect(w*5+1, h*i+1,w*3-2,h-2,LCD.BLUEGREEN) # Column 1
LCD.fill_rect(w*8+1, h*i+1,w*3-2,h-2,LCD.BLUEGREEN) # Column 2
LCD.fill_rect(w*11+1,h*i+1,w*3-2,h-2,LCD.BLUEGREEN) # Column 3
LCD.fill_rect(w*14+1,h*i+1,w*3-2,h-2,LCD.BLUEGREEN) # Column 4
LCD.fill_rect(w*17+1,h*i+1,w*3-2,h-2,LCD.BLUEGREEN) # Column 5
LCD.text_scaled(f'{param_list24_6[i][0]:>5}',w*0, h*i+3,LCD.BLACK, 2)
LCD.text_scaled(f'{param_list24_6[i][1]:>3}',w*5, h*i+3,LCD.BLACK, 2)
LCD.text_scaled(f'{param_list24_6[i][2]:>3}',w*8, h*i+3,LCD.BLACK, 2)
LCD.text_scaled(f'{param_list24_6[i][3]:>3}',w*11,h*i+3,LCD.BLACK, 2)
LCD.text_scaled(f'{param_list24_6[i][4]:>3}',w*14,h*i+3,LCD.BLACK, 2)
LCD.text_scaled(f'{param_list24_6[i][5]:>3}',w*17,h*i+3,LCD.BLACK, 2)
LCD.show()
col_old = 6
row_old = 24
cell_cnt = 0
while True:
get = LCD.touch_get()
if get != None:
X_Point = get[0]
Y_Point = get[1]
column = int(X_Point / w) # 文字数としての列
row = int(Y_Point / h)
# parame_list としての列 col = 0 ~ 5 を計算
# column 0-19 ---> col 0-5
if column < 5:
col = 0
else:
col = int((column -5) /3) +1
print(f'column = {column}, col = {col}, row = {row}')
if col == col_old and row == row_old: # 続けて2下位一致なら
cell_cnt += 1
if cell_cnt == 3:
# 同一セルが3回続けて選択されたら有効とする
if col == 0: # Column 0 = 行タイトル
# 通常、行タイトルを編集することは無い?
LCD.fill_rect(w*0+1, h*row+1,w*5-2,h-2,LCD.BLUE) # Column 0
LCD.text_scaled(f'{param_list24_6[row][0]:>5}',w*0, h*row+3,LCD.RED, 2)
else: # Column 1, 2, 3, 4, 5
# csp = col_start_pixcel
cspt = w * (col *3 +2)
cspr = cspt +1
# LCD.fill_rect(w*5+1, h*row+1,w*3-2,h-2,LCD.BLUE) # Column 1
LCD.fill_rect(cspr, h*row+1,w*3-2,h-2,LCD.BLUE)
# LCD.text_scaled(f'{param_list24_6[row][1]:>3}',w*5, h*row+3,LCD.RED, 2)
LCD.text_scaled(f'{param_list24_6[row][col]:>3}',cspt, h*row+3,LCD.RED, 2)
LCD.show()
col_old = 6
row_old = 24
cell_cnt = 0
else:
col_old = col
row_old = row
time.sleep_ms(50)
###
X_Point_Old = 0
Y_Point_Old = 0
print('LCD.rotate = ', LCD.rotate)
if LCD.rotate == 0 or LCD.rotate == 180: # 縦長表示
LCD.fill(LCD.WHITE)
LCD.fill_rect(60,75,200,30,LCD.RED)
LCD.text("Raspberry Pi Pico",90,87,LCD.WHITE)
LCD.text("3.5' IPS LCD TEST",90,127,LCD.BLACK)
display_color = 0x001F
for i in range(0,12):
# LCD.fill_rect(i*20+35,170,30,120,(display_color))
LCD.fill_rect(i*20+35,170,30,70,(display_color))
display_color = display_color << 1
LCD.show()
while True:
get = LCD.touch_get()
if get != None:
X_Point = get[0]
Y_Point = get[1]
if Y_Point > 360:
# LCD.fill(LCD.WHITE)
LCD.fill_rect(0,240,320,240,LCD.WHITE)
if X_Point < 80:
LCD.fill_rect(10,150+240,75,50,LCD.RED)
LCD.text("Button0",20,170+240,LCD.WHITE)
elif X_Point < 160:
LCD.fill_rect(85,150+240,75,50,LCD.RED)
LCD.text("Button1",100,170+240,LCD.WHITE)
elif X_Point < 240:
LCD.fill_rect(160,150+240,75,50,LCD.RED)
LCD.text("Button2",175,170+240,LCD.WHITE)
else:
LCD.fill_rect(235,150+240,75,50,LCD.RED)
LCD.text("Button3",250,170+240,LCD.WHITE)
else : # get == None
# LCD.fill(LCD.WHITE)
LCD.fill_rect(0,240,320,240,LCD.WHITE)
LCD.text("Button0",20,170+240,LCD.BLACK)
LCD.text("Button1",100,170+240,LCD.BLACK)
LCD.text("Button2",175,170+240,LCD.BLACK)
LCD.text("Button3",250,170+240,LCD.BLACK)
LCD.show()
###
# 当初のプログラム Button 表示 LCD.rotate == 90 or 270
while True:
get = LCD.touch_get()
if get != None:
X_Point = get[0]
Y_Point = get[1]
if Y_Point > 240:
# LCD.fill(LCD.WHITE)
LCD.fill_rect(0,160,480,160,LCD.WHITE)
print('X_Point = ', X_Point, ' Y_Point = ', Y_Point)
if X_Point < 120:
LCD.fill_rect(0,60+160,120,100,LCD.RED)
LCD.text("Button0",20,110+160,LCD.WHITE)
elif X_Point < 240:
LCD.fill_rect(120,60+160,120,100,LCD.RED)
LCD.text("Button1",150,110+160,LCD.WHITE)
elif X_Point < 360:
LCD.fill_rect(240,60+160,120,100,LCD.RED)
LCD.text("Button2",270,110+160,LCD.WHITE)
else:
LCD.fill_rect(360,60+160,120,100,LCD.RED)
LCD.text("Button3",400,110+160,LCD.WHITE)
else: # get == None
# LCD_l.fill(LCD.WHITE)
LCD.fill_rect(0,320,480,160,LCD.WHITE)
LCD.text("Button0",20,110+160,LCD.BLACK)
LCD.text("Button1",150,110+160,LCD.BLACK)
LCD.text("Button2",270,110+160,LCD.BLACK)
LCD.text("Button3",400,110+160,LCD.BLACK)
LCD.show()
'''
編集画面の紹介
ADSR編集画面
- YMF825には、16の音源毎に共通項である3要素(BO、LFO、ALG)の編集画面と、4オペレータ17要素(SR、XOF、KSR、RR、DR、AR、SL、TL、KSL、DAM、EAM、DVB、EVB、MUL、DT、WS、FB)について編集する必要があります。
- この画面では、AR、DR、SR、RR、TL、SL、KSL、KSRを、1つの画面で編集しようとするものです。
- これらの要素は、4つのオペレータごとに設定する必要がありますので、この画面に入る前に、どのオペレータに対する編集かを指定する必要があります。
- グラフの偏移点に紫色で四角のポイントが5つあります。ここにタッチペンを当てると大きなポイント表示となり、そのポイントを緑色の直線状にスライドさせることで設定できます。
- DR、とSRについては相互に関連していますので、黄色の四角の範囲で両方を同時に設定できるようになっています。
- KSL、KSRは、段階的な設定値を選ぶようになっています。設定値の場所をタッチするとその設定に切り替わり背景色と文字色が変わります。
- 編集の操作状況は、Facebookに紹介動画があります。(Facebookへのログインが必要です)
- https://www.facebook.com/toshikazu.hyodo/videos/2882343948625022?idorvanity=247733226639836
課題
- 実験的なADSR入力画面を紹介しましたが、実は困った問題があります。
- Raspberry Pi Pico2 は、540KBのSRAMがありますが、紹介したADSR入力画面だけで使い切ってしまい、計画しているPicoSubとのシリアル通信はおろか、入力編集プログラム全体を収容できないのです。
- Pimoroni Pico Plus 2という製品は、8MBのPSRAMがあります。大きなプログラムを扱えそうなので、期待してテスト中なのですが、嵌まり込む問題が発生して困っています。
- 以降は、この問題を解決させるための実験です。お暇な方はご覧ください。
**追加実験その① **
ADSR入力実験プログラムでは、LCD表示とタッチ入力が密接にかかわっていてどちらで問題が発生したのか分かりにくいため、LCD表示の繰り返しテストだけで、Pimoroni Pico Plus 2を動作させたらどうなるかという実験です。
最初は、WS(Wave Shape)波形の表示を繰り返すプログラムです。
嵌りません。
ファイルサイズ50.3KB
touch_lcd_TestOK_OnlyWS.py
########################################################################
# WAVE SHARE Pico-ResTouch-LCD-3.5 Test Program をライブラリとして独立させた
# 用意された main_3inch5.py をテスト・改良
# 2025/08/11 : main_3inch5-scale-712.py からライブラリとして独立させた
# touch_lcd-20250811-1214.py
# タッチパネルの調整と初期画面表示は残した状態
# へその緒をなくした(不要なものを削除した)+ MicroPython用の関数も削除
#
########################################################################
# ①初回の起動で表示しない
# self.spi = SPI(1,6_000_000) をコメントアウトでOK
#
# ②self.rotate = 270 では、タッチしても反転表示しないことを修正した。
# ⑤ で LCDの座標に合わせた形で返すように変更
#
# ③文字を整数倍の拡大文字を表示可能にした。(8x8 のフォントでは、判読困難)
# import framebuf で、ビットマップイメージを作成している関係から
# 8x8 のフォントしか扱えないようだ。
# def text_scaled(self, text, x, y, color, scale=1): を追加
# scale で指定した整数倍の拡大文字を表示可能にした。
#
# ④色の追加設定
# def rgb2color565(self, r, g, b): を用意して RBGから構成可能にした。
# Return color565 from RGB color value. Red Green Blue
# self.YELLOW = self.rgb2color565(0xFF, 0xFF, 0x00)
# self.PURPLE = self.rgb2color565(0xFF, 0x00, 0xFF)
# self.BLUEGREEN = self.rgb2color565(0x00, 0xFF, 0xFF)
#
# ⑤タッチパネルの座標をLCDの座標同様になるような形で返すように変更した。
# def self.touch_get(self): の中で、self.rotate を用いて、
# タッチパネルの座標が、LCDの座標(左上隅が 0 0)と一致させるようにした。
# X:横軸 Y:縦軸 左上隅が、X=0, Y=0
#
# ⑥1つのバッファで全画面の表示する 2025/07/15 (20925/07/11の間違いを修正)
# メモリが2倍の Pico2(RP2350)を使用して
# バッファをフルサイズ(480x320)にすれば、1つのバッファで全画面の表示ができる。
#
# ⑦ WS 波形表示
#
# ⑧ ALG パターン表示
#
# ⑨ Pico2(RP2350) 使用を前提にプログラムを整理
# def touch_get(self) の辺り
#
# ⑩ Pimoroni Pico Pi Plus 2 PSRAM 8MB を利用する
#
#
#
########################################################################
from machine import Pin,SPI,PWM
from micropython import const
import math
import framebuf
import time
import os
import gc # メモリ利用状況表示用
# for DEBUG
PRINT_TOUCH_POS = True # タッチ座標を表示する時
TOUCH_ADJ = True # タッチ座標を取得する時。ROTATE = const(180) にすること
LCD_DC = const(8)
LCD_CS = const(9)
LCD_SCK = const(10)
LCD_MOSI = const(11)
LCD_MISO = const(12)
LCD_BL = const(13)
LCD_RST = const(15)
TP_CS = const(16)
TP_IRQ = const(17)
##############################################################
# LCDの向きに合わせて設定する
# Set the rotation Angle to 0°, 90°, 180° or 270°
# 0:USBが左辺上 90:USBが下辺左 180:USBが右辺下 270:USBが上辺右
# タッチ座標を取得して調整するときは。ROTATE = const(180) にすること
##############################################################
ROTATE = const(180)
# この Pixel 分を上下左右に拡大したエリアをタッチ有効とする
# 一部、この倍の領域にしている
TOUCH = const(8)
class LCD_3inch5(framebuf.FrameBuffer):
def __init__(self):
self.RED = 0x07E0
self.GREEN = 0x001f
self.BLUE = 0xf800
self.WHITE = 0xffff
self.BLACK = 0x0000
# Return color565 from RGB color value.
# Red Green Blue
self.YELLOW = self.rgb2color565(0xFF, 0xFF, 0x00)
self.PURPLE = self.rgb2color565(0xFF, 0x00, 0xFF)
self.BLUEGREEN = self.rgb2color565(0x00, 0xFF, 0xFF)
self.GRAY = self.rgb2color565(0x50, 0x28, 0x15)
self.rotate = ROTATE
# 2025/07/15 ここの設定の修正が必要だった
if self.rotate == 0 or self.rotate == 180:
self.width = 320
# 2025/07/15 self.height = 240
self.height = 480
else:
self.width = 480
# 2025/07/15 self.height = 160
self.height = 320
# 制御信号端子の設定
self.cs = Pin(LCD_CS,Pin.OUT)
self.rst = Pin(LCD_RST,Pin.OUT)
self.dc = Pin(LCD_DC,Pin.OUT)
self.tp_cs =Pin(TP_CS,Pin.OUT)
self.irq = Pin(TP_IRQ,Pin.IN)
# 制御信号端子の初期状態設定
self.cs(1)
self.dc(1)
self.rst(1)
self.tp_cs(1)
# LCD(ILI9488) 40MHz
self.spi_lcd = SPI(1,baudrate=40_000_000,sck=Pin(LCD_SCK),\
mosi=Pin(LCD_MOSI),miso=Pin(LCD_MISO))
print(self.spi_lcd)
#################### このあたりが難解 ################################
# Pico2(RP2350) ならば、画面一杯をしてしてもメモリエラーにならない
self.buffer = bytearray(self.height * self.width * 2)
super().__init__(self.buffer, self.width, self.height, framebuf.RGB565)
#########################################################################
print('gc.mem_free() = ', gc.mem_free()) # メモリ利用状況
self.init_display()
# color565 is Blue:5bits, Red:6bits, and Green:5bits 16bits
# Return color565 from RGB color value.
def rgb2color565(self, r, g, b):
return (r & 0xFC) << 3 | (g & 0xF8) >> 3 | (b & 0xF8) << 8
def init_display(self):
self.rst(0)
time.sleep_ms(10)
self.rst(1)
time.sleep_ms(50)
# INVON = const(0x21) # Display inversion on
self.write_cmd(0x21)
# Power Control 3
self.write_cmd(0xC2)
self.write_data(0x33)
# VMCTR1 = const(0xC5) # VCOM control 1
self.write_cmd(0xC5)
self.write_data(0x00)
self.write_data(0x1e)
self.write_data(0x80)
# FRMCTR1 = const(0xB1) # Frame rate control (In normal mode/full colors)
self.write_cmd(0xB1)
self.write_data(0xB0)
# GMCTRP1 = const(0xE0) # Positive gamma correction
self.write_cmd(0xE0)
self.write_data(0x00)
self.write_data(0x13)
self.write_data(0x18)
self.write_data(0x04)
self.write_data(0x0F)
self.write_data(0x06)
self.write_data(0x3a)
self.write_data(0x56)
self.write_data(0x4d)
self.write_data(0x03)
self.write_data(0x0a)
self.write_data(0x06)
self.write_data(0x30)
self.write_data(0x3e)
self.write_data(0x0f)
# GMCTRN1 = const(0xE1) # Negative gamma correction
self.write_cmd(0xE1)
self.write_data(0x00)
self.write_data(0x13)
self.write_data(0x18)
self.write_data(0x01)
self.write_data(0x11)
self.write_data(0x06)
self.write_data(0x38)
self.write_data(0x34)
self.write_data(0x4d)
self.write_data(0x06)
self.write_data(0x0d)
self.write_data(0x0b)
self.write_data(0x31)
self.write_data(0x37)
self.write_data(0x0f)
# PIXFMT = const(0x3A) # COLMOD: Pixel format set
self.write_cmd(0x3A)
self.write_data(0x55) # 16bits/pixel
# SLPOUT = const(0x11) # Exit sleep mode
self.write_cmd(0x11)
time.sleep_ms(120)
self.write_cmd(0x29)
# DFUNCTR = const(0xB6) # Display function control
self.write_cmd(0xB6)
self.write_data(0x00)
self.write_data(0x62)
# MADCTL = const(0x36) # Memory access control
self.write_cmd(0x36) # Sets the memory access mode for rotation
# bit 7-6:パネル方向 bit 5=0:横長 1:縦長
# bit 3は、常に1 bit 7654 3210
if self.rotate == 0:
self.write_data(0x88) # 1000 1000
elif self.rotate == 180:
self.write_data(0x48) # 0100 1000
elif self.rotate == 90:
self.write_data(0xe8) # 1110 1000
else:
self.write_data(0x28) # 0010 1000
def write_cmd(self, cmd):
self.cs(1)
self.dc(0)
self.cs(0)
self.spi_lcd.write(bytearray([cmd]))
self.cs(1)
def write_data(self, buf):
self.cs(1)
self.dc(1)
self.cs(0)
#self.spi_lcd.write(bytearray([0x00]))
self.spi_lcd.write(bytearray([buf]))
self.cs(1)
# 全エリアに描画
def show(self):
if self.rotate == 0 or self.rotate == 180:
# SET_COLUMN = const(0x2A) # Column address set
self.write_cmd(0x2A)
self.write_data(0x00) # Start Column
self.write_data(0x00) # 0x0000
self.write_data(0x01) # End Column
self.write_data(0x3f) # 0x013f:319
# SET_PAGE = const(0x2B) # Page address set
self.write_cmd(0x2B)
self.write_data(0x00) # Start Page
self.write_data(0x00) # 0x0000
self.write_data(0x01) # End Page
self.write_data(0xdf) # 0x01df:479
else: # self.rotate == 90 or self.rotate == 270:
# SET_COLUMN = const(0x2A) # Column address set
self.write_cmd(0x2A)
self.write_data(0x00) # Start Column
self.write_data(0x00) # 0x0000
self.write_data(0x01) # End Column
self.write_data(0xdf) # 0x01df:479
# SET_PAGE = const(0x2B) # Page address set
self.write_cmd(0x2B)
self.write_data(0x00) # Start Page
self.write_data(0x00) # 0x0000
self.write_data(0x01) # End Page
self.write_data(0x3f) # 0x013f:319
# WRITE_RAM = const(0x2C) # Memory write
self.write_cmd(0x2C)
self.cs(1)
self.dc(1)
self.cs(0)
self.spi_lcd.write(self.buffer)
self.cs(1)
# 2025/06/29 Add
# 拡大表示するテキスト描画関数
# scale:拡大率(整数)
def text_scaled(self, text, x, y, color, scale=1):
# 一時的なフレームバッファを作成(文字描画用)
temp_fb = framebuf.FrameBuffer(bytearray(8 * len(text) * 8),\
8 * len(text), 8, framebuf.MONO_HLSB)
temp_fb.fill(0) # 背景をクリア
temp_fb.text(text, 0, 0, 1) # 文字を描画
# 各ピクセルを拡大して描画
for yy in range(8):
for xx in range(8 * len(text)):
if temp_fb.pixel(xx, yy): # 文字のピクセルがある場合
self.fill_rect(x + xx * scale, y + yy * scale,\
scale, scale, color)
def bl_ctrl(self,duty):
pwm = PWM(Pin(LCD_BL))
pwm.freq(1000)
if(duty>=100):
pwm.duty_u16(65535)
else:
pwm.duty_u16(655*duty)
def touch_get(self):
if self.irq() == 0:
# spi1 Switching to Touch Panel
# 2025/07/03 : 使用都度、設定し直す、この方法が良いようだ。
# Touch Panel(XPT2046) 4MHz
self.spi_touch = SPI(1, baudrate=4_000_000, sck=Pin(LCD_SCK),\
mosi=Pin(LCD_MOSI), miso=Pin(LCD_MISO))
self.tp_cs(0)
time.sleep_ms(1)
for i in range(0,3):
self.spi_touch.write(bytearray([0xD0]))
Read_date = self.spi_touch.read(2)
time.sleep_us(10)
x_touch = ((Read_date[0] <<8) + Read_date[1]) >>3
self.spi_touch.write(bytearray([0x90]))
Read_date = self.spi_touch.read(2)
time.sleep_us(10)
y_touch = ((Read_date[0] <<8) + Read_date[1]) >>3
self.tp_cs(1)
# DEBUG ADJ 用 ####################################################
if PRINT_TOUCH_POS:
print('x_touch = ', x_touch, ' y_touch = ', y_touch)
###################################################################
# spi1 Switching to LCD
# 2025/07/03 : 使用が終われば、設定を元に戻す。この方法が良いようだ。
# LCD(ILI9488) 40MHz
self.spi_lcd = SPI(1, baudrate=40_000_000, sck=Pin(LCD_SCK),\
mosi=Pin(LCD_MOSI), miso=Pin(LCD_MISO))
##############################
# Set Here Adjuste Parameter
# x_min ===> x_max
# 4800 7350
# y_min -----------------
# | |
# 4700 | + + |
# | |
# | LCD Panel |
# | |_
# | | | USB connector
# 7700 | + + |~
# | |
# y_max -----------------
# ~~ USB connector
###########################################################
# 2025/07/24 ADJ
# 四隅ではなく、各40Pixcel 中央寄りの四隅の値を基準に決める方法に変更
# 2025/08/14 Adj No3 Touch LCD
# 左上の XT XY の値
result40_40 = [4800,4720] # [4900,4800]
# 右上の XT XY の値
result280_40 = [7400,4720] # [7450,4800]
# 左下の XT XY の値
result40_440 = [4800,7700] # [4900,7800]
# 右下の XT XY の値
result280_440 = [7400,7700] # [7450,7800]
# 右下の XT XY の値は、利用していない
x_min = int(result40_40[0] - ((result280_40[0] - result40_40[0]) *40 /(280 -40)))
x_max = int(result280_40[0] + ((result280_40[0] - result40_40[0]) *40 /(280 -40)))
y_min = int(result40_40[1] - ((result40_440[1] - result40_40[1]) *40 /(440 -40)))
y_max = int(result40_440[1] + ((result40_440[1] - result40_40[1]) *40 /(440 -40)))
#########################
x_range = x_max - x_min
y_range = y_max - y_min
#########################
# Result_list = [touch_,touch_Y]
# 2025/07/02 : self.rotate の方向で、LCD位置に合わせた座標を返す
if self.rotate == 0 or self.rotate == 180:
if self.rotate == 0: # X軸Y軸の座標入替なし and X軸Y軸とも 数値変換なし
X_Point = 320 - int((x_touch - x_min) *320 /x_range)
Y_Point = 480 - int((y_touch - y_min) *480 /y_range)
elif self.rotate == 180: # X軸Y軸の座標入替なし and Y軸は 数値大小入替
X_Point = int((x_touch - x_min) *320 /x_range)
Y_Point = int((y_touch - y_min) *480 /y_range)
# 範囲内に収める 2025/07/17 修正
if X_Point >= 320:
X_Point = 319
elif X_Point < 0:
X_Point = 0
if Y_Point >= 480:
Y_Point = 479
elif Y_Point < 0:
Y_Point = 0
else: # self.rotate == 90 or self.rotate == 270:
if self.rotate == 90: # X軸Y軸の座標入替あり and X軸は 数値大小入替
X_Point = 480 - int((y_touch - y_min) *480 /y_range)
Y_Point = int((x_touch - x_min) *320 /x_range)
elif self.rotate == 270: # X軸Y軸の座標入替あり and Y軸は 数値大小入替
X_Point = int((y_touch - y_min) *480 /y_range)
Y_Point = 320 - int((x_touch - x_min) *320 /x_range)
# 範囲内に収める 2025/07/17 修正
if X_Point >= 480:
X_Point = 479
elif X_Point < 0:
X_Point = 0
if Y_Point >= 320:
Y_Point = 319
elif Y_Point < 0:
Y_Point = 0
if TOUCH_ADJ: # タッチポイント調整用に生のポイントデータを返す
# 2025/07/23
Result_list = [X_Point, Y_Point, x_touch, y_touch]
else: # LCD Pixcel に変換したデータのみを返す
Result_list = [X_Point, Y_Point]
# 2025/06/27 : タッチされた座標を表示
print(Result_list)
return(Result_list)
#################################################
# MicroPython
#################################################
def bold_pixel(x, y, color, scale):
if scale >= 2:
s = int(scale /2)
x = 0 if (x -s) < 0 else x -s
y = 0 if (y -s) < 0 else y -s
LCD.fill_rect(x, y, scale, scale, color)
# 座標ポイント zs ze で指定された2点のPixel および、その周囲の8点同士を線で描く
def bold_line(zs, ze, color):
for x in range(-1,2):
for y in range(-1,2):
LCD.line(zs[0] +x, zs[1] +y, ze[0] +x, ze[1] +y, color)
def one_write_line(zl, color_wave):
# zl[[zs], [z1], [z2], [z3], [z4], ]
if len(zl) >= 2:
z_end = zl[0]
for i in range(1, len(zl)):
z_start = z_end
# y軸は、反転することに注意
z_end =[zl[0][0] +zl[i][0], zl[0][1] -zl[i][1]]
bold_line(z_start, z_end, color_wave)
# WS 波形をLCD下半分の決まった位置に表示する
def wave_form(ws, color_back, color_wave):
xs = 0
xb = 8 # 枠の幅 x
ys = 264 # 240~259:[WS]Tab 260~263:Line
yl = ys +18 # 240~259:[WS]Tab 260~263:Line 中央の線
yb = 3 # 枠の幅 y
w = 64 # セルの全体幅
wx = 48 # セルの波形幅
h = 36 # セルの全体高さ
hy = 15 # セルの波形高さの半分 sin価数を利用するため 1/2 にしている
# ws 番号から描画開始位置を決めるためのテーブル
# ws=0, 1, 2, 3, 4,
zone_xs = [xs +w*0, xs +w*1, xs +w*2, xs +w*0, xs +w*3, \
# ws=5, 6, 7, 8, 9,
xs +w*4, xs +w*0, xs +w*4, xs +w*0, xs +w*1, \
# ws=10, 11, 12, 13, 14,
xs +w*2, xs +w*1, xs +w*3, xs +w*4, xs +w*1, \
# ws=15, 16, 17, 18, 19,
xs +w*0, xs +w*0, xs +w*1, xs +w*2, xs +w*2, \
# ws=20, 21, 22, 23, 24,
xs +w*3, xs +w*4, xs +w*2, xs +w*0, xs +w*0, \
# ws=25, 26, 27, 28, 29, 30,
xs +w*1, xs +w*2, xs +w*3, xs +w*3, xs +w*4, xs +w*3]
# ws=0, 1, 2, 3, 4,
zone_ys = [ys +h*0, ys +h*0, ys +h*0, ys +h*5, ys +h*0, \
# ws=5, 6, 7, 8, 9,
ys +h*0, ys +h*4, ys +h*4, ys +h*1, ys +h*1, \
# ws=10, 11, 12, 13, 14,
ys +h*1, ys +h*5, ys +h*1, ys +h*1, ys +h*4, \
# ws=15, 16, 17, 18, 19,
ys +h*0, ys +h*2, ys +h*2, ys +h*2, ys +h*5, \
# ws=20, 21, 22, 23, 24,
ys +h*2, ys +h*2, ys +h*4, ys +h*0, ys +h*3, \
# ws=25, 26, 27, 28, 29, 30,
ys +h*3, ys +h*3, ys +h*5, ys +h*3, ys +h*3, ys +h*4]
# 波形の Y軸 0 line 上下中心線
zone_yl = [yl +h*0, yl +h*0, yl +h*0, yl +h*5, yl +h*0, \
yl +h*0, yl +h*4, yl +h*4, yl +h*1, yl +h*1, \
yl +h*1, yl +h*5, yl +h*1, yl +h*1, yl +h*4, \
yl +h*0, yl +h*2, yl +h*2, yl +h*2, yl +h*5, \
yl +h*2, yl +h*2, yl +h*4, yl +h*0, yl +h*3, \
yl +h*3, yl +h*3, yl +h*5, yl +h*3, yl +h*3, yl +h*4]
if ws == 0:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
for i in range(wx):
xp = zone_xs[ws] +i +xb
# 円周360度を 60分割してサイン波形をプロットする
yp = zone_yl[ws] -int(math.sin(math.radians(i *(360/wx))) *hy)
bold_pixel(xp, yp, color_wave, 3)
elif ws == 1:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
for i in range(int(wx/2)+1):
xp = zone_xs[ws] +i +xb
# 円周360度を 60分割してサイン波形をプロットする
yp = zone_yl[ws] -int(math.sin(math.radians(i *(360/wx))) *hy)
bold_pixel(xp, yp, color_wave, 3)
# 直線部分を描く
xp = zone_xs[ws] +xb +24
yp = zone_yl[ws]
# 起点 1 2 3 4 5 6 7 8
zl = [[xp,yp], [+24,0]]
one_write_line(zl, color_wave)
elif ws == 2:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
for i in range(wx):
xp = zone_xs[ws] +i +xb
# 円周360度を 60分割してサイン波形をプロットする
yp = zone_yl[ws] -int(abs(math.sin(math.radians(i *(360/wx))) *hy))
bold_pixel(xp, yp, color_wave, 3)
elif ws == 3:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形の 1/4 をプロットする
for i in range(0, 12):
xp = zone_xs[ws] +i +xb
yp = zone_yl[ws] -int(abs(math.sin(math.radians(i *(360/wx))) *hy))
bold_pixel(xp, yp, color_wave, 3)
# 円周360度を 60分割してサイン波形の 3/4 をプロットする
for i in range(24, 36):
xp = zone_xs[ws] +i +xb
yp = zone_yl[ws] -int(abs(math.sin(math.radians(i *(360/wx))) *hy))
bold_pixel(xp, yp, color_wave, 3)
# 直線部分を描く
z1 = [zone_xs[ws] +xb +12, zone_ys[ws] +yb +0]
z2 = [zone_xs[ws] +xb +12, zone_ys[ws] +yb +hy]
z3 = [zone_xs[ws] +xb +24, zone_ys[ws] +yb +hy]
bold_line(z1, z2, color_wave)
bold_line(z2, z3, color_wave)
z4 = [zone_xs[ws] +xb +36, zone_ys[ws] +yb +0]
z5 = [zone_xs[ws] +xb +36, zone_ys[ws] +yb +hy]
z6 = [zone_xs[ws] +xb +48, zone_ys[ws] +yb +hy]
bold_line(z4, z5, color_wave)
bold_line(z5, z6, color_wave)
elif ws == 4:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形をプロットする
for i in range(30+1):
xp = zone_xs[ws] +i +xb *2
yp = zone_yl[ws] -int(math.sin(math.radians(i *(360/30))) *hy)
bold_pixel(xp, yp, color_wave, 3)
elif ws == 5:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形をプロットする
for i in range(30+1):
xp = zone_xs[ws] +i +xb *2
yp = zone_yl[ws] -int(abs(math.sin(math.radians(i *(360/30))) *hy))
bold_pixel(xp, yp, color_wave, 3)
elif ws == 6:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [0,+hy], [24,+hy], [24,-hy], [48,-hy], [48,0]]
one_write_line(zl, color_wave)
elif ws == 7:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# サイン波形の 180~270 をプロットする
for i in range(0, 24):
xp = zone_xs[ws] +i +xb
yp = zone_ys[ws] +yb +int(hy*2 - (abs(math.sin(math.radians(i *(360/(wx*2)) +180))) *(-1) *hy +hy*2))
bold_pixel(xp, yp, color_wave, 3)
# サイン波形の 270~360 をプロットする
for i in range(24, 48):
xp = zone_xs[ws] +i +xb
yp = zone_ys[ws] +yb +int(hy*2 - (abs(math.sin(math.radians(i *(360/(wx*2)) +0))) *hy))
bold_pixel(xp, yp, color_wave, 3)
# 直線部分を描く
z1 = [zone_xs[ws] +xb +0, zone_ys[ws] +yb +0]
z2 = [zone_xs[ws] +xb +0, zone_ys[ws] +yb +hy]
z3 = [zone_xs[ws] +xb +48, zone_ys[ws] +yb +hy*2]
z4 = [zone_xs[ws] +xb +48, zone_ys[ws] +yb +hy]
bold_line(z1, z2, color_wave)
bold_line(z3, z4, color_wave)
elif ws == 8:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形をプロットする
for i in range(wx):
xp = zone_xs[ws] +i +xb
y = -int(math.sin(math.radians(i *(360/wx))) *hy)
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
elif ws == 9:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形をプロットする
for i in range(int(wx/2)+1):
xp = zone_xs[ws] +i +xb
y = -int(math.sin(math.radians(i *(360/wx))) *hy)
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
z1 = [zone_xs[ws] +xb +24, zone_ys[ws] +yb +hy]
z2 = [zone_xs[ws] +xb +48, zone_ys[ws] +yb +hy]
bold_line(z1, z2, color_wave)
elif ws == 10:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形をプロットする
for i in range(wx):
xp = zone_xs[ws] +i +xb
y = -int(abs(math.sin(math.radians(i *(360/wx))) *hy))
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
elif ws == 11:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形の 1/4 をプロットする
for i in range(0, 12):
xp = zone_xs[ws] +i +xb
y = -int(abs(math.sin(math.radians(i *(360/wx))) *hy))
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
# 円周360度を 60分割してサイン波形の 3/4 をプロットする
for i in range(24, 36):
xp = zone_xs[ws] +i +xb
y = -int(abs(math.sin(math.radians(i *(360/wx))) *hy))
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
# 直線部分を描く
z1 = [zone_xs[ws] +xb +12, zone_ys[ws] +yb +5]
z2 = [zone_xs[ws] +xb +12, zone_ys[ws] +yb +hy]
z3 = [zone_xs[ws] +xb +24, zone_ys[ws] +yb +hy]
bold_line(z1, z2, color_wave)
bold_line(z2, z3, color_wave)
z4 = [zone_xs[ws] +xb +36, zone_ys[ws] +yb +5]
z5 = [zone_xs[ws] +xb +36, zone_ys[ws] +yb +hy]
z6 = [zone_xs[ws] +xb +48, zone_ys[ws] +yb +hy]
bold_line(z4, z5, color_wave)
bold_line(z5, z6, color_wave)
elif ws == 12:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形をプロットする
for i in range(30+1):
xp = zone_xs[ws] +i +xb *2
y = -int(math.sin(math.radians(i *(360/30))) *hy)
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
elif ws == 13:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形をプロットする
for i in range(30+1):
xp = zone_xs[ws] +i +xb *2
y = -int(abs(math.sin(math.radians(i *(360/30))) *hy))
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
elif ws == 14:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [0,+hy], [24,+hy], [24,0], [48,0]]
one_write_line(zl, color_wave)
elif ws == 15:
# Notthing
pass
elif ws == 16:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [12,+hy], [36,-hy], [48,0]]
one_write_line(zl, color_wave)
elif ws == 17:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [12,+hy], [24,0], [48,0]]
one_write_line(zl, color_wave)
elif ws == 18:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [12,+hy], [24,0], [36,+hy], [48,0]]
one_write_line(zl, color_wave)
elif ws == 19:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [12,+hy], [12,0], [24,0], [36,+hy], [36,0], [48,0]]
one_write_line(zl, color_wave)
elif ws == 20:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb*2
yp = zone_yl[ws]
zl = [[xp,yp], [7,+hy], [21,-hy], [28,0]]
one_write_line(zl, color_wave)
elif ws == 21:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb*2
yp = zone_yl[ws]
zl = [[xp,yp], [7,+hy], [14,0], [21,+hy], [28,0]]
one_write_line(zl, color_wave)
elif ws == 22:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
# 起点 1 2 3 4 5 6 7 8
zl = [[xp,yp], [0,+hy], [12,+hy], [12,0], [24,0], [24,+hy], [36,+hy], [36,0], [48,0]]
one_write_line(zl, color_wave)
elif ws == 23:
# Notthing
pass
elif ws == 24:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [24,+hy], [24,-hy], [48,0]]
one_write_line(zl, color_wave)
elif ws == 25:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [24,+hy], [24,0], [48,0]]
one_write_line(zl, color_wave)
elif ws == 26:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [24,+hy], [24,0], [48,+hy], [48,0]]
one_write_line(zl, color_wave)
elif ws == 27:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [12,+hy], [12,0], [24,0], [36,+hy], [36,0], [48,0]]
one_write_line(zl, color_wave)
elif ws == 28:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb*2
yp = zone_yl[ws]
zl = [[xp,yp], [14,+hy], [14,-hy], [28,0]]
one_write_line(zl, color_wave)
elif ws == 29:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb*2
yp = zone_yl[ws]
zl = [[xp,yp], [14,+hy], [14,0], [28,+hy], [28,0]]
one_write_line(zl, color_wave)
elif ws == 30:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb*2
yp = zone_yl[ws]
zl = [[xp,yp], [0,+hy], [12,+hy], [12,0], [36,0]]
one_write_line(zl, color_wave)
elif ws == 31:
# Nothing
pass
# タブ の四角の枠とタブの名前を表示する
def tab(tab_name, zs, chr_num, color_line, color_back, color_text):
# zs:TAB LABEL 開始座標
# chr_num:TAB LABEL の文字幅
chr_w = 16
chr_h = 16
xb = 2 # line X の太さ(pixel数)
yb = 2 # line Y の太さ(pixel数)
# 大きな四角の内側に小さな四角を描き、差分を枠線として表示する
LCD.fill_rect(zs[0], zs[1], chr_w *chr_num +xb*2, chr_h +yb*2, color_line)
LCD.fill_rect(zs[0] +xb, zs[1] +yb, chr_w *chr_num, chr_h, color_back)
LCD.text_scaled(tab_name,zs[0] +xb, zs[1] +yb, color_text, 2)
# main menu
def dsp_main_menu():
tab_get = [ 6,2]
tab_com = [ 86,2]
tab_op = [166,2]
tab_set = [246,2]
chr_num = 4
color_line = LCD.BLUE
color_back = LCD.GRAY
color_text = LCD.BLACK
tab('get' , tab_get, chr_num, color_line, color_back, color_text)
tab('com' , tab_com, chr_num, color_line, color_back, color_text)
tab('op' , tab_op, chr_num, color_line, color_back, color_text)
tab('set', tab_set,chr_num, color_line, color_back, color_text)
# sub menu
def dsp_sub_menu_op():
tab_ws = [ 6,240]
tab_mul = [ 86,240]
tab_adsr = [166,240]
tab_dam = [246,240]
chr_num = 4
color_line = LCD.BLUE
color_back = LCD.GRAY
color_text = LCD.BLACK
tab('ws' , tab_ws, chr_num, color_line, color_back, color_text)
tab('mul' , tab_mul, chr_num, color_line, color_back, color_text)
tab('adsr', tab_adsr,chr_num, color_line, color_back, color_text)
tab('dam' , tab_dam, chr_num, color_line, color_back, color_text)
if __name__=='__main__':
###########################################################
print('gc.mem_free() = ', gc.mem_free()) # メモリ利用状況
###########################################################
LCD = LCD_3inch5()
LCD.bl_ctrl(100)
# カラー表示テスト
lcd_color_list = [LCD.BLACK, LCD.RED, LCD.GREEN, LCD.BLUE, LCD.YELLOW,\
LCD.PURPLE, LCD.BLUEGREEN, LCD.GRAY, LCD.WHITE]
# 2025/08/20 Test
for n in range(1):
print(f'Color Patturn Test n = {n}')
for i in range(len(lcd_color_list)):
LCD.fill(lcd_color_list[i])
time.sleep_ms(10)
LCD.show()
time.sleep_ms(90)
LCD.fill(LCD.WHITE)
###########################################################
print('gc.mem_free() = ', gc.mem_free()) # メモリ利用状況
###########################################################
# 2025/08/20 WS Test
for n in range(10000):
print(f'WS Test n = {n}')
# ws 波形の表示テスト
for ws in range(31):
# 2025/08/22-16:03 Test Add
LCD.fill(LCD.WHITE)
# 2025/09/02 comment out
dsp_main_menu()
dsp_sub_menu_op()
# wave_form(ws, LCD.WHITE, LCD.BLACK)
wave_form(ws, LCD.YELLOW, LCD.BLACK)
LCD.show()
time.sleep_ms(10)
###########################################################
# print('gc.mem_free() = ', gc.mem_free()) # メモリ利用状況
###########################################################
time.sleep(1)
print('LCD.rotate = ', LCD.rotate)
X_Point_Old = 0
Y_Point_Old = 0
#調整用ポイントの座標の設定
# TOUCH_ADJ = True
# ROTATE = const(180) にすること
if LCD.rotate == 0 or LCD.rotate == 180: # 縦長表示 の直後
# 調整用ポイントの座標の設定
pos40_40 = [ 40, 40]
pos280_40 = [280, 40]
pos40_440 = [ 40,440]
pos280_440 = [280,440]
#color BRG
LCD.fill(LCD.WHITE)
# 調整用ポイントの座標を 5Pixel x 5Pixel で表示する
LCD.fill_rect(pos40_40[0]-2, pos40_40[1]-2, 5, 5, LCD.RED)
LCD.fill_rect(pos280_40[0]-2, pos280_40[1]-2, 5, 5, LCD.RED)
LCD.fill_rect(pos40_440[0]-2, pos40_440[1]-2, 5, 5, LCD.RED)
LCD.fill_rect(pos280_440[0]-2, pos280_440[1]-2, 5, 5, LCD.RED)
LCD.show()
scope = 10 # 移動平均 Average 個数
X_listT = [None] * scope
Y_listT = [None] * scope
X_listL = [None] * scope
Y_listL = [None] * scope
cnt_scope = 0
# 各ポジションの集計結果を利用可能(10回以上計測)になればセット
flag40_40 = 0
flag280_40 = 0
flag40_440 = 0
flag280_440 = 0
# 測定結果が出たらセット
flag_result = 0
# Touch Point 表示
while True:
get = LCD.touch_get()
if get != None:
# タッチされているなら
if TOUCH_ADJ:
# 調整モードなら、タッチ生データ get[2], get[3] を取得
X_PointL = get[0]
Y_PointL = get[1]
X_PointT = get[2]
Y_PointT = get[3]
else:
# LCD 座標変換データ取得
X_PointL = get[0]
Y_PointL = get[1]
# 移動平均計算用にデータを記録
X_listL[cnt_scope] = X_PointL
Y_listL[cnt_scope] = Y_PointL
X_listT[cnt_scope] = X_PointT
Y_listT[cnt_scope] = Y_PointT
if flag_result == 0:
cnt_scope += 1
if cnt_scope >= scope:
cnt_scope = 0
if flag_result == 0:
flag_result = 1
else:
# 移動平均 10 計算
X_totalL = 0
Y_totalL = 0
X_totalT = 0
Y_totalT = 0
for i in range(scope):
X_totalL += X_listL[i]
Y_totalL += Y_listL[i]
X_totalT += X_listT[i]
Y_totalT += Y_listT[i]
# 移動平均 10
X_aveL = int(X_totalL / scope)
Y_aveL = int(Y_totalL / scope)
X_aveT = int(X_totalT / scope)
Y_aveT = int(Y_totalT / scope)
# 領域別に表示
# 初期状態 中心と思われる 4800 4700 の +400 +400
if X_aveT < 5200 and Y_aveT < 5100:
# pos40_40 の 値を収録
ave40_40 = [X_aveT, Y_aveT]
flag40_40 += 1
if flag40_40 >= 10:
# 文字領域を 白色にしてから表示
LCD.fill_rect(20,80,16*8,80, LCD.WHITE)
LCD.text_scaled(f'XL:{X_aveL}',20, 80,LCD.BLUE, 2)
LCD.text_scaled(f'XT:{X_aveT}',20,100,LCD.BLUE, 2)
LCD.text_scaled(f'YL:{Y_aveL}',20,120,LCD.BLUE, 2)
LCD.text_scaled(f'YT:{Y_aveT}',20,140,LCD.BLUE, 2)
# 初期状態 中心と思われる 7350 4700 の -400 +400
elif X_aveT > 6950 and Y_aveT < 5100:
# pos280_40 の 値を収録
ave280_40 = [X_aveT, Y_aveT]
flag280_40 += 1
if flag280_40 >= 10:
# 文字領域を 白色にしてから表示
LCD.fill_rect(180,80,16*8,80, LCD.WHITE)
LCD.text_scaled(f'XL:{X_aveL}',180, 80,LCD.BLUE, 2)
LCD.text_scaled(f'XT:{X_aveT}',180,100,LCD.BLUE, 2)
LCD.text_scaled(f'YL:{Y_aveL}',180,120,LCD.BLUE, 2)
LCD.text_scaled(f'YT:{Y_aveT}',180,140,LCD.BLUE, 2)
# 初期状態 中心と思われる 4800 7700 の +400 -400
elif X_aveT < 5200 and Y_aveT > 7300:
# pos40_440 の 値を収録
ave40_440 = [X_aveT, Y_aveT]
flag40_440 += 1
if flag40_440 >= 10:
# 文字領域を 白色にしてから表示
LCD.fill_rect(20,340,16*8,80, LCD.WHITE)
LCD.text_scaled(f'XL:{X_aveL}',20,340,LCD.BLUE, 2)
LCD.text_scaled(f'XT:{X_aveT}',20,360,LCD.BLUE, 2)
LCD.text_scaled(f'YL:{Y_aveL}',20,380,LCD.BLUE, 2)
LCD.text_scaled(f'YT:{Y_aveT}',20,400,LCD.BLUE, 2)
# 初期状態 中心と思われる 7350 7700 の -400 -400
elif X_aveT > 6950 and Y_aveT > 7300:
# pos280_440 の 値を収録
ave280_440 = [X_aveT, Y_aveT]
flag280_440 += 1
if flag280_440 >= 10:
# 文字領域を 白色にしてから表示
LCD.fill_rect(180,340,16*8,80, LCD.WHITE)
LCD.text_scaled(f'XL:{X_aveL}',180,340,LCD.BLUE, 2)
LCD.text_scaled(f'XT:{X_aveT}',180,360,LCD.BLUE, 2)
LCD.text_scaled(f'YL:{Y_aveL}',180,380,LCD.BLUE, 2)
LCD.text_scaled(f'YT:{Y_aveT}',180,400,LCD.BLUE, 2)
# 四隅のデータが揃ったら結果を表示する
if flag280_40 >= 10 and flag280_40 >= 10 and flag40_440 >= 10 and flag280_440 >= 10:
LCD.fill_rect(10,200,310,120, LCD.WHITE)
LCD.text_scaled(f'Set def Result Data',10,200,LCD.BLACK, 2)
LCD.text_scaled(f'def touch_get(self):',10,220,LCD.BLACK, 2)
LCD.text_scaled(f'rt40_40 ={ave40_40[0]},{ave40_40[1]}',10,240,LCD.BLACK, 2)
LCD.text_scaled(f'rt280_40 ={ave280_40[0]},{ave280_40[1]}',10,260,LCD.BLACK, 2)
LCD.text_scaled(f'rt40_440 ={ave40_440[0]},{ave40_440[1]}',10,280,LCD.BLACK, 2)
LCD.text_scaled(f'rt280_440={ave280_440[0]},{ave280_440[1]}',10,300,LCD.BLACK, 2)
LCD.show()
else:
cnt_scope = 0
flag_result = 0
time.sleep_ms(50)
# 初期のプログラムを残し、ポイントの軌跡を残す
else: # LCD.rotate == 90 or LCD.rotate == 270 : 横長表示
#color BRG
LCD.fill(LCD.WHITE)
LCD.fill_rect(140,5,200,30,LCD.RED)
# LCD.text("Raspberry Pi Pico",170,17,LCD.WHITE)
# 黄文字表示
LCD.text("Raspberry Pi Pico",170,17,LCD.YELLOW)
LCD.text("3.5' IPS LCD TEST",170,47,LCD.BLACK)
display_color = 0x001F
for i in range(len("Raspberry Pi Pico")):
LCD.fill_rect(i*16+108,70,14,20,(display_color))
display_color = display_color << 1
# 2025/06/29:Add 2倍の拡大文字を表示
LCD.text_scaled("Raspberry Pi Pico",108,72,LCD.BLUEGREEN, 2)
# 右下 隅 のセルを赤色にする
LCD.fill_rect(59 *8, 19 *8, 8, 8, LCD.RED)
LCD.fill_rect(59 *8, 39 *8, 8, 8, LCD.RED)
display_color = 0x001F
for i in range(0,12):
# LCD.fill_rect(i*30+60,100,30,50,(display_color))
LCD.fill_rect(i*30+60,120,30,50,(display_color))
display_color = display_color << 1
LCD.show()
# Touch Point 表示
while True:
get = LCD.touch_get()
if get != None:
# 8bits 単位のセルに変換
X_Point = int(get[0] /8)
Y_Point = int(get[1] /8)
if X_Point_Old != X_Point or Y_Point_Old != Y_Point:
# 前回と異なるセルならば
# 前回のセルを黄色にする
if Y_Point_Old < 40:
# LCD.show_up エリアならば
LCD.fill_rect(X_Point_Old *8, Y_Point_Old *8, 8, 8, LCD.YELLOW)
LCD.show()
# 今回のセルを赤色にする
if Y_Point < 40:
# LCD.show_up エリアならば
LCD.fill_rect(X_Point *8, Y_Point *8, 8, 8, LCD.RED)
LCD.show()
# Old Pointer 更新
X_Point_Old = X_Point
Y_Point_Old = Y_Point
time.sleep_ms(100)
**追加実験その② **
前記①のプログラムに、ALGパターン表示を繰り返すプログラムを追加しました。
ALGパターンの表示を繰り返します。
嵌まり込みます。
ファイルサイズ76.4KB
touch_lcd_TestNG_WS+ALG.py
########################################################################
# WAVE SHARE Pico-ResTouch-LCD-3.5 Test Program をライブラリとして独立させた
# 用意された main_3inch5.py をテスト・改良
# 2025/08/11 : main_3inch5-scale-712.py からライブラリとして独立させた
# touch_lcd-20250811-1214.py
# タッチパネルの調整と初期画面表示は残した状態
# へその緒をなくした(不要なものを削除した)+ MicroPython用の関数も削除
#
########################################################################
# ①初回の起動で表示しない
# self.spi = SPI(1,6_000_000) をコメントアウトでOK
#
# ②self.rotate = 270 では、タッチしても反転表示しないことを修正した。
# ⑤ で LCDの座標に合わせた形で返すように変更
#
# ③文字を整数倍の拡大文字を表示可能にした。(8x8 のフォントでは、判読困難)
# import framebuf で、ビットマップイメージを作成している関係から
# 8x8 のフォントしか扱えないようだ。
# def text_scaled(self, text, x, y, color, scale=1): を追加
# scale で指定した整数倍の拡大文字を表示可能にした。
#
# ④色の追加設定
# def rgb2color565(self, r, g, b): を用意して RBGから構成可能にした。
# Return color565 from RGB color value. Red Green Blue
# self.YELLOW = self.rgb2color565(0xFF, 0xFF, 0x00)
# self.PURPLE = self.rgb2color565(0xFF, 0x00, 0xFF)
# self.BLUEGREEN = self.rgb2color565(0x00, 0xFF, 0xFF)
#
# ⑤タッチパネルの座標をLCDの座標同様になるような形で返すように変更した。
# def self.touch_get(self): の中で、self.rotate を用いて、
# タッチパネルの座標が、LCDの座標(左上隅が 0 0)と一致させるようにした。
# X:横軸 Y:縦軸 左上隅が、X=0, Y=0
#
# ⑥1つのバッファで全画面の表示する 2025/07/15 (20925/07/11の間違いを修正)
# メモリが2倍の Pico2(RP2350)を使用して
# バッファをフルサイズ(480x320)にすれば、1つのバッファで全画面の表示ができる。
#
# ⑦ WS 波形表示
#
# ⑧ ALG パターン表示
#
# ⑨ Pico2(RP2350) 使用を前提にプログラムを整理
# def touch_get(self) の辺り
#
# ⑩ Pimoroni Pico Pi Plus 2 PSRAM 8MB を利用する
#
#
#
########################################################################
from machine import Pin,SPI,PWM
from micropython import const
import math
import framebuf
import time
import os
import gc # メモリ利用状況表示用
# for DEBUG
PRINT_TOUCH_POS = True # タッチ座標を表示する時
TOUCH_ADJ = True # タッチ座標を取得する時。ROTATE = const(180) にすること
LCD_DC = const(8)
LCD_CS = const(9)
LCD_SCK = const(10)
LCD_MOSI = const(11)
LCD_MISO = const(12)
LCD_BL = const(13)
LCD_RST = const(15)
TP_CS = const(16)
TP_IRQ = const(17)
##############################################################
# LCDの向きに合わせて設定する
# Set the rotation Angle to 0°, 90°, 180° or 270°
# 0:USBが左辺上 90:USBが下辺左 180:USBが右辺下 270:USBが上辺右
# タッチ座標を取得して調整するときは。ROTATE = const(180) にすること
##############################################################
ROTATE = const(180)
# この Pixel 分を上下左右に拡大したエリアをタッチ有効とする
# 一部、この倍の領域にしている
TOUCH = const(8)
class LCD_3inch5(framebuf.FrameBuffer):
def __init__(self):
self.RED = 0x07E0
self.GREEN = 0x001f
self.BLUE = 0xf800
self.WHITE = 0xffff
self.BLACK = 0x0000
# Return color565 from RGB color value.
# Red Green Blue
self.YELLOW = self.rgb2color565(0xFF, 0xFF, 0x00)
self.PURPLE = self.rgb2color565(0xFF, 0x00, 0xFF)
self.BLUEGREEN = self.rgb2color565(0x00, 0xFF, 0xFF)
self.GRAY = self.rgb2color565(0x50, 0x28, 0x15)
self.rotate = ROTATE
# 2025/07/15 ここの設定の修正が必要だった
if self.rotate == 0 or self.rotate == 180:
self.width = 320
# 2025/07/15 self.height = 240
self.height = 480
else:
self.width = 480
# 2025/07/15 self.height = 160
self.height = 320
# 制御信号端子の設定
self.cs = Pin(LCD_CS,Pin.OUT)
self.rst = Pin(LCD_RST,Pin.OUT)
self.dc = Pin(LCD_DC,Pin.OUT)
self.tp_cs =Pin(TP_CS,Pin.OUT)
self.irq = Pin(TP_IRQ,Pin.IN)
# 制御信号端子の初期状態設定
self.cs(1)
self.dc(1)
self.rst(1)
self.tp_cs(1)
# LCD(ILI9488) 40MHz
self.spi_lcd = SPI(1,baudrate=40_000_000,sck=Pin(LCD_SCK),\
mosi=Pin(LCD_MOSI),miso=Pin(LCD_MISO))
print(self.spi_lcd)
#################### このあたりが難解 ################################
# Pico2(RP2350) ならば、画面一杯をしてしてもメモリエラーにならない
self.buffer = bytearray(self.height * self.width * 2)
super().__init__(self.buffer, self.width, self.height, framebuf.RGB565)
#########################################################################
print('gc.mem_free() = ', gc.mem_free()) # メモリ利用状況
self.init_display()
# color565 is Blue:5bits, Red:6bits, and Green:5bits 16bits
# Return color565 from RGB color value.
def rgb2color565(self, r, g, b):
return (r & 0xFC) << 3 | (g & 0xF8) >> 3 | (b & 0xF8) << 8
def init_display(self):
self.rst(0)
time.sleep_ms(10)
self.rst(1)
time.sleep_ms(50)
# INVON = const(0x21) # Display inversion on
self.write_cmd(0x21)
# Power Control 3
self.write_cmd(0xC2)
self.write_data(0x33)
# VMCTR1 = const(0xC5) # VCOM control 1
self.write_cmd(0xC5)
self.write_data(0x00)
self.write_data(0x1e)
self.write_data(0x80)
# FRMCTR1 = const(0xB1) # Frame rate control (In normal mode/full colors)
self.write_cmd(0xB1)
self.write_data(0xB0)
# GMCTRP1 = const(0xE0) # Positive gamma correction
self.write_cmd(0xE0)
self.write_data(0x00)
self.write_data(0x13)
self.write_data(0x18)
self.write_data(0x04)
self.write_data(0x0F)
self.write_data(0x06)
self.write_data(0x3a)
self.write_data(0x56)
self.write_data(0x4d)
self.write_data(0x03)
self.write_data(0x0a)
self.write_data(0x06)
self.write_data(0x30)
self.write_data(0x3e)
self.write_data(0x0f)
# GMCTRN1 = const(0xE1) # Negative gamma correction
self.write_cmd(0xE1)
self.write_data(0x00)
self.write_data(0x13)
self.write_data(0x18)
self.write_data(0x01)
self.write_data(0x11)
self.write_data(0x06)
self.write_data(0x38)
self.write_data(0x34)
self.write_data(0x4d)
self.write_data(0x06)
self.write_data(0x0d)
self.write_data(0x0b)
self.write_data(0x31)
self.write_data(0x37)
self.write_data(0x0f)
# PIXFMT = const(0x3A) # COLMOD: Pixel format set
self.write_cmd(0x3A)
self.write_data(0x55) # 16bits/pixel
# SLPOUT = const(0x11) # Exit sleep mode
self.write_cmd(0x11)
time.sleep_ms(120)
self.write_cmd(0x29)
# DFUNCTR = const(0xB6) # Display function control
self.write_cmd(0xB6)
self.write_data(0x00)
self.write_data(0x62)
# MADCTL = const(0x36) # Memory access control
self.write_cmd(0x36) # Sets the memory access mode for rotation
# bit 7-6:パネル方向 bit 5=0:横長 1:縦長
# bit 3は、常に1 bit 7654 3210
if self.rotate == 0:
self.write_data(0x88) # 1000 1000
elif self.rotate == 180:
self.write_data(0x48) # 0100 1000
elif self.rotate == 90:
self.write_data(0xe8) # 1110 1000
else:
self.write_data(0x28) # 0010 1000
def write_cmd(self, cmd):
self.cs(1)
self.dc(0)
self.cs(0)
self.spi_lcd.write(bytearray([cmd]))
self.cs(1)
def write_data(self, buf):
self.cs(1)
self.dc(1)
self.cs(0)
#self.spi_lcd.write(bytearray([0x00]))
self.spi_lcd.write(bytearray([buf]))
self.cs(1)
# 全エリアに描画
def show(self):
if self.rotate == 0 or self.rotate == 180:
# SET_COLUMN = const(0x2A) # Column address set
self.write_cmd(0x2A)
self.write_data(0x00) # Start Column
self.write_data(0x00) # 0x0000
self.write_data(0x01) # End Column
self.write_data(0x3f) # 0x013f:319
# SET_PAGE = const(0x2B) # Page address set
self.write_cmd(0x2B)
self.write_data(0x00) # Start Page
self.write_data(0x00) # 0x0000
self.write_data(0x01) # End Page
self.write_data(0xdf) # 0x01df:479
else: # self.rotate == 90 or self.rotate == 270:
# SET_COLUMN = const(0x2A) # Column address set
self.write_cmd(0x2A)
self.write_data(0x00) # Start Column
self.write_data(0x00) # 0x0000
self.write_data(0x01) # End Column
self.write_data(0xdf) # 0x01df:479
# SET_PAGE = const(0x2B) # Page address set
self.write_cmd(0x2B)
self.write_data(0x00) # Start Page
self.write_data(0x00) # 0x0000
self.write_data(0x01) # End Page
self.write_data(0x3f) # 0x013f:319
# WRITE_RAM = const(0x2C) # Memory write
self.write_cmd(0x2C)
self.cs(1)
self.dc(1)
self.cs(0)
self.spi_lcd.write(self.buffer)
self.cs(1)
# 2025/06/29 Add
# 拡大表示するテキスト描画関数
# scale:拡大率(整数)
def text_scaled(self, text, x, y, color, scale=1):
# 一時的なフレームバッファを作成(文字描画用)
temp_fb = framebuf.FrameBuffer(bytearray(8 * len(text) * 8),\
8 * len(text), 8, framebuf.MONO_HLSB)
temp_fb.fill(0) # 背景をクリア
temp_fb.text(text, 0, 0, 1) # 文字を描画
# 各ピクセルを拡大して描画
for yy in range(8):
for xx in range(8 * len(text)):
if temp_fb.pixel(xx, yy): # 文字のピクセルがある場合
self.fill_rect(x + xx * scale, y + yy * scale,\
scale, scale, color)
def bl_ctrl(self,duty):
pwm = PWM(Pin(LCD_BL))
pwm.freq(1000)
if(duty>=100):
pwm.duty_u16(65535)
else:
pwm.duty_u16(655*duty)
def touch_get(self):
if self.irq() == 0:
# spi1 Switching to Touch Panel
# 2025/07/03 : 使用都度、設定し直す、この方法が良いようだ。
# Touch Panel(XPT2046) 4MHz
self.spi_touch = SPI(1, baudrate=4_000_000, sck=Pin(LCD_SCK),\
mosi=Pin(LCD_MOSI), miso=Pin(LCD_MISO))
self.tp_cs(0)
time.sleep_ms(1)
for i in range(0,3):
self.spi_touch.write(bytearray([0xD0]))
Read_date = self.spi_touch.read(2)
time.sleep_us(10)
x_touch = ((Read_date[0] <<8) + Read_date[1]) >>3
self.spi_touch.write(bytearray([0x90]))
Read_date = self.spi_touch.read(2)
time.sleep_us(10)
y_touch = ((Read_date[0] <<8) + Read_date[1]) >>3
self.tp_cs(1)
# DEBUG ADJ 用 ####################################################
if PRINT_TOUCH_POS:
print('x_touch = ', x_touch, ' y_touch = ', y_touch)
###################################################################
# spi1 Switching to LCD
# 2025/07/03 : 使用が終われば、設定を元に戻す。この方法が良いようだ。
# LCD(ILI9488) 40MHz
self.spi_lcd = SPI(1, baudrate=40_000_000, sck=Pin(LCD_SCK),\
mosi=Pin(LCD_MOSI), miso=Pin(LCD_MISO))
##############################
# Set Here Adjuste Parameter
# x_min ===> x_max
# 4800 7350
# y_min -----------------
# | |
# 4700 | + + |
# | |
# | LCD Panel |
# | |_
# | | | USB connector
# 7700 | + + |~
# | |
# y_max -----------------
# ~~ USB connector
###########################################################
# 2025/07/24 ADJ
# 四隅ではなく、各40Pixcel 中央寄りの四隅の値を基準に決める方法に変更
# 2025/08/14 Adj No3 Touch LCD
# 左上の XT XY の値
result40_40 = [4800,4720] # [4900,4800]
# 右上の XT XY の値
result280_40 = [7400,4720] # [7450,4800]
# 左下の XT XY の値
result40_440 = [4800,7700] # [4900,7800]
# 右下の XT XY の値
result280_440 = [7400,7700] # [7450,7800]
# 右下の XT XY の値は、利用していない
x_min = int(result40_40[0] - ((result280_40[0] - result40_40[0]) *40 /(280 -40)))
x_max = int(result280_40[0] + ((result280_40[0] - result40_40[0]) *40 /(280 -40)))
y_min = int(result40_40[1] - ((result40_440[1] - result40_40[1]) *40 /(440 -40)))
y_max = int(result40_440[1] + ((result40_440[1] - result40_40[1]) *40 /(440 -40)))
#########################
x_range = x_max - x_min
y_range = y_max - y_min
#########################
# Result_list = [touch_,touch_Y]
# 2025/07/02 : self.rotate の方向で、LCD位置に合わせた座標を返す
if self.rotate == 0 or self.rotate == 180:
if self.rotate == 0: # X軸Y軸の座標入替なし and X軸Y軸とも 数値変換なし
X_Point = 320 - int((x_touch - x_min) *320 /x_range)
Y_Point = 480 - int((y_touch - y_min) *480 /y_range)
elif self.rotate == 180: # X軸Y軸の座標入替なし and Y軸は 数値大小入替
X_Point = int((x_touch - x_min) *320 /x_range)
Y_Point = int((y_touch - y_min) *480 /y_range)
# 範囲内に収める 2025/07/17 修正
if X_Point >= 320:
X_Point = 319
elif X_Point < 0:
X_Point = 0
if Y_Point >= 480:
Y_Point = 479
elif Y_Point < 0:
Y_Point = 0
else: # self.rotate == 90 or self.rotate == 270:
if self.rotate == 90: # X軸Y軸の座標入替あり and X軸は 数値大小入替
X_Point = 480 - int((y_touch - y_min) *480 /y_range)
Y_Point = int((x_touch - x_min) *320 /x_range)
elif self.rotate == 270: # X軸Y軸の座標入替あり and Y軸は 数値大小入替
X_Point = int((y_touch - y_min) *480 /y_range)
Y_Point = 320 - int((x_touch - x_min) *320 /x_range)
# 範囲内に収める 2025/07/17 修正
if X_Point >= 480:
X_Point = 479
elif X_Point < 0:
X_Point = 0
if Y_Point >= 320:
Y_Point = 319
elif Y_Point < 0:
Y_Point = 0
if TOUCH_ADJ: # タッチポイント調整用に生のポイントデータを返す
# 2025/07/23
Result_list = [X_Point, Y_Point, x_touch, y_touch]
else: # LCD Pixcel に変換したデータのみを返す
Result_list = [X_Point, Y_Point]
# 2025/06/27 : タッチされた座標を表示
print(Result_list)
return(Result_list)
#################################################
# MicroPython
#################################################
def bold_pixel(x, y, color, scale):
if scale >= 2:
s = int(scale /2)
x = 0 if (x -s) < 0 else x -s
y = 0 if (y -s) < 0 else y -s
LCD.fill_rect(x, y, scale, scale, color)
# 座標ポイント zs ze で指定された2点のPixel および、その周囲の8点同士を線で描く
def bold_line(zs, ze, color):
for x in range(-1,2):
for y in range(-1,2):
LCD.line(zs[0] +x, zs[1] +y, ze[0] +x, ze[1] +y, color)
# 座標ポイント で指定された2点のPixel および、右側と下側 4点同士を線で描く
def bold_line2(zs, ze, color):
for x in range(2):
for y in range(2):
LCD.line(zs[0] +x, zs[1] +y, ze[0] +x, ze[1] +y, color)
def one_write_line(zl, color_wave):
# zl[[zs], [z1], [z2], [z3], [z4], ]
if len(zl) >= 2:
z_end = zl[0]
for i in range(1, len(zl)):
z_start = z_end
# y軸は、反転することに注意
z_end =[zl[0][0] +zl[i][0], zl[0][1] -zl[i][1]]
bold_line(z_start, z_end, color_wave)
# WS 波形をLCD下半分の決まった位置に表示する
def wave_form(ws, color_back, color_wave):
xs = 0
xb = 8 # 枠の幅 x
ys = 264 # 240~259:[WS]Tab 260~263:Line
yl = ys +18 # 240~259:[WS]Tab 260~263:Line 中央の線
yb = 3 # 枠の幅 y
w = 64 # セルの全体幅
wx = 48 # セルの波形幅
h = 36 # セルの全体高さ
hy = 15 # セルの波形高さの半分 sin価数を利用するため 1/2 にしている
# ws 番号から描画開始位置を決めるためのテーブル
# ws=0, 1, 2, 3, 4,
zone_xs = [xs +w*0, xs +w*1, xs +w*2, xs +w*0, xs +w*3, \
# ws=5, 6, 7, 8, 9,
xs +w*4, xs +w*0, xs +w*4, xs +w*0, xs +w*1, \
# ws=10, 11, 12, 13, 14,
xs +w*2, xs +w*1, xs +w*3, xs +w*4, xs +w*1, \
# ws=15, 16, 17, 18, 19,
xs +w*0, xs +w*0, xs +w*1, xs +w*2, xs +w*2, \
# ws=20, 21, 22, 23, 24,
xs +w*3, xs +w*4, xs +w*2, xs +w*0, xs +w*0, \
# ws=25, 26, 27, 28, 29, 30,
xs +w*1, xs +w*2, xs +w*3, xs +w*3, xs +w*4, xs +w*3]
# ws=0, 1, 2, 3, 4,
zone_ys = [ys +h*0, ys +h*0, ys +h*0, ys +h*5, ys +h*0, \
# ws=5, 6, 7, 8, 9,
ys +h*0, ys +h*4, ys +h*4, ys +h*1, ys +h*1, \
# ws=10, 11, 12, 13, 14,
ys +h*1, ys +h*5, ys +h*1, ys +h*1, ys +h*4, \
# ws=15, 16, 17, 18, 19,
ys +h*0, ys +h*2, ys +h*2, ys +h*2, ys +h*5, \
# ws=20, 21, 22, 23, 24,
ys +h*2, ys +h*2, ys +h*4, ys +h*0, ys +h*3, \
# ws=25, 26, 27, 28, 29, 30,
ys +h*3, ys +h*3, ys +h*5, ys +h*3, ys +h*3, ys +h*4]
# 波形の Y軸 0 line 上下中心線
zone_yl = [yl +h*0, yl +h*0, yl +h*0, yl +h*5, yl +h*0, \
yl +h*0, yl +h*4, yl +h*4, yl +h*1, yl +h*1, \
yl +h*1, yl +h*5, yl +h*1, yl +h*1, yl +h*4, \
yl +h*0, yl +h*2, yl +h*2, yl +h*2, yl +h*5, \
yl +h*2, yl +h*2, yl +h*4, yl +h*0, yl +h*3, \
yl +h*3, yl +h*3, yl +h*5, yl +h*3, yl +h*3, yl +h*4]
if ws == 0:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
for i in range(wx):
xp = zone_xs[ws] +i +xb
# 円周360度を 60分割してサイン波形をプロットする
yp = zone_yl[ws] -int(math.sin(math.radians(i *(360/wx))) *hy)
bold_pixel(xp, yp, color_wave, 3)
elif ws == 1:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
for i in range(int(wx/2)+1):
xp = zone_xs[ws] +i +xb
# 円周360度を 60分割してサイン波形をプロットする
yp = zone_yl[ws] -int(math.sin(math.radians(i *(360/wx))) *hy)
bold_pixel(xp, yp, color_wave, 3)
# 直線部分を描く
xp = zone_xs[ws] +xb +24
yp = zone_yl[ws]
# 起点 1 2 3 4 5 6 7 8
zl = [[xp,yp], [+24,0]]
one_write_line(zl, color_wave)
elif ws == 2:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
for i in range(wx):
xp = zone_xs[ws] +i +xb
# 円周360度を 60分割してサイン波形をプロットする
yp = zone_yl[ws] -int(abs(math.sin(math.radians(i *(360/wx))) *hy))
bold_pixel(xp, yp, color_wave, 3)
elif ws == 3:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形の 1/4 をプロットする
for i in range(0, 12):
xp = zone_xs[ws] +i +xb
yp = zone_yl[ws] -int(abs(math.sin(math.radians(i *(360/wx))) *hy))
bold_pixel(xp, yp, color_wave, 3)
# 円周360度を 60分割してサイン波形の 3/4 をプロットする
for i in range(24, 36):
xp = zone_xs[ws] +i +xb
yp = zone_yl[ws] -int(abs(math.sin(math.radians(i *(360/wx))) *hy))
bold_pixel(xp, yp, color_wave, 3)
# 直線部分を描く
z1 = [zone_xs[ws] +xb +12, zone_ys[ws] +yb +0]
z2 = [zone_xs[ws] +xb +12, zone_ys[ws] +yb +hy]
z3 = [zone_xs[ws] +xb +24, zone_ys[ws] +yb +hy]
bold_line(z1, z2, color_wave)
bold_line(z2, z3, color_wave)
z4 = [zone_xs[ws] +xb +36, zone_ys[ws] +yb +0]
z5 = [zone_xs[ws] +xb +36, zone_ys[ws] +yb +hy]
z6 = [zone_xs[ws] +xb +48, zone_ys[ws] +yb +hy]
bold_line(z4, z5, color_wave)
bold_line(z5, z6, color_wave)
elif ws == 4:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形をプロットする
for i in range(30+1):
xp = zone_xs[ws] +i +xb *2
yp = zone_yl[ws] -int(math.sin(math.radians(i *(360/30))) *hy)
bold_pixel(xp, yp, color_wave, 3)
elif ws == 5:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形をプロットする
for i in range(30+1):
xp = zone_xs[ws] +i +xb *2
yp = zone_yl[ws] -int(abs(math.sin(math.radians(i *(360/30))) *hy))
bold_pixel(xp, yp, color_wave, 3)
elif ws == 6:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [0,+hy], [24,+hy], [24,-hy], [48,-hy], [48,0]]
one_write_line(zl, color_wave)
elif ws == 7:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# サイン波形の 180~270 をプロットする
for i in range(0, 24):
xp = zone_xs[ws] +i +xb
yp = zone_ys[ws] +yb +int(hy*2 - (abs(math.sin(math.radians(i *(360/(wx*2)) +180))) *(-1) *hy +hy*2))
bold_pixel(xp, yp, color_wave, 3)
# サイン波形の 270~360 をプロットする
for i in range(24, 48):
xp = zone_xs[ws] +i +xb
yp = zone_ys[ws] +yb +int(hy*2 - (abs(math.sin(math.radians(i *(360/(wx*2)) +0))) *hy))
bold_pixel(xp, yp, color_wave, 3)
# 直線部分を描く
z1 = [zone_xs[ws] +xb +0, zone_ys[ws] +yb +0]
z2 = [zone_xs[ws] +xb +0, zone_ys[ws] +yb +hy]
z3 = [zone_xs[ws] +xb +48, zone_ys[ws] +yb +hy*2]
z4 = [zone_xs[ws] +xb +48, zone_ys[ws] +yb +hy]
bold_line(z1, z2, color_wave)
bold_line(z3, z4, color_wave)
elif ws == 8:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形をプロットする
for i in range(wx):
xp = zone_xs[ws] +i +xb
y = -int(math.sin(math.radians(i *(360/wx))) *hy)
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
elif ws == 9:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形をプロットする
for i in range(int(wx/2)+1):
xp = zone_xs[ws] +i +xb
y = -int(math.sin(math.radians(i *(360/wx))) *hy)
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
z1 = [zone_xs[ws] +xb +24, zone_ys[ws] +yb +hy]
z2 = [zone_xs[ws] +xb +48, zone_ys[ws] +yb +hy]
bold_line(z1, z2, color_wave)
elif ws == 10:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形をプロットする
for i in range(wx):
xp = zone_xs[ws] +i +xb
y = -int(abs(math.sin(math.radians(i *(360/wx))) *hy))
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
elif ws == 11:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形の 1/4 をプロットする
for i in range(0, 12):
xp = zone_xs[ws] +i +xb
y = -int(abs(math.sin(math.radians(i *(360/wx))) *hy))
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
# 円周360度を 60分割してサイン波形の 3/4 をプロットする
for i in range(24, 36):
xp = zone_xs[ws] +i +xb
y = -int(abs(math.sin(math.radians(i *(360/wx))) *hy))
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
# 直線部分を描く
z1 = [zone_xs[ws] +xb +12, zone_ys[ws] +yb +5]
z2 = [zone_xs[ws] +xb +12, zone_ys[ws] +yb +hy]
z3 = [zone_xs[ws] +xb +24, zone_ys[ws] +yb +hy]
bold_line(z1, z2, color_wave)
bold_line(z2, z3, color_wave)
z4 = [zone_xs[ws] +xb +36, zone_ys[ws] +yb +5]
z5 = [zone_xs[ws] +xb +36, zone_ys[ws] +yb +hy]
z6 = [zone_xs[ws] +xb +48, zone_ys[ws] +yb +hy]
bold_line(z4, z5, color_wave)
bold_line(z5, z6, color_wave)
elif ws == 12:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形をプロットする
for i in range(30+1):
xp = zone_xs[ws] +i +xb *2
y = -int(math.sin(math.radians(i *(360/30))) *hy)
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
elif ws == 13:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形をプロットする
for i in range(30+1):
xp = zone_xs[ws] +i +xb *2
y = -int(abs(math.sin(math.radians(i *(360/30))) *hy))
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
elif ws == 14:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [0,+hy], [24,+hy], [24,0], [48,0]]
one_write_line(zl, color_wave)
elif ws == 15:
# Notthing
pass
elif ws == 16:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [12,+hy], [36,-hy], [48,0]]
one_write_line(zl, color_wave)
elif ws == 17:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [12,+hy], [24,0], [48,0]]
one_write_line(zl, color_wave)
elif ws == 18:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [12,+hy], [24,0], [36,+hy], [48,0]]
one_write_line(zl, color_wave)
elif ws == 19:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [12,+hy], [12,0], [24,0], [36,+hy], [36,0], [48,0]]
one_write_line(zl, color_wave)
elif ws == 20:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb*2
yp = zone_yl[ws]
zl = [[xp,yp], [7,+hy], [21,-hy], [28,0]]
one_write_line(zl, color_wave)
elif ws == 21:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb*2
yp = zone_yl[ws]
zl = [[xp,yp], [7,+hy], [14,0], [21,+hy], [28,0]]
one_write_line(zl, color_wave)
elif ws == 22:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
# 起点 1 2 3 4 5 6 7 8
zl = [[xp,yp], [0,+hy], [12,+hy], [12,0], [24,0], [24,+hy], [36,+hy], [36,0], [48,0]]
one_write_line(zl, color_wave)
elif ws == 23:
# Notthing
pass
elif ws == 24:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [24,+hy], [24,-hy], [48,0]]
one_write_line(zl, color_wave)
elif ws == 25:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [24,+hy], [24,0], [48,0]]
one_write_line(zl, color_wave)
elif ws == 26:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [24,+hy], [24,0], [48,+hy], [48,0]]
one_write_line(zl, color_wave)
elif ws == 27:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [12,+hy], [12,0], [24,0], [36,+hy], [36,0], [48,0]]
one_write_line(zl, color_wave)
elif ws == 28:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb*2
yp = zone_yl[ws]
zl = [[xp,yp], [14,+hy], [14,-hy], [28,0]]
one_write_line(zl, color_wave)
elif ws == 29:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb*2
yp = zone_yl[ws]
zl = [[xp,yp], [14,+hy], [14,0], [28,+hy], [28,0]]
one_write_line(zl, color_wave)
elif ws == 30:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb*2
yp = zone_yl[ws]
zl = [[xp,yp], [0,+hy], [12,+hy], [12,0], [36,0]]
one_write_line(zl, color_wave)
elif ws == 31:
# Nothing
pass
# ALG op(オペレーション)の四角の枠と数値を表示する
def alg_op(op_num_text, zl, fb,color_line, color_back, color_text, scale):
xb = 2 # line X の太さ(pixel数)
yb = 2 # line Y の太さ(pixel数)
xf = 7 # FB line の位置 x差分
yf = 11 # FB line の位置 y差分
xt = 2 # Text の開始位置 x差分
yt = -3 # Text の開始位置 y差分
if scale == 2:
zt = [zl[0] +xt*scale, zl[1] +yt*scale]
zs = [zl[0] , zl[1] -5*scale]
zf = [zl[0] -xf*scale, zl[1] -yf*scale]
w_op = 24*scale # 文字幅 8 pixel 文字 x 3文字
h_op = 8*scale # 文字高さ
else:
zt = [zl[0] +xt, zl[1] +yt]
zs = [zl[0] , zl[1] -5]
zf = [zl[0] -xf, zl[1] -yf]
w_op = 24 # 文字幅 8 pixel 文字 x 3文字
h_op = 8 # 文字高さ
if scale == 2:
if fb ==1: # フィードバックの枠線を描く、中抜き方式
LCD.fill_rect(zf[0], zf[1], w_op +xb*2 +xf*2*scale, yf*scale +yb ,color_line)
LCD.fill_rect(zf[0] +xb, zf[1] +yb, w_op +xf*2*scale, yf*scale -yb ,LCD.WHITE)
LCD.fill_rect(zs[0], zs[1], w_op +xb*2, h_op +yb*2, color_line)
LCD.fill_rect(zs[0] +xb, zs[1] +yb, w_op, h_op, color_back)
# LCD.text(op_num_text, zt[0], zt[1], color_text)
LCD.text_scaled(op_num_text, zt[0], zt[1], color_text, scale)
else:
if fb ==1: # フィードバックの枠線を描く、中抜き方式
LCD.fill_rect(zf[0], zf[1], w_op +xb*2 +xf*2, yf +yb ,color_line)
LCD.fill_rect(zf[0] +xb, zf[1] +yb, w_op +xf*2, yf -yb ,LCD.WHITE)
LCD.fill_rect(zs[0], zs[1], w_op +xb*2, h_op +yb*2, color_line)
LCD.fill_rect(zs[0] +xb, zs[1] +yb, w_op, h_op, color_back)
LCD.text(op_num_text, zt[0], zt[1], color_text)
# ALG を下半分の決まった位置に表示する。+ 画面上半分に stageで指定されたものを拡大表示
def alg_patarn(alg, stage, color_line, color_back, color_text):
# scale == 2 の場合は、2倍に拡大して上段に表示する。その位置の設定
zl_algS = [10, 40] # 拡大して表示する場合の開始位置
# 下半分の決まった位置に表示する各アルゴリズム基準となる OP左端の上下中心点の設定
zl_alg0 = [173 +28, 245 +12+16 +5]
zl_alg1 = [ 31 +28, 245 +12+16 +5]
zl_alg2 = [ 31 +28, 245 +12+16*3 +22 +3]
zl_alg3 = [173, 245 +12+16*3 +3]
zl_alg4 = [173, 245 +12+16*5 +22]
zl_alg5 = [173 +28, 245 +12+16*7 +22]
zl_alg6 = [173, 245 +12+16*9 +22*2]
zl_alg7 = [ 31, 245 +12+16*5 +22*4]
# ALG タイトル表示位置
alg_textS = [10, 35] # 拡大して表示する場合の開始位置
alg_text0 = [165 -27, 245 +12 +10]
alg_text1 = [ 5, 245 +12 +10]
alg_text2 = [ 5, 245 +12+16*2 +22 +30]
alg_text3 = [165 -27, 245 +12+16*2 +10 +3]
alg_text4 = [165 -27, 245 +12+16*4 +22]
alg_text5 = [165 -27, 245 +12+16*6 +22 +10]
alg_text6 = [165 -27, 245 +12+16*8 +22*2 +10]
alg_text7 = [ 5, 245 +12+16*4 +22*4 +20]
# 暗号化された stage を復号
alg_on_stage = int(stage /3)
only_down = False
only_up = False
both = False
if stage %3 == 0:
only_down = True # 下半分のみ表示
elif stage %3 == 1:
only_up = True # 上半分のみ表示
else: # stage %3 == 2
both = True # 両方表示
if alg == 0:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0] +28 +14 , z_op1[1]]
z_je = [z_op2[0] +28 +14 , z_op2[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg0
z_op2 = [z_op1[0] +28 +14 , z_op1[1]]
z_je = [z_op2[0] +28 +14 , z_op2[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text0
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 1:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0], z_op1[1] +22]
z_je = [z_op1[0] +28 +14*2, z_op1[1]]
z_j1 = [z_op1[0] +28 +14 , z_op1[1]]
z_j2 = [z_op2[0] +28 +14 , z_op2[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
z_j1 = [z_j1[0]*2, z_j1[1]*2]
z_j2 = [z_j2[0]*2, z_j2[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j2, color_line)
bold_line2(z_j1 , z_j2, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg1
z_op2 = [z_op1[0], z_op1[1] +22]
z_je = [z_op1[0] +28 +14*2, z_op1[1]]
z_j1 = [z_op1[0] +28 +14 , z_op1[1]]
z_j2 = [z_op2[0] +28 +14 , z_op2[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j2, color_line)
bold_line2(z_j1 , z_j2, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text1
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 2:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0], z_op1[1] +22]
z_op3 = [z_op1[0], z_op1[1] +22*2]
z_op4 = [z_op1[0], z_op1[1] +22*3]
z_je = [z_op1[0] +28 +14*2, z_op1[1]]
z_j1 = [z_op1[0] +28 +14 , z_op1[1]]
z_j2 = [z_op2[0] +28 +14 , z_op2[1]]
z_j3 = [z_op3[0] +28 +14 , z_op3[1]]
z_j4 = [z_op4[0] +28 +14 , z_op4[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_op3 = [z_op3[0]*2, z_op3[1]*2]
z_op4 = [z_op4[0]*2, z_op4[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
z_j1 = [z_j1[0]*2, z_j1[1]*2]
z_j2 = [z_j2[0]*2, z_j2[1]*2]
z_j3 = [z_j3[0]*2, z_j3[1]*2]
z_j4 = [z_j4[0]*2, z_j4[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j2, color_line)
bold_line2(z_op3, z_j3, color_line)
bold_line2(z_op4, z_j4, color_line)
bold_line2(z_j1 , z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
alg_op(' 3 ', z_op3, 1, color_line, color_back, color_text, 2)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg2
z_op2 = [z_op1[0], z_op1[1] +22]
z_op3 = [z_op1[0], z_op1[1] +22*2]
z_op4 = [z_op1[0], z_op1[1] +22*3]
z_je = [z_op1[0] +28 +14*2, z_op1[1]]
z_j1 = [z_op1[0] +28 +14 , z_op1[1]]
z_j2 = [z_op2[0] +28 +14 , z_op2[1]]
z_j3 = [z_op3[0] +28 +14 , z_op3[1]]
z_j4 = [z_op4[0] +28 +14 , z_op4[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j2, color_line)
bold_line2(z_op3, z_j3, color_line)
bold_line2(z_op4, z_j4, color_line)
bold_line2(z_j1 , z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
alg_op(' 3 ', z_op3, 1, color_line, color_back, color_text, 1)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text2
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 3:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0] , z_op1[1] +22]
z_op3 = [z_op1[0] +28 +14 , z_op1[1] +22]
z_op4 = [z_op1[0] +28*2 +14*3 , z_op1[1]]
z_je = [z_op4[0] +28 +14 , z_op4[1]]
z_j1 = [z_op1[0] +28*2 +14*2 , z_op1[1]]
z_j3 = [z_op3[0] +28 +14 , z_op3[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_op3 = [z_op3[0]*2, z_op3[1]*2]
z_op4 = [z_op4[0]*2, z_op4[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
z_j1 = [z_j1[0]*2, z_j1[1]*2]
z_j3 = [z_j3[0]*2, z_j3[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j3, color_line)
bold_line2(z_j1, z_j3, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 2)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg3
z_op2 = [z_op1[0] , z_op1[1] +22]
z_op3 = [z_op1[0] +28 +14 , z_op1[1] +22]
z_op4 = [z_op1[0] +28*2 +14*3 , z_op1[1]]
z_je = [z_op4[0] +28 +14 , z_op4[1]]
z_j1 = [z_op1[0] +28*2 +14*2 , z_op1[1]]
z_j3 = [z_op3[0] +28 +14 , z_op3[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j3, color_line)
bold_line2(z_j1, z_j3, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 1)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text3
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 4:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0] +28 +14 , z_op1[1]]
z_op3 = [z_op2[0] +28 +7 , z_op1[1]]
z_op4 = [z_op3[0] +28 +7 , z_op1[1]]
z_je = [z_op4[0] +28 +14 , z_op2[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_op3 = [z_op3[0]*2, z_op3[1]*2]
z_op4 = [z_op4[0]*2, z_op4[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
# op 表示
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 2)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg4
z_op2 = [z_op1[0] +28 +14 , z_op1[1]]
z_op3 = [z_op2[0] +28 +7 , z_op1[1]]
z_op4 = [z_op3[0] +28 +7 , z_op1[1]]
z_je = [z_op4[0] +28 +14 , z_op2[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 1)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text4
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 5:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0] +28 +14 , z_op1[1]]
z_op3 = [z_op1[0] , z_op1[1] +22]
z_op4 = [z_op2[0] , z_op2[1] +22]
z_je = [z_op2[0] +28 +14*2 , z_op2[1]]
z_j2 = [z_op2[0] +28 +14 , z_op2[1]]
z_j4 = [z_op4[0] +28 +14 , z_op4[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_op3 = [z_op3[0]*2, z_op3[1]*2]
z_op4 = [z_op4[0]*2, z_op4[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
z_j2 = [z_j2[0]*2, z_j2[1]*2]
z_j4 = [z_j4[0]*2, z_j4[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op3, z_j4, color_line)
bold_line2(z_j2, z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
alg_op(' 3 ', z_op3, 1, color_line, color_back, color_text, 2)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg5
z_op2 = [z_op1[0] +28 +14 , z_op1[1]]
z_op3 = [z_op1[0] , z_op1[1] +22]
z_op4 = [z_op2[0] , z_op2[1] +22]
z_je = [z_op2[0] +28 +14*2 , z_op2[1]]
z_j2 = [z_op2[0] +28 +14 , z_op2[1]]
z_j4 = [z_op4[0] +28 +14 , z_op4[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op3, z_j4, color_line)
bold_line2(z_j2, z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
alg_op(' 3 ', z_op3, 1, color_line, color_back, color_text, 1)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text5
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 6:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0] , z_op1[1] +22]
z_op3 = [z_op2[0] +28 +14 , z_op2[1]]
z_op4 = [z_op3[0] +28 +7 , z_op3[1]]
z_je = [z_op1[0] +28*2 +7 +14*5 , z_op1[1]]
z_j1 = [z_op1[0] +28*2 +7 +14*4 , z_op1[1]]
z_j4 = [z_op4[0] +28 +14 , z_op4[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_op3 = [z_op3[0]*2, z_op3[1]*2]
z_op4 = [z_op4[0]*2, z_op4[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
z_j1 = [z_j1[0]*2, z_j1[1]*2]
z_j4 = [z_j4[0]*2, z_j4[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j4, color_line)
bold_line2(z_j1, z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 2)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg6
z_op2 = [z_op1[0] , z_op1[1] +22]
z_op3 = [z_op2[0] +28 +14 , z_op2[1]]
z_op4 = [z_op3[0] +28 +7 , z_op3[1]]
z_je = [z_op1[0] +28*2 +7 +14*5 , z_op1[1]]
z_j1 = [z_op1[0] +28*2 +7 +14*4 , z_op1[1]]
z_j4 = [z_op4[0] +28 +14 , z_op4[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j4, color_line)
bold_line2(z_j1, z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 1)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text6
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 7:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op2 = [zl_algS[0], zl_algS[1] +22]
# op2 を起点にする
z_op1 = [z_op2[0] +35, z_op2[1] -22]
z_op3 = [z_op2[0] +28 +14, z_op2[1]]
z_op4 = [z_op1[0] , z_op1[1] +22*2]
z_je = [z_op1[0] +28 +21 +14, z_op1[1]]
z_j1 = [z_op1[0] +28 +21 , z_op1[1]]
z_j3 = [z_op3[0] +28 +14 , z_op3[1]]
z_j4 = [z_op4[0] +28 +21 , z_op4[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_op3 = [z_op3[0]*2, z_op3[1]*2]
z_op4 = [z_op4[0]*2, z_op4[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
z_j1 = [z_j1[0]*2, z_j1[1]*2]
z_j3 = [z_j3[0]*2, z_j3[1]*2]
z_j4 = [z_j4[0]*2, z_j4[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j3, color_line)
bold_line2(z_op4, z_j4, color_line)
bold_line2(z_j1 , z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 2)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op2 = [zl_alg7[0], zl_alg7[1] +22]
# op2 を起点にする
z_op1 = [z_op2[0] +35, z_op2[1] -22]
z_op3 = [z_op2[0] +28 +14, z_op2[1]]
z_op4 = [z_op1[0] , z_op1[1] +22*2]
z_je = [z_op1[0] +28 +21 +14, z_op1[1]]
z_j1 = [z_op1[0] +28 +21 , z_op1[1]]
z_j3 = [z_op3[0] +28 +14 , z_op3[1]]
z_j4 = [z_op4[0] +28 +21 , z_op4[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j3, color_line)
bold_line2(z_op4, z_j4, color_line)
bold_line2(z_j1 , z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 1)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text7
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
# タブ の四角の枠とタブの名前を表示する
def tab(tab_name, zs, chr_num, color_line, color_back, color_text):
# zs:TAB LABEL 開始座標
# chr_num:TAB LABEL の文字幅
chr_w = 16
chr_h = 16
xb = 2 # line X の太さ(pixel数)
yb = 2 # line Y の太さ(pixel数)
# 大きな四角の内側に小さな四角を描き、差分を枠線として表示する
LCD.fill_rect(zs[0], zs[1], chr_w *chr_num +xb*2, chr_h +yb*2, color_line)
LCD.fill_rect(zs[0] +xb, zs[1] +yb, chr_w *chr_num, chr_h, color_back)
LCD.text_scaled(tab_name,zs[0] +xb, zs[1] +yb, color_text, 2)
# main menu
def dsp_main_menu():
tab_get = [ 6,2]
tab_com = [ 86,2]
tab_op = [166,2]
tab_set = [246,2]
chr_num = 4
color_line = LCD.BLUE
color_back = LCD.GRAY
color_text = LCD.BLACK
tab('get' , tab_get, chr_num, color_line, color_back, color_text)
tab('com' , tab_com, chr_num, color_line, color_back, color_text)
tab('op' , tab_op, chr_num, color_line, color_back, color_text)
tab('set', tab_set,chr_num, color_line, color_back, color_text)
# sub menu
def dsp_sub_menu_op():
tab_ws = [ 6,240]
tab_mul = [ 86,240]
tab_adsr = [166,240]
tab_dam = [246,240]
chr_num = 4
color_line = LCD.BLUE
color_back = LCD.GRAY
color_text = LCD.BLACK
tab('ws' , tab_ws, chr_num, color_line, color_back, color_text)
tab('mul' , tab_mul, chr_num, color_line, color_back, color_text)
tab('adsr', tab_adsr,chr_num, color_line, color_back, color_text)
tab('dam' , tab_dam, chr_num, color_line, color_back, color_text)
if __name__=='__main__':
###########################################################
print('gc.mem_free() = ', gc.mem_free()) # メモリ利用状況
###########################################################
LCD = LCD_3inch5()
LCD.bl_ctrl(100)
# 表示関係の変数の設定 #####################
# TAB 表示位置の設定
tab_get = [ 6,2]
tab_com = [ 86,2]
tab_op = [166,2]
tab_set = [246,2]
tab_ws = [ 6,240]
tab_mul = [ 86,240]
tab_adsr = [166,240]
tab_dam = [246,240]
tab_alg = [ 6,240]
tab_bo_lfo = [ 86,240]
# TAB 文字幅の設定
chr_get = 4
chr_com = 4
chr_op = 4
chr_set = 4
chr_ws = 4
chr_mul = 4
chr_adsr = 4
chr_dam = 4
chr_alg = 4
chr_bo_lfo = 6
# カラー表示テスト
lcd_color_list = [LCD.BLACK, LCD.RED, LCD.GREEN, LCD.BLUE, LCD.YELLOW,\
LCD.PURPLE, LCD.BLUEGREEN, LCD.GRAY, LCD.WHITE]
# 2025/08/20 Test
for n in range(1):
print(f'Color Patturn Test n = {n}')
for i in range(len(lcd_color_list)):
LCD.fill(lcd_color_list[i])
time.sleep_ms(10)
LCD.show()
time.sleep_ms(90)
LCD.fill(LCD.WHITE)
###########################################################
print('gc.mem_free() = ', gc.mem_free()) # メモリ利用状況
###########################################################
# 2025/08/20 WS Test
for n in range(1):
print(f'WS Test n = {n}')
# ws 波形の表示テスト
for ws in range(31):
# 2025/08/22-16:03 Test Add
LCD.fill(LCD.WHITE)
dsp_main_menu()
dsp_sub_menu_op()
# wave_form(ws, LCD.WHITE, LCD.BLACK)
wave_form(ws, LCD.YELLOW, LCD.BLACK)
LCD.show()
time.sleep_ms(10)
###########################################################
# print('gc.mem_free() = ', gc.mem_free()) # メモリ利用状況
###########################################################
time.sleep(1)
# ALG Test Patarn 表示
color_line = LCD.BLACK
color_back = LCD.YELLOW
color_text = LCD.RED
ONLY_DOWN = 0
ONLY_UP = 1
BOTH = 2
for n in range(1000):
print(f'ALG Test n = {n}')
for i in range(8):
LCD.fill(LCD.WHITE)
dsp_main_menu()
dsp_sub_menu_op()
alg = i
alg_on_stage = alg # 拡大して上半分に表示したい alg番号
stage = alg_on_stage *3 + BOTH # 暗号化
alg_patarn(alg, stage, color_line, color_back, color_text)
LCD.show()
time.sleep_ms(10)
###########################################################
# print('gc.mem_free() = ', gc.mem_free()) # メモリ利用状況
###########################################################
time.sleep(1)
print('LCD.rotate = ', LCD.rotate)
X_Point_Old = 0
Y_Point_Old = 0
#調整用ポイントの座標の設定
# TOUCH_ADJ = True
# ROTATE = const(180) にすること
if LCD.rotate == 0 or LCD.rotate == 180: # 縦長表示 の直後
# 調整用ポイントの座標の設定
pos40_40 = [ 40, 40]
pos280_40 = [280, 40]
pos40_440 = [ 40,440]
pos280_440 = [280,440]
#color BRG
LCD.fill(LCD.WHITE)
# 調整用ポイントの座標を 5Pixel x 5Pixel で表示する
LCD.fill_rect(pos40_40[0]-2, pos40_40[1]-2, 5, 5, LCD.RED)
LCD.fill_rect(pos280_40[0]-2, pos280_40[1]-2, 5, 5, LCD.RED)
LCD.fill_rect(pos40_440[0]-2, pos40_440[1]-2, 5, 5, LCD.RED)
LCD.fill_rect(pos280_440[0]-2, pos280_440[1]-2, 5, 5, LCD.RED)
LCD.show()
scope = 10 # 移動平均 Average 個数
X_listT = [None] * scope
Y_listT = [None] * scope
X_listL = [None] * scope
Y_listL = [None] * scope
cnt_scope = 0
# 各ポジションの集計結果を利用可能(10回以上計測)になればセット
flag40_40 = 0
flag280_40 = 0
flag40_440 = 0
flag280_440 = 0
# 測定結果が出たらセット
flag_result = 0
# Touch Point 表示
while True:
get = LCD.touch_get()
if get != None:
# タッチされているなら
if TOUCH_ADJ:
# 調整モードなら、タッチ生データ get[2], get[3] を取得
X_PointL = get[0]
Y_PointL = get[1]
X_PointT = get[2]
Y_PointT = get[3]
else:
# LCD 座標変換データ取得
X_PointL = get[0]
Y_PointL = get[1]
# 移動平均計算用にデータを記録
X_listL[cnt_scope] = X_PointL
Y_listL[cnt_scope] = Y_PointL
X_listT[cnt_scope] = X_PointT
Y_listT[cnt_scope] = Y_PointT
if flag_result == 0:
cnt_scope += 1
if cnt_scope >= scope:
cnt_scope = 0
if flag_result == 0:
flag_result = 1
else:
# 移動平均 10 計算
X_totalL = 0
Y_totalL = 0
X_totalT = 0
Y_totalT = 0
for i in range(scope):
X_totalL += X_listL[i]
Y_totalL += Y_listL[i]
X_totalT += X_listT[i]
Y_totalT += Y_listT[i]
# 移動平均 10
X_aveL = int(X_totalL / scope)
Y_aveL = int(Y_totalL / scope)
X_aveT = int(X_totalT / scope)
Y_aveT = int(Y_totalT / scope)
# 領域別に表示
# 初期状態 中心と思われる 4800 4700 の +400 +400
if X_aveT < 5200 and Y_aveT < 5100:
# pos40_40 の 値を収録
ave40_40 = [X_aveT, Y_aveT]
flag40_40 += 1
if flag40_40 >= 10:
# 文字領域を 白色にしてから表示
LCD.fill_rect(20,80,16*8,80, LCD.WHITE)
LCD.text_scaled(f'XL:{X_aveL}',20, 80,LCD.BLUE, 2)
LCD.text_scaled(f'XT:{X_aveT}',20,100,LCD.BLUE, 2)
LCD.text_scaled(f'YL:{Y_aveL}',20,120,LCD.BLUE, 2)
LCD.text_scaled(f'YT:{Y_aveT}',20,140,LCD.BLUE, 2)
# 初期状態 中心と思われる 7350 4700 の -400 +400
elif X_aveT > 6950 and Y_aveT < 5100:
# pos280_40 の 値を収録
ave280_40 = [X_aveT, Y_aveT]
flag280_40 += 1
if flag280_40 >= 10:
# 文字領域を 白色にしてから表示
LCD.fill_rect(180,80,16*8,80, LCD.WHITE)
LCD.text_scaled(f'XL:{X_aveL}',180, 80,LCD.BLUE, 2)
LCD.text_scaled(f'XT:{X_aveT}',180,100,LCD.BLUE, 2)
LCD.text_scaled(f'YL:{Y_aveL}',180,120,LCD.BLUE, 2)
LCD.text_scaled(f'YT:{Y_aveT}',180,140,LCD.BLUE, 2)
# 初期状態 中心と思われる 4800 7700 の +400 -400
elif X_aveT < 5200 and Y_aveT > 7300:
# pos40_440 の 値を収録
ave40_440 = [X_aveT, Y_aveT]
flag40_440 += 1
if flag40_440 >= 10:
# 文字領域を 白色にしてから表示
LCD.fill_rect(20,340,16*8,80, LCD.WHITE)
LCD.text_scaled(f'XL:{X_aveL}',20,340,LCD.BLUE, 2)
LCD.text_scaled(f'XT:{X_aveT}',20,360,LCD.BLUE, 2)
LCD.text_scaled(f'YL:{Y_aveL}',20,380,LCD.BLUE, 2)
LCD.text_scaled(f'YT:{Y_aveT}',20,400,LCD.BLUE, 2)
# 初期状態 中心と思われる 7350 7700 の -400 -400
elif X_aveT > 6950 and Y_aveT > 7300:
# pos280_440 の 値を収録
ave280_440 = [X_aveT, Y_aveT]
flag280_440 += 1
if flag280_440 >= 10:
# 文字領域を 白色にしてから表示
LCD.fill_rect(180,340,16*8,80, LCD.WHITE)
LCD.text_scaled(f'XL:{X_aveL}',180,340,LCD.BLUE, 2)
LCD.text_scaled(f'XT:{X_aveT}',180,360,LCD.BLUE, 2)
LCD.text_scaled(f'YL:{Y_aveL}',180,380,LCD.BLUE, 2)
LCD.text_scaled(f'YT:{Y_aveT}',180,400,LCD.BLUE, 2)
# 四隅のデータが揃ったら結果を表示する
if flag280_40 >= 10 and flag280_40 >= 10 and flag40_440 >= 10 and flag280_440 >= 10:
LCD.fill_rect(10,200,310,120, LCD.WHITE)
LCD.text_scaled(f'Set def Result Data',10,200,LCD.BLACK, 2)
LCD.text_scaled(f'def touch_get(self):',10,220,LCD.BLACK, 2)
LCD.text_scaled(f'rt40_40 ={ave40_40[0]},{ave40_40[1]}',10,240,LCD.BLACK, 2)
LCD.text_scaled(f'rt280_40 ={ave280_40[0]},{ave280_40[1]}',10,260,LCD.BLACK, 2)
LCD.text_scaled(f'rt40_440 ={ave40_440[0]},{ave40_440[1]}',10,280,LCD.BLACK, 2)
LCD.text_scaled(f'rt280_440={ave280_440[0]},{ave280_440[1]}',10,300,LCD.BLACK, 2)
LCD.show()
else:
cnt_scope = 0
flag_result = 0
time.sleep_ms(50)
# 初期のプログラムを残し、ポイントの軌跡を残す
else: # LCD.rotate == 90 or LCD.rotate == 270 : 横長表示
#color BRG
LCD.fill(LCD.WHITE)
LCD.fill_rect(140,5,200,30,LCD.RED)
# LCD.text("Raspberry Pi Pico",170,17,LCD.WHITE)
# 黄文字表示
LCD.text("Raspberry Pi Pico",170,17,LCD.YELLOW)
LCD.text("3.5' IPS LCD TEST",170,47,LCD.BLACK)
display_color = 0x001F
for i in range(len("Raspberry Pi Pico")):
LCD.fill_rect(i*16+108,70,14,20,(display_color))
display_color = display_color << 1
# 2025/06/29:Add 2倍の拡大文字を表示
LCD.text_scaled("Raspberry Pi Pico",108,72,LCD.BLUEGREEN, 2)
# 右下 隅 のセルを赤色にする
LCD.fill_rect(59 *8, 19 *8, 8, 8, LCD.RED)
LCD.fill_rect(59 *8, 39 *8, 8, 8, LCD.RED)
display_color = 0x001F
for i in range(0,12):
# LCD.fill_rect(i*30+60,100,30,50,(display_color))
LCD.fill_rect(i*30+60,120,30,50,(display_color))
display_color = display_color << 1
LCD.show()
# Touch Point 表示
while True:
get = LCD.touch_get()
if get != None:
# 8bits 単位のセルに変換
X_Point = int(get[0] /8)
Y_Point = int(get[1] /8)
if X_Point_Old != X_Point or Y_Point_Old != Y_Point:
# 前回と異なるセルならば
# 前回のセルを黄色にする
if Y_Point_Old < 40:
# LCD.show_up エリアならば
LCD.fill_rect(X_Point_Old *8, Y_Point_Old *8, 8, 8, LCD.YELLOW)
LCD.show()
# 今回のセルを赤色にする
if Y_Point < 40:
# LCD.show_up エリアならば
LCD.fill_rect(X_Point *8, Y_Point *8, 8, 8, LCD.RED)
LCD.show()
# Old Pointer 更新
X_Point_Old = X_Point
Y_Point_Old = Y_Point
time.sleep_ms(100)
追加実験その③
前記②のプログラムから、WS表示に関するプログラムを取り除き、ALG表示を繰り返すプログラムにして、ALGパターンの表示を繰り返します。
嵌まり込みません。
ファイルサイズ57.6KB
touch_lcd_TestOK_OnlyALG.py
########################################################################
# WAVE SHARE Pico-ResTouch-LCD-3.5 Test Program をライブラリとして独立させた
# 用意された main_3inch5.py をテスト・改良
# 2025/08/11 : main_3inch5-scale-712.py からライブラリとして独立させた
# touch_lcd-20250811-1214.py
# タッチパネルの調整と初期画面表示は残した状態
# へその緒をなくした(不要なものを削除した)+ MicroPython用の関数も削除
#
########################################################################
# ①初回の起動で表示しない
# self.spi = SPI(1,6_000_000) をコメントアウトでOK
#
# ②self.rotate = 270 では、タッチしても反転表示しないことを修正した。
# ⑤ で LCDの座標に合わせた形で返すように変更
#
# ③文字を整数倍の拡大文字を表示可能にした。(8x8 のフォントでは、判読困難)
# import framebuf で、ビットマップイメージを作成している関係から
# 8x8 のフォントしか扱えないようだ。
# def text_scaled(self, text, x, y, color, scale=1): を追加
# scale で指定した整数倍の拡大文字を表示可能にした。
#
# ④色の追加設定
# def rgb2color565(self, r, g, b): を用意して RBGから構成可能にした。
# Return color565 from RGB color value. Red Green Blue
# self.YELLOW = self.rgb2color565(0xFF, 0xFF, 0x00)
# self.PURPLE = self.rgb2color565(0xFF, 0x00, 0xFF)
# self.BLUEGREEN = self.rgb2color565(0x00, 0xFF, 0xFF)
#
# ⑤タッチパネルの座標をLCDの座標同様になるような形で返すように変更した。
# def self.touch_get(self): の中で、self.rotate を用いて、
# タッチパネルの座標が、LCDの座標(左上隅が 0 0)と一致させるようにした。
# X:横軸 Y:縦軸 左上隅が、X=0, Y=0
#
# ⑥1つのバッファで全画面の表示する 2025/07/15 (20925/07/11の間違いを修正)
# メモリが2倍の Pico2(RP2350)を使用して
# バッファをフルサイズ(480x320)にすれば、1つのバッファで全画面の表示ができる。
#
# ⑦ WS 波形表示
#
# ⑧ ALG パターン表示
#
# ⑨ Pico2(RP2350) 使用を前提にプログラムを整理
# def touch_get(self) の辺り
#
# ⑩ Pimoroni Pico Pi Plus 2 PSRAM 8MB を利用する
#
#
#
########################################################################
from machine import Pin,SPI,PWM
from micropython import const
import math
import framebuf
import time
import os
import gc # メモリ利用状況表示用
# for DEBUG
PRINT_TOUCH_POS = True # タッチ座標を表示する時
TOUCH_ADJ = True # タッチ座標を取得する時。ROTATE = const(180) にすること
LCD_DC = const(8)
LCD_CS = const(9)
LCD_SCK = const(10)
LCD_MOSI = const(11)
LCD_MISO = const(12)
LCD_BL = const(13)
LCD_RST = const(15)
TP_CS = const(16)
TP_IRQ = const(17)
##############################################################
# LCDの向きに合わせて設定する
# Set the rotation Angle to 0°, 90°, 180° or 270°
# 0:USBが左辺上 90:USBが下辺左 180:USBが右辺下 270:USBが上辺右
# タッチ座標を取得して調整するときは。ROTATE = const(180) にすること
##############################################################
ROTATE = const(180)
# この Pixel 分を上下左右に拡大したエリアをタッチ有効とする
# 一部、この倍の領域にしている
TOUCH = const(8)
class LCD_3inch5(framebuf.FrameBuffer):
def __init__(self):
self.RED = 0x07E0
self.GREEN = 0x001f
self.BLUE = 0xf800
self.WHITE = 0xffff
self.BLACK = 0x0000
# Return color565 from RGB color value.
# Red Green Blue
self.YELLOW = self.rgb2color565(0xFF, 0xFF, 0x00)
self.PURPLE = self.rgb2color565(0xFF, 0x00, 0xFF)
self.BLUEGREEN = self.rgb2color565(0x00, 0xFF, 0xFF)
self.GRAY = self.rgb2color565(0x50, 0x28, 0x15)
self.rotate = ROTATE
# 2025/07/15 ここの設定の修正が必要だった
if self.rotate == 0 or self.rotate == 180:
self.width = 320
# 2025/07/15 self.height = 240
self.height = 480
else:
self.width = 480
# 2025/07/15 self.height = 160
self.height = 320
# 制御信号端子の設定
self.cs = Pin(LCD_CS,Pin.OUT)
self.rst = Pin(LCD_RST,Pin.OUT)
self.dc = Pin(LCD_DC,Pin.OUT)
self.tp_cs =Pin(TP_CS,Pin.OUT)
self.irq = Pin(TP_IRQ,Pin.IN)
# 制御信号端子の初期状態設定
self.cs(1)
self.dc(1)
self.rst(1)
self.tp_cs(1)
# LCD(ILI9488) 40MHz
self.spi_lcd = SPI(1,baudrate=40_000_000,sck=Pin(LCD_SCK),\
mosi=Pin(LCD_MOSI),miso=Pin(LCD_MISO))
print(self.spi_lcd)
#################### このあたりが難解 ################################
# Pico2(RP2350) ならば、画面一杯をしてしてもメモリエラーにならない
self.buffer = bytearray(self.height * self.width * 2)
super().__init__(self.buffer, self.width, self.height, framebuf.RGB565)
#########################################################################
print('gc.mem_free() = ', gc.mem_free()) # メモリ利用状況
self.init_display()
# color565 is Blue:5bits, Red:6bits, and Green:5bits 16bits
# Return color565 from RGB color value.
def rgb2color565(self, r, g, b):
return (r & 0xFC) << 3 | (g & 0xF8) >> 3 | (b & 0xF8) << 8
def init_display(self):
self.rst(0)
time.sleep_ms(10)
self.rst(1)
time.sleep_ms(50)
# INVON = const(0x21) # Display inversion on
self.write_cmd(0x21)
# Power Control 3
self.write_cmd(0xC2)
self.write_data(0x33)
# VMCTR1 = const(0xC5) # VCOM control 1
self.write_cmd(0xC5)
self.write_data(0x00)
self.write_data(0x1e)
self.write_data(0x80)
# FRMCTR1 = const(0xB1) # Frame rate control (In normal mode/full colors)
self.write_cmd(0xB1)
self.write_data(0xB0)
# GMCTRP1 = const(0xE0) # Positive gamma correction
self.write_cmd(0xE0)
self.write_data(0x00)
self.write_data(0x13)
self.write_data(0x18)
self.write_data(0x04)
self.write_data(0x0F)
self.write_data(0x06)
self.write_data(0x3a)
self.write_data(0x56)
self.write_data(0x4d)
self.write_data(0x03)
self.write_data(0x0a)
self.write_data(0x06)
self.write_data(0x30)
self.write_data(0x3e)
self.write_data(0x0f)
# GMCTRN1 = const(0xE1) # Negative gamma correction
self.write_cmd(0xE1)
self.write_data(0x00)
self.write_data(0x13)
self.write_data(0x18)
self.write_data(0x01)
self.write_data(0x11)
self.write_data(0x06)
self.write_data(0x38)
self.write_data(0x34)
self.write_data(0x4d)
self.write_data(0x06)
self.write_data(0x0d)
self.write_data(0x0b)
self.write_data(0x31)
self.write_data(0x37)
self.write_data(0x0f)
# PIXFMT = const(0x3A) # COLMOD: Pixel format set
self.write_cmd(0x3A)
self.write_data(0x55) # 16bits/pixel
# SLPOUT = const(0x11) # Exit sleep mode
self.write_cmd(0x11)
time.sleep_ms(120)
self.write_cmd(0x29)
# DFUNCTR = const(0xB6) # Display function control
self.write_cmd(0xB6)
self.write_data(0x00)
self.write_data(0x62)
# MADCTL = const(0x36) # Memory access control
self.write_cmd(0x36) # Sets the memory access mode for rotation
# bit 7-6:パネル方向 bit 5=0:横長 1:縦長
# bit 3は、常に1 bit 7654 3210
if self.rotate == 0:
self.write_data(0x88) # 1000 1000
elif self.rotate == 180:
self.write_data(0x48) # 0100 1000
elif self.rotate == 90:
self.write_data(0xe8) # 1110 1000
else:
self.write_data(0x28) # 0010 1000
def write_cmd(self, cmd):
self.cs(1)
self.dc(0)
self.cs(0)
self.spi_lcd.write(bytearray([cmd]))
self.cs(1)
def write_data(self, buf):
self.cs(1)
self.dc(1)
self.cs(0)
#self.spi_lcd.write(bytearray([0x00]))
self.spi_lcd.write(bytearray([buf]))
self.cs(1)
# 全エリアに描画
def show(self):
if self.rotate == 0 or self.rotate == 180:
# SET_COLUMN = const(0x2A) # Column address set
self.write_cmd(0x2A)
self.write_data(0x00) # Start Column
self.write_data(0x00) # 0x0000
self.write_data(0x01) # End Column
self.write_data(0x3f) # 0x013f:319
# SET_PAGE = const(0x2B) # Page address set
self.write_cmd(0x2B)
self.write_data(0x00) # Start Page
self.write_data(0x00) # 0x0000
self.write_data(0x01) # End Page
self.write_data(0xdf) # 0x01df:479
else: # self.rotate == 90 or self.rotate == 270:
# SET_COLUMN = const(0x2A) # Column address set
self.write_cmd(0x2A)
self.write_data(0x00) # Start Column
self.write_data(0x00) # 0x0000
self.write_data(0x01) # End Column
self.write_data(0xdf) # 0x01df:479
# SET_PAGE = const(0x2B) # Page address set
self.write_cmd(0x2B)
self.write_data(0x00) # Start Page
self.write_data(0x00) # 0x0000
self.write_data(0x01) # End Page
self.write_data(0x3f) # 0x013f:319
# WRITE_RAM = const(0x2C) # Memory write
self.write_cmd(0x2C)
self.cs(1)
self.dc(1)
self.cs(0)
self.spi_lcd.write(self.buffer)
self.cs(1)
# 2025/06/29 Add
# 拡大表示するテキスト描画関数
# scale:拡大率(整数)
def text_scaled(self, text, x, y, color, scale=1):
# 一時的なフレームバッファを作成(文字描画用)
temp_fb = framebuf.FrameBuffer(bytearray(8 * len(text) * 8),\
8 * len(text), 8, framebuf.MONO_HLSB)
temp_fb.fill(0) # 背景をクリア
temp_fb.text(text, 0, 0, 1) # 文字を描画
# 各ピクセルを拡大して描画
for yy in range(8):
for xx in range(8 * len(text)):
if temp_fb.pixel(xx, yy): # 文字のピクセルがある場合
self.fill_rect(x + xx * scale, y + yy * scale,\
scale, scale, color)
def bl_ctrl(self,duty):
pwm = PWM(Pin(LCD_BL))
pwm.freq(1000)
if(duty>=100):
pwm.duty_u16(65535)
else:
pwm.duty_u16(655*duty)
def touch_get(self):
if self.irq() == 0:
# spi1 Switching to Touch Panel
# 2025/07/03 : 使用都度、設定し直す、この方法が良いようだ。
# Touch Panel(XPT2046) 4MHz
self.spi_touch = SPI(1, baudrate=4_000_000, sck=Pin(LCD_SCK),\
mosi=Pin(LCD_MOSI), miso=Pin(LCD_MISO))
self.tp_cs(0)
time.sleep_ms(1)
for i in range(0,3):
self.spi_touch.write(bytearray([0xD0]))
Read_date = self.spi_touch.read(2)
time.sleep_us(10)
x_touch = ((Read_date[0] <<8) + Read_date[1]) >>3
self.spi_touch.write(bytearray([0x90]))
Read_date = self.spi_touch.read(2)
time.sleep_us(10)
y_touch = ((Read_date[0] <<8) + Read_date[1]) >>3
self.tp_cs(1)
# DEBUG ADJ 用 ####################################################
if PRINT_TOUCH_POS:
print('x_touch = ', x_touch, ' y_touch = ', y_touch)
###################################################################
# spi1 Switching to LCD
# 2025/07/03 : 使用が終われば、設定を元に戻す。この方法が良いようだ。
# LCD(ILI9488) 40MHz
self.spi_lcd = SPI(1, baudrate=40_000_000, sck=Pin(LCD_SCK),\
mosi=Pin(LCD_MOSI), miso=Pin(LCD_MISO))
##############################
# Set Here Adjuste Parameter
# x_min ===> x_max
# 4800 7350
# y_min -----------------
# | |
# 4700 | + + |
# | |
# | LCD Panel |
# | |_
# | | | USB connector
# 7700 | + + |~
# | |
# y_max -----------------
# ~~ USB connector
###########################################################
# 2025/07/24 ADJ
# 四隅ではなく、各40Pixcel 中央寄りの四隅の値を基準に決める方法に変更
# 2025/08/14 Adj No3 Touch LCD
# 左上の XT XY の値
result40_40 = [4800,4720] # [4900,4800]
# 右上の XT XY の値
result280_40 = [7400,4720] # [7450,4800]
# 左下の XT XY の値
result40_440 = [4800,7700] # [4900,7800]
# 右下の XT XY の値
result280_440 = [7400,7700] # [7450,7800]
# 右下の XT XY の値は、利用していない
x_min = int(result40_40[0] - ((result280_40[0] - result40_40[0]) *40 /(280 -40)))
x_max = int(result280_40[0] + ((result280_40[0] - result40_40[0]) *40 /(280 -40)))
y_min = int(result40_40[1] - ((result40_440[1] - result40_40[1]) *40 /(440 -40)))
y_max = int(result40_440[1] + ((result40_440[1] - result40_40[1]) *40 /(440 -40)))
#########################
x_range = x_max - x_min
y_range = y_max - y_min
#########################
# Result_list = [touch_,touch_Y]
# 2025/07/02 : self.rotate の方向で、LCD位置に合わせた座標を返す
if self.rotate == 0 or self.rotate == 180:
if self.rotate == 0: # X軸Y軸の座標入替なし and X軸Y軸とも 数値変換なし
X_Point = 320 - int((x_touch - x_min) *320 /x_range)
Y_Point = 480 - int((y_touch - y_min) *480 /y_range)
elif self.rotate == 180: # X軸Y軸の座標入替なし and Y軸は 数値大小入替
X_Point = int((x_touch - x_min) *320 /x_range)
Y_Point = int((y_touch - y_min) *480 /y_range)
# 範囲内に収める 2025/07/17 修正
if X_Point >= 320:
X_Point = 319
elif X_Point < 0:
X_Point = 0
if Y_Point >= 480:
Y_Point = 479
elif Y_Point < 0:
Y_Point = 0
else: # self.rotate == 90 or self.rotate == 270:
if self.rotate == 90: # X軸Y軸の座標入替あり and X軸は 数値大小入替
X_Point = 480 - int((y_touch - y_min) *480 /y_range)
Y_Point = int((x_touch - x_min) *320 /x_range)
elif self.rotate == 270: # X軸Y軸の座標入替あり and Y軸は 数値大小入替
X_Point = int((y_touch - y_min) *480 /y_range)
Y_Point = 320 - int((x_touch - x_min) *320 /x_range)
# 範囲内に収める 2025/07/17 修正
if X_Point >= 480:
X_Point = 479
elif X_Point < 0:
X_Point = 0
if Y_Point >= 320:
Y_Point = 319
elif Y_Point < 0:
Y_Point = 0
if TOUCH_ADJ: # タッチポイント調整用に生のポイントデータを返す
# 2025/07/23
Result_list = [X_Point, Y_Point, x_touch, y_touch]
else: # LCD Pixcel に変換したデータのみを返す
Result_list = [X_Point, Y_Point]
# 2025/06/27 : タッチされた座標を表示
print(Result_list)
return(Result_list)
#################################################
# MicroPython
#################################################
def bold_pixel(x, y, color, scale):
if scale >= 2:
s = int(scale /2)
x = 0 if (x -s) < 0 else x -s
y = 0 if (y -s) < 0 else y -s
LCD.fill_rect(x, y, scale, scale, color)
# 座標ポイント zs ze で指定された2点のPixel および、その周囲の8点同士を線で描く
def bold_line(zs, ze, color):
for x in range(-1,2):
for y in range(-1,2):
LCD.line(zs[0] +x, zs[1] +y, ze[0] +x, ze[1] +y, color)
# 座標ポイント で指定された2点のPixel および、右側と下側 4点同士を線で描く
def bold_line2(zs, ze, color):
for x in range(2):
for y in range(2):
LCD.line(zs[0] +x, zs[1] +y, ze[0] +x, ze[1] +y, color)
# ALG op(オペレーション)の四角の枠と数値を表示する
def alg_op(op_num_text, zl, fb,color_line, color_back, color_text, scale):
xb = 2 # line X の太さ(pixel数)
yb = 2 # line Y の太さ(pixel数)
xf = 7 # FB line の位置 x差分
yf = 11 # FB line の位置 y差分
xt = 2 # Text の開始位置 x差分
yt = -3 # Text の開始位置 y差分
if scale == 2:
zt = [zl[0] +xt*scale, zl[1] +yt*scale]
zs = [zl[0] , zl[1] -5*scale]
zf = [zl[0] -xf*scale, zl[1] -yf*scale]
w_op = 24*scale # 文字幅 8 pixel 文字 x 3文字
h_op = 8*scale # 文字高さ
else:
zt = [zl[0] +xt, zl[1] +yt]
zs = [zl[0] , zl[1] -5]
zf = [zl[0] -xf, zl[1] -yf]
w_op = 24 # 文字幅 8 pixel 文字 x 3文字
h_op = 8 # 文字高さ
if scale == 2:
if fb ==1: # フィードバックの枠線を描く、中抜き方式
LCD.fill_rect(zf[0], zf[1], w_op +xb*2 +xf*2*scale, yf*scale +yb ,color_line)
LCD.fill_rect(zf[0] +xb, zf[1] +yb, w_op +xf*2*scale, yf*scale -yb ,LCD.WHITE)
LCD.fill_rect(zs[0], zs[1], w_op +xb*2, h_op +yb*2, color_line)
LCD.fill_rect(zs[0] +xb, zs[1] +yb, w_op, h_op, color_back)
# LCD.text(op_num_text, zt[0], zt[1], color_text)
LCD.text_scaled(op_num_text, zt[0], zt[1], color_text, scale)
else:
if fb ==1: # フィードバックの枠線を描く、中抜き方式
LCD.fill_rect(zf[0], zf[1], w_op +xb*2 +xf*2, yf +yb ,color_line)
LCD.fill_rect(zf[0] +xb, zf[1] +yb, w_op +xf*2, yf -yb ,LCD.WHITE)
LCD.fill_rect(zs[0], zs[1], w_op +xb*2, h_op +yb*2, color_line)
LCD.fill_rect(zs[0] +xb, zs[1] +yb, w_op, h_op, color_back)
LCD.text(op_num_text, zt[0], zt[1], color_text)
# ALG を下半分の決まった位置に表示する。+ 画面上半分に stageで指定されたものを拡大表示
def alg_patarn(alg, stage, color_line, color_back, color_text):
# scale == 2 の場合は、2倍に拡大して上段に表示する。その位置の設定
zl_algS = [10, 40] # 拡大して表示する場合の開始位置
# 下半分の決まった位置に表示する各アルゴリズム基準となる OP左端の上下中心点の設定
zl_alg0 = [173 +28, 245 +12+16 +5]
zl_alg1 = [ 31 +28, 245 +12+16 +5]
zl_alg2 = [ 31 +28, 245 +12+16*3 +22 +3]
zl_alg3 = [173, 245 +12+16*3 +3]
zl_alg4 = [173, 245 +12+16*5 +22]
zl_alg5 = [173 +28, 245 +12+16*7 +22]
zl_alg6 = [173, 245 +12+16*9 +22*2]
zl_alg7 = [ 31, 245 +12+16*5 +22*4]
# ALG タイトル表示位置
alg_textS = [10, 35] # 拡大して表示する場合の開始位置
alg_text0 = [165 -27, 245 +12 +10]
alg_text1 = [ 5, 245 +12 +10]
alg_text2 = [ 5, 245 +12+16*2 +22 +30]
alg_text3 = [165 -27, 245 +12+16*2 +10 +3]
alg_text4 = [165 -27, 245 +12+16*4 +22]
alg_text5 = [165 -27, 245 +12+16*6 +22 +10]
alg_text6 = [165 -27, 245 +12+16*8 +22*2 +10]
alg_text7 = [ 5, 245 +12+16*4 +22*4 +20]
# 暗号化された stage を復号
alg_on_stage = int(stage /3)
only_down = False
only_up = False
both = False
if stage %3 == 0:
only_down = True # 下半分のみ表示
elif stage %3 == 1:
only_up = True # 上半分のみ表示
else: # stage %3 == 2
both = True # 両方表示
if alg == 0:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0] +28 +14 , z_op1[1]]
z_je = [z_op2[0] +28 +14 , z_op2[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg0
z_op2 = [z_op1[0] +28 +14 , z_op1[1]]
z_je = [z_op2[0] +28 +14 , z_op2[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text0
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 1:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0], z_op1[1] +22]
z_je = [z_op1[0] +28 +14*2, z_op1[1]]
z_j1 = [z_op1[0] +28 +14 , z_op1[1]]
z_j2 = [z_op2[0] +28 +14 , z_op2[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
z_j1 = [z_j1[0]*2, z_j1[1]*2]
z_j2 = [z_j2[0]*2, z_j2[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j2, color_line)
bold_line2(z_j1 , z_j2, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg1
z_op2 = [z_op1[0], z_op1[1] +22]
z_je = [z_op1[0] +28 +14*2, z_op1[1]]
z_j1 = [z_op1[0] +28 +14 , z_op1[1]]
z_j2 = [z_op2[0] +28 +14 , z_op2[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j2, color_line)
bold_line2(z_j1 , z_j2, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text1
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 2:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0], z_op1[1] +22]
z_op3 = [z_op1[0], z_op1[1] +22*2]
z_op4 = [z_op1[0], z_op1[1] +22*3]
z_je = [z_op1[0] +28 +14*2, z_op1[1]]
z_j1 = [z_op1[0] +28 +14 , z_op1[1]]
z_j2 = [z_op2[0] +28 +14 , z_op2[1]]
z_j3 = [z_op3[0] +28 +14 , z_op3[1]]
z_j4 = [z_op4[0] +28 +14 , z_op4[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_op3 = [z_op3[0]*2, z_op3[1]*2]
z_op4 = [z_op4[0]*2, z_op4[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
z_j1 = [z_j1[0]*2, z_j1[1]*2]
z_j2 = [z_j2[0]*2, z_j2[1]*2]
z_j3 = [z_j3[0]*2, z_j3[1]*2]
z_j4 = [z_j4[0]*2, z_j4[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j2, color_line)
bold_line2(z_op3, z_j3, color_line)
bold_line2(z_op4, z_j4, color_line)
bold_line2(z_j1 , z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
alg_op(' 3 ', z_op3, 1, color_line, color_back, color_text, 2)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg2
z_op2 = [z_op1[0], z_op1[1] +22]
z_op3 = [z_op1[0], z_op1[1] +22*2]
z_op4 = [z_op1[0], z_op1[1] +22*3]
z_je = [z_op1[0] +28 +14*2, z_op1[1]]
z_j1 = [z_op1[0] +28 +14 , z_op1[1]]
z_j2 = [z_op2[0] +28 +14 , z_op2[1]]
z_j3 = [z_op3[0] +28 +14 , z_op3[1]]
z_j4 = [z_op4[0] +28 +14 , z_op4[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j2, color_line)
bold_line2(z_op3, z_j3, color_line)
bold_line2(z_op4, z_j4, color_line)
bold_line2(z_j1 , z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
alg_op(' 3 ', z_op3, 1, color_line, color_back, color_text, 1)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text2
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 3:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0] , z_op1[1] +22]
z_op3 = [z_op1[0] +28 +14 , z_op1[1] +22]
z_op4 = [z_op1[0] +28*2 +14*3 , z_op1[1]]
z_je = [z_op4[0] +28 +14 , z_op4[1]]
z_j1 = [z_op1[0] +28*2 +14*2 , z_op1[1]]
z_j3 = [z_op3[0] +28 +14 , z_op3[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_op3 = [z_op3[0]*2, z_op3[1]*2]
z_op4 = [z_op4[0]*2, z_op4[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
z_j1 = [z_j1[0]*2, z_j1[1]*2]
z_j3 = [z_j3[0]*2, z_j3[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j3, color_line)
bold_line2(z_j1, z_j3, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 2)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg3
z_op2 = [z_op1[0] , z_op1[1] +22]
z_op3 = [z_op1[0] +28 +14 , z_op1[1] +22]
z_op4 = [z_op1[0] +28*2 +14*3 , z_op1[1]]
z_je = [z_op4[0] +28 +14 , z_op4[1]]
z_j1 = [z_op1[0] +28*2 +14*2 , z_op1[1]]
z_j3 = [z_op3[0] +28 +14 , z_op3[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j3, color_line)
bold_line2(z_j1, z_j3, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 1)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text3
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 4:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0] +28 +14 , z_op1[1]]
z_op3 = [z_op2[0] +28 +7 , z_op1[1]]
z_op4 = [z_op3[0] +28 +7 , z_op1[1]]
z_je = [z_op4[0] +28 +14 , z_op2[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_op3 = [z_op3[0]*2, z_op3[1]*2]
z_op4 = [z_op4[0]*2, z_op4[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
# op 表示
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 2)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg4
z_op2 = [z_op1[0] +28 +14 , z_op1[1]]
z_op3 = [z_op2[0] +28 +7 , z_op1[1]]
z_op4 = [z_op3[0] +28 +7 , z_op1[1]]
z_je = [z_op4[0] +28 +14 , z_op2[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 1)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text4
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 5:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0] +28 +14 , z_op1[1]]
z_op3 = [z_op1[0] , z_op1[1] +22]
z_op4 = [z_op2[0] , z_op2[1] +22]
z_je = [z_op2[0] +28 +14*2 , z_op2[1]]
z_j2 = [z_op2[0] +28 +14 , z_op2[1]]
z_j4 = [z_op4[0] +28 +14 , z_op4[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_op3 = [z_op3[0]*2, z_op3[1]*2]
z_op4 = [z_op4[0]*2, z_op4[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
z_j2 = [z_j2[0]*2, z_j2[1]*2]
z_j4 = [z_j4[0]*2, z_j4[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op3, z_j4, color_line)
bold_line2(z_j2, z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
alg_op(' 3 ', z_op3, 1, color_line, color_back, color_text, 2)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg5
z_op2 = [z_op1[0] +28 +14 , z_op1[1]]
z_op3 = [z_op1[0] , z_op1[1] +22]
z_op4 = [z_op2[0] , z_op2[1] +22]
z_je = [z_op2[0] +28 +14*2 , z_op2[1]]
z_j2 = [z_op2[0] +28 +14 , z_op2[1]]
z_j4 = [z_op4[0] +28 +14 , z_op4[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op3, z_j4, color_line)
bold_line2(z_j2, z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
alg_op(' 3 ', z_op3, 1, color_line, color_back, color_text, 1)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text5
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 6:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0] , z_op1[1] +22]
z_op3 = [z_op2[0] +28 +14 , z_op2[1]]
z_op4 = [z_op3[0] +28 +7 , z_op3[1]]
z_je = [z_op1[0] +28*2 +7 +14*5 , z_op1[1]]
z_j1 = [z_op1[0] +28*2 +7 +14*4 , z_op1[1]]
z_j4 = [z_op4[0] +28 +14 , z_op4[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_op3 = [z_op3[0]*2, z_op3[1]*2]
z_op4 = [z_op4[0]*2, z_op4[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
z_j1 = [z_j1[0]*2, z_j1[1]*2]
z_j4 = [z_j4[0]*2, z_j4[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j4, color_line)
bold_line2(z_j1, z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 2)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg6
z_op2 = [z_op1[0] , z_op1[1] +22]
z_op3 = [z_op2[0] +28 +14 , z_op2[1]]
z_op4 = [z_op3[0] +28 +7 , z_op3[1]]
z_je = [z_op1[0] +28*2 +7 +14*5 , z_op1[1]]
z_j1 = [z_op1[0] +28*2 +7 +14*4 , z_op1[1]]
z_j4 = [z_op4[0] +28 +14 , z_op4[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j4, color_line)
bold_line2(z_j1, z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 1)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text6
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 7:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op2 = [zl_algS[0], zl_algS[1] +22]
# op2 を起点にする
z_op1 = [z_op2[0] +35, z_op2[1] -22]
z_op3 = [z_op2[0] +28 +14, z_op2[1]]
z_op4 = [z_op1[0] , z_op1[1] +22*2]
z_je = [z_op1[0] +28 +21 +14, z_op1[1]]
z_j1 = [z_op1[0] +28 +21 , z_op1[1]]
z_j3 = [z_op3[0] +28 +14 , z_op3[1]]
z_j4 = [z_op4[0] +28 +21 , z_op4[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_op3 = [z_op3[0]*2, z_op3[1]*2]
z_op4 = [z_op4[0]*2, z_op4[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
z_j1 = [z_j1[0]*2, z_j1[1]*2]
z_j3 = [z_j3[0]*2, z_j3[1]*2]
z_j4 = [z_j4[0]*2, z_j4[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j3, color_line)
bold_line2(z_op4, z_j4, color_line)
bold_line2(z_j1 , z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 2)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op2 = [zl_alg7[0], zl_alg7[1] +22]
# op2 を起点にする
z_op1 = [z_op2[0] +35, z_op2[1] -22]
z_op3 = [z_op2[0] +28 +14, z_op2[1]]
z_op4 = [z_op1[0] , z_op1[1] +22*2]
z_je = [z_op1[0] +28 +21 +14, z_op1[1]]
z_j1 = [z_op1[0] +28 +21 , z_op1[1]]
z_j3 = [z_op3[0] +28 +14 , z_op3[1]]
z_j4 = [z_op4[0] +28 +21 , z_op4[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j3, color_line)
bold_line2(z_op4, z_j4, color_line)
bold_line2(z_j1 , z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 1)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text7
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
# タブ の四角の枠とタブの名前を表示する
def tab(tab_name, zs, chr_num, color_line, color_back, color_text):
# zs:TAB LABEL 開始座標
# chr_num:TAB LABEL の文字幅
chr_w = 16
chr_h = 16
xb = 2 # line X の太さ(pixel数)
yb = 2 # line Y の太さ(pixel数)
# 大きな四角の内側に小さな四角を描き、差分を枠線として表示する
LCD.fill_rect(zs[0], zs[1], chr_w *chr_num +xb*2, chr_h +yb*2, color_line)
LCD.fill_rect(zs[0] +xb, zs[1] +yb, chr_w *chr_num, chr_h, color_back)
LCD.text_scaled(tab_name,zs[0] +xb, zs[1] +yb, color_text, 2)
# main menu
def dsp_main_menu():
tab_get = [ 6,2]
tab_com = [ 86,2]
tab_op = [166,2]
tab_set = [246,2]
chr_num = 4
color_line = LCD.BLUE
color_back = LCD.GRAY
color_text = LCD.BLACK
tab('get' , tab_get, chr_num, color_line, color_back, color_text)
tab('com' , tab_com, chr_num, color_line, color_back, color_text)
tab('op' , tab_op, chr_num, color_line, color_back, color_text)
tab('set', tab_set,chr_num, color_line, color_back, color_text)
# sub menu
def dsp_sub_menu_op():
tab_ws = [ 6,240]
tab_mul = [ 86,240]
tab_adsr = [166,240]
tab_dam = [246,240]
chr_num = 4
color_line = LCD.BLUE
color_back = LCD.GRAY
color_text = LCD.BLACK
tab('ws' , tab_ws, chr_num, color_line, color_back, color_text)
tab('mul' , tab_mul, chr_num, color_line, color_back, color_text)
tab('adsr', tab_adsr,chr_num, color_line, color_back, color_text)
tab('dam' , tab_dam, chr_num, color_line, color_back, color_text)
if __name__=='__main__':
###########################################################
print('gc.mem_free() = ', gc.mem_free()) # メモリ利用状況
###########################################################
LCD = LCD_3inch5()
LCD.bl_ctrl(100)
# 表示関係の変数の設定 #####################
# TAB 表示位置の設定
tab_get = [ 6,2]
tab_com = [ 86,2]
tab_op = [166,2]
tab_set = [246,2]
tab_ws = [ 6,240]
tab_mul = [ 86,240]
tab_adsr = [166,240]
tab_dam = [246,240]
tab_alg = [ 6,240]
tab_bo_lfo = [ 86,240]
# TAB 文字幅の設定
chr_get = 4
chr_com = 4
chr_op = 4
chr_set = 4
chr_ws = 4
chr_mul = 4
chr_adsr = 4
chr_dam = 4
chr_alg = 4
chr_bo_lfo = 6
# カラー表示テスト
lcd_color_list = [LCD.BLACK, LCD.RED, LCD.GREEN, LCD.BLUE, LCD.YELLOW,\
LCD.PURPLE, LCD.BLUEGREEN, LCD.GRAY, LCD.WHITE]
# 2025/08/20 Test
for n in range(1):
print(f'Color Patturn Test n = {n}')
for i in range(len(lcd_color_list)):
LCD.fill(lcd_color_list[i])
time.sleep_ms(10)
LCD.show()
time.sleep_ms(90)
LCD.fill(LCD.WHITE)
###########################################################
print('gc.mem_free() = ', gc.mem_free()) # メモリ利用状況
###########################################################
# ALG Test Patarn 表示
color_line = LCD.BLACK
color_back = LCD.YELLOW
color_text = LCD.RED
ONLY_DOWN = 0
ONLY_UP = 1
BOTH = 2
for n in range(1000):
print(f'ALG Test n = {n}')
for i in range(8):
LCD.fill(LCD.WHITE)
dsp_main_menu()
dsp_sub_menu_op()
alg = i
alg_on_stage = alg # 拡大して上半分に表示したい alg番号
stage = alg_on_stage *3 + BOTH # 暗号化
alg_patarn(alg, stage, color_line, color_back, color_text)
LCD.show()
time.sleep_ms(10)
###########################################################
# print('gc.mem_free() = ', gc.mem_free()) # メモリ利用状況
###########################################################
time.sleep(1)
print('LCD.rotate = ', LCD.rotate)
X_Point_Old = 0
Y_Point_Old = 0
#調整用ポイントの座標の設定
# TOUCH_ADJ = True
# ROTATE = const(180) にすること
if LCD.rotate == 0 or LCD.rotate == 180: # 縦長表示 の直後
# 調整用ポイントの座標の設定
pos40_40 = [ 40, 40]
pos280_40 = [280, 40]
pos40_440 = [ 40,440]
pos280_440 = [280,440]
#color BRG
LCD.fill(LCD.WHITE)
# 調整用ポイントの座標を 5Pixel x 5Pixel で表示する
LCD.fill_rect(pos40_40[0]-2, pos40_40[1]-2, 5, 5, LCD.RED)
LCD.fill_rect(pos280_40[0]-2, pos280_40[1]-2, 5, 5, LCD.RED)
LCD.fill_rect(pos40_440[0]-2, pos40_440[1]-2, 5, 5, LCD.RED)
LCD.fill_rect(pos280_440[0]-2, pos280_440[1]-2, 5, 5, LCD.RED)
LCD.show()
scope = 10 # 移動平均 Average 個数
X_listT = [None] * scope
Y_listT = [None] * scope
X_listL = [None] * scope
Y_listL = [None] * scope
cnt_scope = 0
# 各ポジションの集計結果を利用可能(10回以上計測)になればセット
flag40_40 = 0
flag280_40 = 0
flag40_440 = 0
flag280_440 = 0
# 測定結果が出たらセット
flag_result = 0
# Touch Point 表示
while True:
get = LCD.touch_get()
if get != None:
# タッチされているなら
if TOUCH_ADJ:
# 調整モードなら、タッチ生データ get[2], get[3] を取得
X_PointL = get[0]
Y_PointL = get[1]
X_PointT = get[2]
Y_PointT = get[3]
else:
# LCD 座標変換データ取得
X_PointL = get[0]
Y_PointL = get[1]
# 移動平均計算用にデータを記録
X_listL[cnt_scope] = X_PointL
Y_listL[cnt_scope] = Y_PointL
X_listT[cnt_scope] = X_PointT
Y_listT[cnt_scope] = Y_PointT
if flag_result == 0:
cnt_scope += 1
if cnt_scope >= scope:
cnt_scope = 0
if flag_result == 0:
flag_result = 1
else:
# 移動平均 10 計算
X_totalL = 0
Y_totalL = 0
X_totalT = 0
Y_totalT = 0
for i in range(scope):
X_totalL += X_listL[i]
Y_totalL += Y_listL[i]
X_totalT += X_listT[i]
Y_totalT += Y_listT[i]
# 移動平均 10
X_aveL = int(X_totalL / scope)
Y_aveL = int(Y_totalL / scope)
X_aveT = int(X_totalT / scope)
Y_aveT = int(Y_totalT / scope)
# 領域別に表示
# 初期状態 中心と思われる 4800 4700 の +400 +400
if X_aveT < 5200 and Y_aveT < 5100:
# pos40_40 の 値を収録
ave40_40 = [X_aveT, Y_aveT]
flag40_40 += 1
if flag40_40 >= 10:
# 文字領域を 白色にしてから表示
LCD.fill_rect(20,80,16*8,80, LCD.WHITE)
LCD.text_scaled(f'XL:{X_aveL}',20, 80,LCD.BLUE, 2)
LCD.text_scaled(f'XT:{X_aveT}',20,100,LCD.BLUE, 2)
LCD.text_scaled(f'YL:{Y_aveL}',20,120,LCD.BLUE, 2)
LCD.text_scaled(f'YT:{Y_aveT}',20,140,LCD.BLUE, 2)
# 初期状態 中心と思われる 7350 4700 の -400 +400
elif X_aveT > 6950 and Y_aveT < 5100:
# pos280_40 の 値を収録
ave280_40 = [X_aveT, Y_aveT]
flag280_40 += 1
if flag280_40 >= 10:
# 文字領域を 白色にしてから表示
LCD.fill_rect(180,80,16*8,80, LCD.WHITE)
LCD.text_scaled(f'XL:{X_aveL}',180, 80,LCD.BLUE, 2)
LCD.text_scaled(f'XT:{X_aveT}',180,100,LCD.BLUE, 2)
LCD.text_scaled(f'YL:{Y_aveL}',180,120,LCD.BLUE, 2)
LCD.text_scaled(f'YT:{Y_aveT}',180,140,LCD.BLUE, 2)
# 初期状態 中心と思われる 4800 7700 の +400 -400
elif X_aveT < 5200 and Y_aveT > 7300:
# pos40_440 の 値を収録
ave40_440 = [X_aveT, Y_aveT]
flag40_440 += 1
if flag40_440 >= 10:
# 文字領域を 白色にしてから表示
LCD.fill_rect(20,340,16*8,80, LCD.WHITE)
LCD.text_scaled(f'XL:{X_aveL}',20,340,LCD.BLUE, 2)
LCD.text_scaled(f'XT:{X_aveT}',20,360,LCD.BLUE, 2)
LCD.text_scaled(f'YL:{Y_aveL}',20,380,LCD.BLUE, 2)
LCD.text_scaled(f'YT:{Y_aveT}',20,400,LCD.BLUE, 2)
# 初期状態 中心と思われる 7350 7700 の -400 -400
elif X_aveT > 6950 and Y_aveT > 7300:
# pos280_440 の 値を収録
ave280_440 = [X_aveT, Y_aveT]
flag280_440 += 1
if flag280_440 >= 10:
# 文字領域を 白色にしてから表示
LCD.fill_rect(180,340,16*8,80, LCD.WHITE)
LCD.text_scaled(f'XL:{X_aveL}',180,340,LCD.BLUE, 2)
LCD.text_scaled(f'XT:{X_aveT}',180,360,LCD.BLUE, 2)
LCD.text_scaled(f'YL:{Y_aveL}',180,380,LCD.BLUE, 2)
LCD.text_scaled(f'YT:{Y_aveT}',180,400,LCD.BLUE, 2)
# 四隅のデータが揃ったら結果を表示する
if flag280_40 >= 10 and flag280_40 >= 10 and flag40_440 >= 10 and flag280_440 >= 10:
LCD.fill_rect(10,200,310,120, LCD.WHITE)
LCD.text_scaled(f'Set def Result Data',10,200,LCD.BLACK, 2)
LCD.text_scaled(f'def touch_get(self):',10,220,LCD.BLACK, 2)
LCD.text_scaled(f'rt40_40 ={ave40_40[0]},{ave40_40[1]}',10,240,LCD.BLACK, 2)
LCD.text_scaled(f'rt280_40 ={ave280_40[0]},{ave280_40[1]}',10,260,LCD.BLACK, 2)
LCD.text_scaled(f'rt40_440 ={ave40_440[0]},{ave40_440[1]}',10,280,LCD.BLACK, 2)
LCD.text_scaled(f'rt280_440={ave280_440[0]},{ave280_440[1]}',10,300,LCD.BLACK, 2)
LCD.show()
else:
cnt_scope = 0
flag_result = 0
time.sleep_ms(50)
# 初期のプログラムを残し、ポイントの軌跡を残す
else: # LCD.rotate == 90 or LCD.rotate == 270 : 横長表示
#color BRG
LCD.fill(LCD.WHITE)
LCD.fill_rect(140,5,200,30,LCD.RED)
# LCD.text("Raspberry Pi Pico",170,17,LCD.WHITE)
# 黄文字表示
LCD.text("Raspberry Pi Pico",170,17,LCD.YELLOW)
LCD.text("3.5' IPS LCD TEST",170,47,LCD.BLACK)
display_color = 0x001F
for i in range(len("Raspberry Pi Pico")):
LCD.fill_rect(i*16+108,70,14,20,(display_color))
display_color = display_color << 1
# 2025/06/29:Add 2倍の拡大文字を表示
LCD.text_scaled("Raspberry Pi Pico",108,72,LCD.BLUEGREEN, 2)
# 右下 隅 のセルを赤色にする
LCD.fill_rect(59 *8, 19 *8, 8, 8, LCD.RED)
LCD.fill_rect(59 *8, 39 *8, 8, 8, LCD.RED)
display_color = 0x001F
for i in range(0,12):
# LCD.fill_rect(i*30+60,100,30,50,(display_color))
LCD.fill_rect(i*30+60,120,30,50,(display_color))
display_color = display_color << 1
LCD.show()
# Touch Point 表示
while True:
get = LCD.touch_get()
if get != None:
# 8bits 単位のセルに変換
X_Point = int(get[0] /8)
Y_Point = int(get[1] /8)
if X_Point_Old != X_Point or Y_Point_Old != Y_Point:
# 前回と異なるセルならば
# 前回のセルを黄色にする
if Y_Point_Old < 40:
# LCD.show_up エリアならば
LCD.fill_rect(X_Point_Old *8, Y_Point_Old *8, 8, 8, LCD.YELLOW)
LCD.show()
# 今回のセルを赤色にする
if Y_Point < 40:
# LCD.show_up エリアならば
LCD.fill_rect(X_Point *8, Y_Point *8, 8, 8, LCD.RED)
LCD.show()
# Old Pointer 更新
X_Point_Old = X_Point
Y_Point_Old = Y_Point
time.sleep_ms(100)
追加実験その④
前記②のプログラム(WS+ALG)でALG表示を繰り返すプログラムに、ALGパターン表示繰り返しテストの前に、LED toggle テストを、200ms毎に 10000回テストを入れました。
LED toggle テスト10000回を通過しますが、ALG表示の繰り返しで嵌まり込みます。
ファイルサイズ76.6KB
touch_lcd_Test_WS+ALG+Led.py
########################################################################
# WAVE SHARE Pico-ResTouch-LCD-3.5 Test Program をライブラリとして独立させた
# 用意された main_3inch5.py をテスト・改良
# 2025/08/11 : main_3inch5-scale-712.py からライブラリとして独立させた
# touch_lcd-20250811-1214.py
# タッチパネルの調整と初期画面表示は残した状態
# へその緒をなくした(不要なものを削除した)+ MicroPython用の関数も削除
#
########################################################################
# ①初回の起動で表示しない
# self.spi = SPI(1,6_000_000) をコメントアウトでOK
#
# ②self.rotate = 270 では、タッチしても反転表示しないことを修正した。
# ⑤ で LCDの座標に合わせた形で返すように変更
#
# ③文字を整数倍の拡大文字を表示可能にした。(8x8 のフォントでは、判読困難)
# import framebuf で、ビットマップイメージを作成している関係から
# 8x8 のフォントしか扱えないようだ。
# def text_scaled(self, text, x, y, color, scale=1): を追加
# scale で指定した整数倍の拡大文字を表示可能にした。
#
# ④色の追加設定
# def rgb2color565(self, r, g, b): を用意して RBGから構成可能にした。
# Return color565 from RGB color value. Red Green Blue
# self.YELLOW = self.rgb2color565(0xFF, 0xFF, 0x00)
# self.PURPLE = self.rgb2color565(0xFF, 0x00, 0xFF)
# self.BLUEGREEN = self.rgb2color565(0x00, 0xFF, 0xFF)
#
# ⑤タッチパネルの座標をLCDの座標同様になるような形で返すように変更した。
# def self.touch_get(self): の中で、self.rotate を用いて、
# タッチパネルの座標が、LCDの座標(左上隅が 0 0)と一致させるようにした。
# X:横軸 Y:縦軸 左上隅が、X=0, Y=0
#
# ⑥1つのバッファで全画面の表示する 2025/07/15 (20925/07/11の間違いを修正)
# メモリが2倍の Pico2(RP2350)を使用して
# バッファをフルサイズ(480x320)にすれば、1つのバッファで全画面の表示ができる。
#
# ⑦ WS 波形表示
#
# ⑧ ALG パターン表示
#
# ⑨ Pico2(RP2350) 使用を前提にプログラムを整理
# def touch_get(self) の辺り
#
# ⑩ Pimoroni Pico Pi Plus 2 PSRAM 8MB を利用する
#
#
#
########################################################################
from machine import Pin,SPI,PWM
from micropython import const
import math
import framebuf
import time
import os
import gc # メモリ利用状況表示用
# for DEBUG
PRINT_TOUCH_POS = True # タッチ座標を表示する時
TOUCH_ADJ = True # タッチ座標を取得する時。ROTATE = const(180) にすること
LCD_DC = const(8)
LCD_CS = const(9)
LCD_SCK = const(10)
LCD_MOSI = const(11)
LCD_MISO = const(12)
LCD_BL = const(13)
LCD_RST = const(15)
TP_CS = const(16)
TP_IRQ = const(17)
##############################################################
# LCDの向きに合わせて設定する
# Set the rotation Angle to 0°, 90°, 180° or 270°
# 0:USBが左辺上 90:USBが下辺左 180:USBが右辺下 270:USBが上辺右
# タッチ座標を取得して調整するときは。ROTATE = const(180) にすること
##############################################################
ROTATE = const(180)
# この Pixel 分を上下左右に拡大したエリアをタッチ有効とする
# 一部、この倍の領域にしている
TOUCH = const(8)
class LCD_3inch5(framebuf.FrameBuffer):
def __init__(self):
self.RED = 0x07E0
self.GREEN = 0x001f
self.BLUE = 0xf800
self.WHITE = 0xffff
self.BLACK = 0x0000
# Return color565 from RGB color value.
# Red Green Blue
self.YELLOW = self.rgb2color565(0xFF, 0xFF, 0x00)
self.PURPLE = self.rgb2color565(0xFF, 0x00, 0xFF)
self.BLUEGREEN = self.rgb2color565(0x00, 0xFF, 0xFF)
self.GRAY = self.rgb2color565(0x50, 0x28, 0x15)
self.rotate = ROTATE
# 2025/07/15 ここの設定の修正が必要だった
if self.rotate == 0 or self.rotate == 180:
self.width = 320
# 2025/07/15 self.height = 240
self.height = 480
else:
self.width = 480
# 2025/07/15 self.height = 160
self.height = 320
# 制御信号端子の設定
self.cs = Pin(LCD_CS,Pin.OUT)
self.rst = Pin(LCD_RST,Pin.OUT)
self.dc = Pin(LCD_DC,Pin.OUT)
self.tp_cs =Pin(TP_CS,Pin.OUT)
self.irq = Pin(TP_IRQ,Pin.IN)
# 制御信号端子の初期状態設定
self.cs(1)
self.dc(1)
self.rst(1)
self.tp_cs(1)
# LCD(ILI9488) 40MHz
self.spi_lcd = SPI(1,baudrate=40_000_000,sck=Pin(LCD_SCK),\
mosi=Pin(LCD_MOSI),miso=Pin(LCD_MISO))
print(self.spi_lcd)
#################### このあたりが難解 ################################
# Pico2(RP2350) ならば、画面一杯をしてしてもメモリエラーにならない
self.buffer = bytearray(self.height * self.width * 2)
super().__init__(self.buffer, self.width, self.height, framebuf.RGB565)
#########################################################################
print('gc.mem_free() = ', gc.mem_free()) # メモリ利用状況
self.init_display()
# color565 is Blue:5bits, Red:6bits, and Green:5bits 16bits
# Return color565 from RGB color value.
def rgb2color565(self, r, g, b):
return (r & 0xFC) << 3 | (g & 0xF8) >> 3 | (b & 0xF8) << 8
def init_display(self):
self.rst(0)
time.sleep_ms(10)
self.rst(1)
time.sleep_ms(50)
# INVON = const(0x21) # Display inversion on
self.write_cmd(0x21)
# Power Control 3
self.write_cmd(0xC2)
self.write_data(0x33)
# VMCTR1 = const(0xC5) # VCOM control 1
self.write_cmd(0xC5)
self.write_data(0x00)
self.write_data(0x1e)
self.write_data(0x80)
# FRMCTR1 = const(0xB1) # Frame rate control (In normal mode/full colors)
self.write_cmd(0xB1)
self.write_data(0xB0)
# GMCTRP1 = const(0xE0) # Positive gamma correction
self.write_cmd(0xE0)
self.write_data(0x00)
self.write_data(0x13)
self.write_data(0x18)
self.write_data(0x04)
self.write_data(0x0F)
self.write_data(0x06)
self.write_data(0x3a)
self.write_data(0x56)
self.write_data(0x4d)
self.write_data(0x03)
self.write_data(0x0a)
self.write_data(0x06)
self.write_data(0x30)
self.write_data(0x3e)
self.write_data(0x0f)
# GMCTRN1 = const(0xE1) # Negative gamma correction
self.write_cmd(0xE1)
self.write_data(0x00)
self.write_data(0x13)
self.write_data(0x18)
self.write_data(0x01)
self.write_data(0x11)
self.write_data(0x06)
self.write_data(0x38)
self.write_data(0x34)
self.write_data(0x4d)
self.write_data(0x06)
self.write_data(0x0d)
self.write_data(0x0b)
self.write_data(0x31)
self.write_data(0x37)
self.write_data(0x0f)
# PIXFMT = const(0x3A) # COLMOD: Pixel format set
self.write_cmd(0x3A)
self.write_data(0x55) # 16bits/pixel
# SLPOUT = const(0x11) # Exit sleep mode
self.write_cmd(0x11)
time.sleep_ms(120)
self.write_cmd(0x29)
# DFUNCTR = const(0xB6) # Display function control
self.write_cmd(0xB6)
self.write_data(0x00)
self.write_data(0x62)
# MADCTL = const(0x36) # Memory access control
self.write_cmd(0x36) # Sets the memory access mode for rotation
# bit 7-6:パネル方向 bit 5=0:横長 1:縦長
# bit 3は、常に1 bit 7654 3210
if self.rotate == 0:
self.write_data(0x88) # 1000 1000
elif self.rotate == 180:
self.write_data(0x48) # 0100 1000
elif self.rotate == 90:
self.write_data(0xe8) # 1110 1000
else:
self.write_data(0x28) # 0010 1000
def write_cmd(self, cmd):
self.cs(1)
self.dc(0)
self.cs(0)
self.spi_lcd.write(bytearray([cmd]))
self.cs(1)
def write_data(self, buf):
self.cs(1)
self.dc(1)
self.cs(0)
#self.spi_lcd.write(bytearray([0x00]))
self.spi_lcd.write(bytearray([buf]))
self.cs(1)
# 全エリアに描画
def show(self):
if self.rotate == 0 or self.rotate == 180:
# SET_COLUMN = const(0x2A) # Column address set
self.write_cmd(0x2A)
self.write_data(0x00) # Start Column
self.write_data(0x00) # 0x0000
self.write_data(0x01) # End Column
self.write_data(0x3f) # 0x013f:319
# SET_PAGE = const(0x2B) # Page address set
self.write_cmd(0x2B)
self.write_data(0x00) # Start Page
self.write_data(0x00) # 0x0000
self.write_data(0x01) # End Page
self.write_data(0xdf) # 0x01df:479
else: # self.rotate == 90 or self.rotate == 270:
# SET_COLUMN = const(0x2A) # Column address set
self.write_cmd(0x2A)
self.write_data(0x00) # Start Column
self.write_data(0x00) # 0x0000
self.write_data(0x01) # End Column
self.write_data(0xdf) # 0x01df:479
# SET_PAGE = const(0x2B) # Page address set
self.write_cmd(0x2B)
self.write_data(0x00) # Start Page
self.write_data(0x00) # 0x0000
self.write_data(0x01) # End Page
self.write_data(0x3f) # 0x013f:319
# WRITE_RAM = const(0x2C) # Memory write
self.write_cmd(0x2C)
self.cs(1)
self.dc(1)
self.cs(0)
self.spi_lcd.write(self.buffer)
self.cs(1)
# 2025/06/29 Add
# 拡大表示するテキスト描画関数
# scale:拡大率(整数)
def text_scaled(self, text, x, y, color, scale=1):
# 一時的なフレームバッファを作成(文字描画用)
temp_fb = framebuf.FrameBuffer(bytearray(8 * len(text) * 8),\
8 * len(text), 8, framebuf.MONO_HLSB)
temp_fb.fill(0) # 背景をクリア
temp_fb.text(text, 0, 0, 1) # 文字を描画
# 各ピクセルを拡大して描画
for yy in range(8):
for xx in range(8 * len(text)):
if temp_fb.pixel(xx, yy): # 文字のピクセルがある場合
self.fill_rect(x + xx * scale, y + yy * scale,\
scale, scale, color)
def bl_ctrl(self,duty):
pwm = PWM(Pin(LCD_BL))
pwm.freq(1000)
if(duty>=100):
pwm.duty_u16(65535)
else:
pwm.duty_u16(655*duty)
def touch_get(self):
if self.irq() == 0:
# spi1 Switching to Touch Panel
# 2025/07/03 : 使用都度、設定し直す、この方法が良いようだ。
# Touch Panel(XPT2046) 4MHz
self.spi_touch = SPI(1, baudrate=4_000_000, sck=Pin(LCD_SCK),\
mosi=Pin(LCD_MOSI), miso=Pin(LCD_MISO))
self.tp_cs(0)
time.sleep_ms(1)
for i in range(0,3):
self.spi_touch.write(bytearray([0xD0]))
Read_date = self.spi_touch.read(2)
time.sleep_us(10)
x_touch = ((Read_date[0] <<8) + Read_date[1]) >>3
self.spi_touch.write(bytearray([0x90]))
Read_date = self.spi_touch.read(2)
time.sleep_us(10)
y_touch = ((Read_date[0] <<8) + Read_date[1]) >>3
self.tp_cs(1)
# DEBUG ADJ 用 ####################################################
if PRINT_TOUCH_POS:
print('x_touch = ', x_touch, ' y_touch = ', y_touch)
###################################################################
# spi1 Switching to LCD
# 2025/07/03 : 使用が終われば、設定を元に戻す。この方法が良いようだ。
# LCD(ILI9488) 40MHz
self.spi_lcd = SPI(1, baudrate=40_000_000, sck=Pin(LCD_SCK),\
mosi=Pin(LCD_MOSI), miso=Pin(LCD_MISO))
##############################
# Set Here Adjuste Parameter
# x_min ===> x_max
# 4800 7350
# y_min -----------------
# | |
# 4700 | + + |
# | |
# | LCD Panel |
# | |_
# | | | USB connector
# 7700 | + + |~
# | |
# y_max -----------------
# ~~ USB connector
###########################################################
# 2025/07/24 ADJ
# 四隅ではなく、各40Pixcel 中央寄りの四隅の値を基準に決める方法に変更
# 2025/08/14 Adj No3 Touch LCD
# 左上の XT XY の値
result40_40 = [4800,4720] # [4900,4800]
# 右上の XT XY の値
result280_40 = [7400,4720] # [7450,4800]
# 左下の XT XY の値
result40_440 = [4800,7700] # [4900,7800]
# 右下の XT XY の値
result280_440 = [7400,7700] # [7450,7800]
# 右下の XT XY の値は、利用していない
x_min = int(result40_40[0] - ((result280_40[0] - result40_40[0]) *40 /(280 -40)))
x_max = int(result280_40[0] + ((result280_40[0] - result40_40[0]) *40 /(280 -40)))
y_min = int(result40_40[1] - ((result40_440[1] - result40_40[1]) *40 /(440 -40)))
y_max = int(result40_440[1] + ((result40_440[1] - result40_40[1]) *40 /(440 -40)))
#########################
x_range = x_max - x_min
y_range = y_max - y_min
#########################
# Result_list = [touch_,touch_Y]
# 2025/07/02 : self.rotate の方向で、LCD位置に合わせた座標を返す
if self.rotate == 0 or self.rotate == 180:
if self.rotate == 0: # X軸Y軸の座標入替なし and X軸Y軸とも 数値変換なし
X_Point = 320 - int((x_touch - x_min) *320 /x_range)
Y_Point = 480 - int((y_touch - y_min) *480 /y_range)
elif self.rotate == 180: # X軸Y軸の座標入替なし and Y軸は 数値大小入替
X_Point = int((x_touch - x_min) *320 /x_range)
Y_Point = int((y_touch - y_min) *480 /y_range)
# 範囲内に収める 2025/07/17 修正
if X_Point >= 320:
X_Point = 319
elif X_Point < 0:
X_Point = 0
if Y_Point >= 480:
Y_Point = 479
elif Y_Point < 0:
Y_Point = 0
else: # self.rotate == 90 or self.rotate == 270:
if self.rotate == 90: # X軸Y軸の座標入替あり and X軸は 数値大小入替
X_Point = 480 - int((y_touch - y_min) *480 /y_range)
Y_Point = int((x_touch - x_min) *320 /x_range)
elif self.rotate == 270: # X軸Y軸の座標入替あり and Y軸は 数値大小入替
X_Point = int((y_touch - y_min) *480 /y_range)
Y_Point = 320 - int((x_touch - x_min) *320 /x_range)
# 範囲内に収める 2025/07/17 修正
if X_Point >= 480:
X_Point = 479
elif X_Point < 0:
X_Point = 0
if Y_Point >= 320:
Y_Point = 319
elif Y_Point < 0:
Y_Point = 0
if TOUCH_ADJ: # タッチポイント調整用に生のポイントデータを返す
# 2025/07/23
Result_list = [X_Point, Y_Point, x_touch, y_touch]
else: # LCD Pixcel に変換したデータのみを返す
Result_list = [X_Point, Y_Point]
# 2025/06/27 : タッチされた座標を表示
print(Result_list)
return(Result_list)
#################################################
# MicroPython
#################################################
def bold_pixel(x, y, color, scale):
if scale >= 2:
s = int(scale /2)
x = 0 if (x -s) < 0 else x -s
y = 0 if (y -s) < 0 else y -s
LCD.fill_rect(x, y, scale, scale, color)
# 座標ポイント zs ze で指定された2点のPixel および、その周囲の8点同士を線で描く
def bold_line(zs, ze, color):
for x in range(-1,2):
for y in range(-1,2):
LCD.line(zs[0] +x, zs[1] +y, ze[0] +x, ze[1] +y, color)
# 座標ポイント で指定された2点のPixel および、右側と下側 4点同士を線で描く
def bold_line2(zs, ze, color):
for x in range(2):
for y in range(2):
LCD.line(zs[0] +x, zs[1] +y, ze[0] +x, ze[1] +y, color)
def one_write_line(zl, color_wave):
# zl[[zs], [z1], [z2], [z3], [z4], ]
if len(zl) >= 2:
z_end = zl[0]
for i in range(1, len(zl)):
z_start = z_end
# y軸は、反転することに注意
z_end =[zl[0][0] +zl[i][0], zl[0][1] -zl[i][1]]
bold_line(z_start, z_end, color_wave)
# WS 波形をLCD下半分の決まった位置に表示する
def wave_form(ws, color_back, color_wave):
xs = 0
xb = 8 # 枠の幅 x
ys = 264 # 240~259:[WS]Tab 260~263:Line
yl = ys +18 # 240~259:[WS]Tab 260~263:Line 中央の線
yb = 3 # 枠の幅 y
w = 64 # セルの全体幅
wx = 48 # セルの波形幅
h = 36 # セルの全体高さ
hy = 15 # セルの波形高さの半分 sin価数を利用するため 1/2 にしている
# ws 番号から描画開始位置を決めるためのテーブル
# ws=0, 1, 2, 3, 4,
zone_xs = [xs +w*0, xs +w*1, xs +w*2, xs +w*0, xs +w*3, \
# ws=5, 6, 7, 8, 9,
xs +w*4, xs +w*0, xs +w*4, xs +w*0, xs +w*1, \
# ws=10, 11, 12, 13, 14,
xs +w*2, xs +w*1, xs +w*3, xs +w*4, xs +w*1, \
# ws=15, 16, 17, 18, 19,
xs +w*0, xs +w*0, xs +w*1, xs +w*2, xs +w*2, \
# ws=20, 21, 22, 23, 24,
xs +w*3, xs +w*4, xs +w*2, xs +w*0, xs +w*0, \
# ws=25, 26, 27, 28, 29, 30,
xs +w*1, xs +w*2, xs +w*3, xs +w*3, xs +w*4, xs +w*3]
# ws=0, 1, 2, 3, 4,
zone_ys = [ys +h*0, ys +h*0, ys +h*0, ys +h*5, ys +h*0, \
# ws=5, 6, 7, 8, 9,
ys +h*0, ys +h*4, ys +h*4, ys +h*1, ys +h*1, \
# ws=10, 11, 12, 13, 14,
ys +h*1, ys +h*5, ys +h*1, ys +h*1, ys +h*4, \
# ws=15, 16, 17, 18, 19,
ys +h*0, ys +h*2, ys +h*2, ys +h*2, ys +h*5, \
# ws=20, 21, 22, 23, 24,
ys +h*2, ys +h*2, ys +h*4, ys +h*0, ys +h*3, \
# ws=25, 26, 27, 28, 29, 30,
ys +h*3, ys +h*3, ys +h*5, ys +h*3, ys +h*3, ys +h*4]
# 波形の Y軸 0 line 上下中心線
zone_yl = [yl +h*0, yl +h*0, yl +h*0, yl +h*5, yl +h*0, \
yl +h*0, yl +h*4, yl +h*4, yl +h*1, yl +h*1, \
yl +h*1, yl +h*5, yl +h*1, yl +h*1, yl +h*4, \
yl +h*0, yl +h*2, yl +h*2, yl +h*2, yl +h*5, \
yl +h*2, yl +h*2, yl +h*4, yl +h*0, yl +h*3, \
yl +h*3, yl +h*3, yl +h*5, yl +h*3, yl +h*3, yl +h*4]
if ws == 0:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
for i in range(wx):
xp = zone_xs[ws] +i +xb
# 円周360度を 60分割してサイン波形をプロットする
yp = zone_yl[ws] -int(math.sin(math.radians(i *(360/wx))) *hy)
bold_pixel(xp, yp, color_wave, 3)
elif ws == 1:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
for i in range(int(wx/2)+1):
xp = zone_xs[ws] +i +xb
# 円周360度を 60分割してサイン波形をプロットする
yp = zone_yl[ws] -int(math.sin(math.radians(i *(360/wx))) *hy)
bold_pixel(xp, yp, color_wave, 3)
# 直線部分を描く
xp = zone_xs[ws] +xb +24
yp = zone_yl[ws]
# 起点 1 2 3 4 5 6 7 8
zl = [[xp,yp], [+24,0]]
one_write_line(zl, color_wave)
elif ws == 2:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
for i in range(wx):
xp = zone_xs[ws] +i +xb
# 円周360度を 60分割してサイン波形をプロットする
yp = zone_yl[ws] -int(abs(math.sin(math.radians(i *(360/wx))) *hy))
bold_pixel(xp, yp, color_wave, 3)
elif ws == 3:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形の 1/4 をプロットする
for i in range(0, 12):
xp = zone_xs[ws] +i +xb
yp = zone_yl[ws] -int(abs(math.sin(math.radians(i *(360/wx))) *hy))
bold_pixel(xp, yp, color_wave, 3)
# 円周360度を 60分割してサイン波形の 3/4 をプロットする
for i in range(24, 36):
xp = zone_xs[ws] +i +xb
yp = zone_yl[ws] -int(abs(math.sin(math.radians(i *(360/wx))) *hy))
bold_pixel(xp, yp, color_wave, 3)
# 直線部分を描く
z1 = [zone_xs[ws] +xb +12, zone_ys[ws] +yb +0]
z2 = [zone_xs[ws] +xb +12, zone_ys[ws] +yb +hy]
z3 = [zone_xs[ws] +xb +24, zone_ys[ws] +yb +hy]
bold_line(z1, z2, color_wave)
bold_line(z2, z3, color_wave)
z4 = [zone_xs[ws] +xb +36, zone_ys[ws] +yb +0]
z5 = [zone_xs[ws] +xb +36, zone_ys[ws] +yb +hy]
z6 = [zone_xs[ws] +xb +48, zone_ys[ws] +yb +hy]
bold_line(z4, z5, color_wave)
bold_line(z5, z6, color_wave)
elif ws == 4:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形をプロットする
for i in range(30+1):
xp = zone_xs[ws] +i +xb *2
yp = zone_yl[ws] -int(math.sin(math.radians(i *(360/30))) *hy)
bold_pixel(xp, yp, color_wave, 3)
elif ws == 5:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形をプロットする
for i in range(30+1):
xp = zone_xs[ws] +i +xb *2
yp = zone_yl[ws] -int(abs(math.sin(math.radians(i *(360/30))) *hy))
bold_pixel(xp, yp, color_wave, 3)
elif ws == 6:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [0,+hy], [24,+hy], [24,-hy], [48,-hy], [48,0]]
one_write_line(zl, color_wave)
elif ws == 7:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# サイン波形の 180~270 をプロットする
for i in range(0, 24):
xp = zone_xs[ws] +i +xb
yp = zone_ys[ws] +yb +int(hy*2 - (abs(math.sin(math.radians(i *(360/(wx*2)) +180))) *(-1) *hy +hy*2))
bold_pixel(xp, yp, color_wave, 3)
# サイン波形の 270~360 をプロットする
for i in range(24, 48):
xp = zone_xs[ws] +i +xb
yp = zone_ys[ws] +yb +int(hy*2 - (abs(math.sin(math.radians(i *(360/(wx*2)) +0))) *hy))
bold_pixel(xp, yp, color_wave, 3)
# 直線部分を描く
z1 = [zone_xs[ws] +xb +0, zone_ys[ws] +yb +0]
z2 = [zone_xs[ws] +xb +0, zone_ys[ws] +yb +hy]
z3 = [zone_xs[ws] +xb +48, zone_ys[ws] +yb +hy*2]
z4 = [zone_xs[ws] +xb +48, zone_ys[ws] +yb +hy]
bold_line(z1, z2, color_wave)
bold_line(z3, z4, color_wave)
elif ws == 8:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形をプロットする
for i in range(wx):
xp = zone_xs[ws] +i +xb
y = -int(math.sin(math.radians(i *(360/wx))) *hy)
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
elif ws == 9:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形をプロットする
for i in range(int(wx/2)+1):
xp = zone_xs[ws] +i +xb
y = -int(math.sin(math.radians(i *(360/wx))) *hy)
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
z1 = [zone_xs[ws] +xb +24, zone_ys[ws] +yb +hy]
z2 = [zone_xs[ws] +xb +48, zone_ys[ws] +yb +hy]
bold_line(z1, z2, color_wave)
elif ws == 10:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形をプロットする
for i in range(wx):
xp = zone_xs[ws] +i +xb
y = -int(abs(math.sin(math.radians(i *(360/wx))) *hy))
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
elif ws == 11:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形の 1/4 をプロットする
for i in range(0, 12):
xp = zone_xs[ws] +i +xb
y = -int(abs(math.sin(math.radians(i *(360/wx))) *hy))
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
# 円周360度を 60分割してサイン波形の 3/4 をプロットする
for i in range(24, 36):
xp = zone_xs[ws] +i +xb
y = -int(abs(math.sin(math.radians(i *(360/wx))) *hy))
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
# 直線部分を描く
z1 = [zone_xs[ws] +xb +12, zone_ys[ws] +yb +5]
z2 = [zone_xs[ws] +xb +12, zone_ys[ws] +yb +hy]
z3 = [zone_xs[ws] +xb +24, zone_ys[ws] +yb +hy]
bold_line(z1, z2, color_wave)
bold_line(z2, z3, color_wave)
z4 = [zone_xs[ws] +xb +36, zone_ys[ws] +yb +5]
z5 = [zone_xs[ws] +xb +36, zone_ys[ws] +yb +hy]
z6 = [zone_xs[ws] +xb +48, zone_ys[ws] +yb +hy]
bold_line(z4, z5, color_wave)
bold_line(z5, z6, color_wave)
elif ws == 12:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形をプロットする
for i in range(30+1):
xp = zone_xs[ws] +i +xb *2
y = -int(math.sin(math.radians(i *(360/30))) *hy)
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
elif ws == 13:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形をプロットする
for i in range(30+1):
xp = zone_xs[ws] +i +xb *2
y = -int(abs(math.sin(math.radians(i *(360/30))) *hy))
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
elif ws == 14:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [0,+hy], [24,+hy], [24,0], [48,0]]
one_write_line(zl, color_wave)
elif ws == 15:
# Notthing
pass
elif ws == 16:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [12,+hy], [36,-hy], [48,0]]
one_write_line(zl, color_wave)
elif ws == 17:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [12,+hy], [24,0], [48,0]]
one_write_line(zl, color_wave)
elif ws == 18:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [12,+hy], [24,0], [36,+hy], [48,0]]
one_write_line(zl, color_wave)
elif ws == 19:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [12,+hy], [12,0], [24,0], [36,+hy], [36,0], [48,0]]
one_write_line(zl, color_wave)
elif ws == 20:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb*2
yp = zone_yl[ws]
zl = [[xp,yp], [7,+hy], [21,-hy], [28,0]]
one_write_line(zl, color_wave)
elif ws == 21:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb*2
yp = zone_yl[ws]
zl = [[xp,yp], [7,+hy], [14,0], [21,+hy], [28,0]]
one_write_line(zl, color_wave)
elif ws == 22:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
# 起点 1 2 3 4 5 6 7 8
zl = [[xp,yp], [0,+hy], [12,+hy], [12,0], [24,0], [24,+hy], [36,+hy], [36,0], [48,0]]
one_write_line(zl, color_wave)
elif ws == 23:
# Notthing
pass
elif ws == 24:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [24,+hy], [24,-hy], [48,0]]
one_write_line(zl, color_wave)
elif ws == 25:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [24,+hy], [24,0], [48,0]]
one_write_line(zl, color_wave)
elif ws == 26:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [24,+hy], [24,0], [48,+hy], [48,0]]
one_write_line(zl, color_wave)
elif ws == 27:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [12,+hy], [12,0], [24,0], [36,+hy], [36,0], [48,0]]
one_write_line(zl, color_wave)
elif ws == 28:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb*2
yp = zone_yl[ws]
zl = [[xp,yp], [14,+hy], [14,-hy], [28,0]]
one_write_line(zl, color_wave)
elif ws == 29:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb*2
yp = zone_yl[ws]
zl = [[xp,yp], [14,+hy], [14,0], [28,+hy], [28,0]]
one_write_line(zl, color_wave)
elif ws == 30:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb*2
yp = zone_yl[ws]
zl = [[xp,yp], [0,+hy], [12,+hy], [12,0], [36,0]]
one_write_line(zl, color_wave)
elif ws == 31:
# Nothing
pass
# ALG op(オペレーション)の四角の枠と数値を表示する
def alg_op(op_num_text, zl, fb,color_line, color_back, color_text, scale):
xb = 2 # line X の太さ(pixel数)
yb = 2 # line Y の太さ(pixel数)
xf = 7 # FB line の位置 x差分
yf = 11 # FB line の位置 y差分
xt = 2 # Text の開始位置 x差分
yt = -3 # Text の開始位置 y差分
if scale == 2:
zt = [zl[0] +xt*scale, zl[1] +yt*scale]
zs = [zl[0] , zl[1] -5*scale]
zf = [zl[0] -xf*scale, zl[1] -yf*scale]
w_op = 24*scale # 文字幅 8 pixel 文字 x 3文字
h_op = 8*scale # 文字高さ
else:
zt = [zl[0] +xt, zl[1] +yt]
zs = [zl[0] , zl[1] -5]
zf = [zl[0] -xf, zl[1] -yf]
w_op = 24 # 文字幅 8 pixel 文字 x 3文字
h_op = 8 # 文字高さ
if scale == 2:
if fb ==1: # フィードバックの枠線を描く、中抜き方式
LCD.fill_rect(zf[0], zf[1], w_op +xb*2 +xf*2*scale, yf*scale +yb ,color_line)
LCD.fill_rect(zf[0] +xb, zf[1] +yb, w_op +xf*2*scale, yf*scale -yb ,LCD.WHITE)
LCD.fill_rect(zs[0], zs[1], w_op +xb*2, h_op +yb*2, color_line)
LCD.fill_rect(zs[0] +xb, zs[1] +yb, w_op, h_op, color_back)
# LCD.text(op_num_text, zt[0], zt[1], color_text)
LCD.text_scaled(op_num_text, zt[0], zt[1], color_text, scale)
else:
if fb ==1: # フィードバックの枠線を描く、中抜き方式
LCD.fill_rect(zf[0], zf[1], w_op +xb*2 +xf*2, yf +yb ,color_line)
LCD.fill_rect(zf[0] +xb, zf[1] +yb, w_op +xf*2, yf -yb ,LCD.WHITE)
LCD.fill_rect(zs[0], zs[1], w_op +xb*2, h_op +yb*2, color_line)
LCD.fill_rect(zs[0] +xb, zs[1] +yb, w_op, h_op, color_back)
LCD.text(op_num_text, zt[0], zt[1], color_text)
# ALG を下半分の決まった位置に表示する。+ 画面上半分に stageで指定されたものを拡大表示
def alg_patarn(alg, stage, color_line, color_back, color_text):
# scale == 2 の場合は、2倍に拡大して上段に表示する。その位置の設定
zl_algS = [10, 40] # 拡大して表示する場合の開始位置
# 下半分の決まった位置に表示する各アルゴリズム基準となる OP左端の上下中心点の設定
zl_alg0 = [173 +28, 245 +12+16 +5]
zl_alg1 = [ 31 +28, 245 +12+16 +5]
zl_alg2 = [ 31 +28, 245 +12+16*3 +22 +3]
zl_alg3 = [173, 245 +12+16*3 +3]
zl_alg4 = [173, 245 +12+16*5 +22]
zl_alg5 = [173 +28, 245 +12+16*7 +22]
zl_alg6 = [173, 245 +12+16*9 +22*2]
zl_alg7 = [ 31, 245 +12+16*5 +22*4]
# ALG タイトル表示位置
alg_textS = [10, 35] # 拡大して表示する場合の開始位置
alg_text0 = [165 -27, 245 +12 +10]
alg_text1 = [ 5, 245 +12 +10]
alg_text2 = [ 5, 245 +12+16*2 +22 +30]
alg_text3 = [165 -27, 245 +12+16*2 +10 +3]
alg_text4 = [165 -27, 245 +12+16*4 +22]
alg_text5 = [165 -27, 245 +12+16*6 +22 +10]
alg_text6 = [165 -27, 245 +12+16*8 +22*2 +10]
alg_text7 = [ 5, 245 +12+16*4 +22*4 +20]
# 暗号化された stage を復号
alg_on_stage = int(stage /3)
only_down = False
only_up = False
both = False
if stage %3 == 0:
only_down = True # 下半分のみ表示
elif stage %3 == 1:
only_up = True # 上半分のみ表示
else: # stage %3 == 2
both = True # 両方表示
if alg == 0:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0] +28 +14 , z_op1[1]]
z_je = [z_op2[0] +28 +14 , z_op2[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg0
z_op2 = [z_op1[0] +28 +14 , z_op1[1]]
z_je = [z_op2[0] +28 +14 , z_op2[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text0
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 1:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0], z_op1[1] +22]
z_je = [z_op1[0] +28 +14*2, z_op1[1]]
z_j1 = [z_op1[0] +28 +14 , z_op1[1]]
z_j2 = [z_op2[0] +28 +14 , z_op2[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
z_j1 = [z_j1[0]*2, z_j1[1]*2]
z_j2 = [z_j2[0]*2, z_j2[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j2, color_line)
bold_line2(z_j1 , z_j2, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg1
z_op2 = [z_op1[0], z_op1[1] +22]
z_je = [z_op1[0] +28 +14*2, z_op1[1]]
z_j1 = [z_op1[0] +28 +14 , z_op1[1]]
z_j2 = [z_op2[0] +28 +14 , z_op2[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j2, color_line)
bold_line2(z_j1 , z_j2, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text1
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 2:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0], z_op1[1] +22]
z_op3 = [z_op1[0], z_op1[1] +22*2]
z_op4 = [z_op1[0], z_op1[1] +22*3]
z_je = [z_op1[0] +28 +14*2, z_op1[1]]
z_j1 = [z_op1[0] +28 +14 , z_op1[1]]
z_j2 = [z_op2[0] +28 +14 , z_op2[1]]
z_j3 = [z_op3[0] +28 +14 , z_op3[1]]
z_j4 = [z_op4[0] +28 +14 , z_op4[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_op3 = [z_op3[0]*2, z_op3[1]*2]
z_op4 = [z_op4[0]*2, z_op4[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
z_j1 = [z_j1[0]*2, z_j1[1]*2]
z_j2 = [z_j2[0]*2, z_j2[1]*2]
z_j3 = [z_j3[0]*2, z_j3[1]*2]
z_j4 = [z_j4[0]*2, z_j4[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j2, color_line)
bold_line2(z_op3, z_j3, color_line)
bold_line2(z_op4, z_j4, color_line)
bold_line2(z_j1 , z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
alg_op(' 3 ', z_op3, 1, color_line, color_back, color_text, 2)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg2
z_op2 = [z_op1[0], z_op1[1] +22]
z_op3 = [z_op1[0], z_op1[1] +22*2]
z_op4 = [z_op1[0], z_op1[1] +22*3]
z_je = [z_op1[0] +28 +14*2, z_op1[1]]
z_j1 = [z_op1[0] +28 +14 , z_op1[1]]
z_j2 = [z_op2[0] +28 +14 , z_op2[1]]
z_j3 = [z_op3[0] +28 +14 , z_op3[1]]
z_j4 = [z_op4[0] +28 +14 , z_op4[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j2, color_line)
bold_line2(z_op3, z_j3, color_line)
bold_line2(z_op4, z_j4, color_line)
bold_line2(z_j1 , z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
alg_op(' 3 ', z_op3, 1, color_line, color_back, color_text, 1)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text2
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 3:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0] , z_op1[1] +22]
z_op3 = [z_op1[0] +28 +14 , z_op1[1] +22]
z_op4 = [z_op1[0] +28*2 +14*3 , z_op1[1]]
z_je = [z_op4[0] +28 +14 , z_op4[1]]
z_j1 = [z_op1[0] +28*2 +14*2 , z_op1[1]]
z_j3 = [z_op3[0] +28 +14 , z_op3[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_op3 = [z_op3[0]*2, z_op3[1]*2]
z_op4 = [z_op4[0]*2, z_op4[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
z_j1 = [z_j1[0]*2, z_j1[1]*2]
z_j3 = [z_j3[0]*2, z_j3[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j3, color_line)
bold_line2(z_j1, z_j3, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 2)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg3
z_op2 = [z_op1[0] , z_op1[1] +22]
z_op3 = [z_op1[0] +28 +14 , z_op1[1] +22]
z_op4 = [z_op1[0] +28*2 +14*3 , z_op1[1]]
z_je = [z_op4[0] +28 +14 , z_op4[1]]
z_j1 = [z_op1[0] +28*2 +14*2 , z_op1[1]]
z_j3 = [z_op3[0] +28 +14 , z_op3[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j3, color_line)
bold_line2(z_j1, z_j3, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 1)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text3
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 4:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0] +28 +14 , z_op1[1]]
z_op3 = [z_op2[0] +28 +7 , z_op1[1]]
z_op4 = [z_op3[0] +28 +7 , z_op1[1]]
z_je = [z_op4[0] +28 +14 , z_op2[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_op3 = [z_op3[0]*2, z_op3[1]*2]
z_op4 = [z_op4[0]*2, z_op4[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
# op 表示
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 2)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg4
z_op2 = [z_op1[0] +28 +14 , z_op1[1]]
z_op3 = [z_op2[0] +28 +7 , z_op1[1]]
z_op4 = [z_op3[0] +28 +7 , z_op1[1]]
z_je = [z_op4[0] +28 +14 , z_op2[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 1)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text4
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 5:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0] +28 +14 , z_op1[1]]
z_op3 = [z_op1[0] , z_op1[1] +22]
z_op4 = [z_op2[0] , z_op2[1] +22]
z_je = [z_op2[0] +28 +14*2 , z_op2[1]]
z_j2 = [z_op2[0] +28 +14 , z_op2[1]]
z_j4 = [z_op4[0] +28 +14 , z_op4[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_op3 = [z_op3[0]*2, z_op3[1]*2]
z_op4 = [z_op4[0]*2, z_op4[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
z_j2 = [z_j2[0]*2, z_j2[1]*2]
z_j4 = [z_j4[0]*2, z_j4[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op3, z_j4, color_line)
bold_line2(z_j2, z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
alg_op(' 3 ', z_op3, 1, color_line, color_back, color_text, 2)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg5
z_op2 = [z_op1[0] +28 +14 , z_op1[1]]
z_op3 = [z_op1[0] , z_op1[1] +22]
z_op4 = [z_op2[0] , z_op2[1] +22]
z_je = [z_op2[0] +28 +14*2 , z_op2[1]]
z_j2 = [z_op2[0] +28 +14 , z_op2[1]]
z_j4 = [z_op4[0] +28 +14 , z_op4[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op3, z_j4, color_line)
bold_line2(z_j2, z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
alg_op(' 3 ', z_op3, 1, color_line, color_back, color_text, 1)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text5
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 6:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0] , z_op1[1] +22]
z_op3 = [z_op2[0] +28 +14 , z_op2[1]]
z_op4 = [z_op3[0] +28 +7 , z_op3[1]]
z_je = [z_op1[0] +28*2 +7 +14*5 , z_op1[1]]
z_j1 = [z_op1[0] +28*2 +7 +14*4 , z_op1[1]]
z_j4 = [z_op4[0] +28 +14 , z_op4[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_op3 = [z_op3[0]*2, z_op3[1]*2]
z_op4 = [z_op4[0]*2, z_op4[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
z_j1 = [z_j1[0]*2, z_j1[1]*2]
z_j4 = [z_j4[0]*2, z_j4[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j4, color_line)
bold_line2(z_j1, z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 2)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg6
z_op2 = [z_op1[0] , z_op1[1] +22]
z_op3 = [z_op2[0] +28 +14 , z_op2[1]]
z_op4 = [z_op3[0] +28 +7 , z_op3[1]]
z_je = [z_op1[0] +28*2 +7 +14*5 , z_op1[1]]
z_j1 = [z_op1[0] +28*2 +7 +14*4 , z_op1[1]]
z_j4 = [z_op4[0] +28 +14 , z_op4[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j4, color_line)
bold_line2(z_j1, z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 1)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text6
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 7:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op2 = [zl_algS[0], zl_algS[1] +22]
# op2 を起点にする
z_op1 = [z_op2[0] +35, z_op2[1] -22]
z_op3 = [z_op2[0] +28 +14, z_op2[1]]
z_op4 = [z_op1[0] , z_op1[1] +22*2]
z_je = [z_op1[0] +28 +21 +14, z_op1[1]]
z_j1 = [z_op1[0] +28 +21 , z_op1[1]]
z_j3 = [z_op3[0] +28 +14 , z_op3[1]]
z_j4 = [z_op4[0] +28 +21 , z_op4[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_op3 = [z_op3[0]*2, z_op3[1]*2]
z_op4 = [z_op4[0]*2, z_op4[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
z_j1 = [z_j1[0]*2, z_j1[1]*2]
z_j3 = [z_j3[0]*2, z_j3[1]*2]
z_j4 = [z_j4[0]*2, z_j4[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j3, color_line)
bold_line2(z_op4, z_j4, color_line)
bold_line2(z_j1 , z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 2)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op2 = [zl_alg7[0], zl_alg7[1] +22]
# op2 を起点にする
z_op1 = [z_op2[0] +35, z_op2[1] -22]
z_op3 = [z_op2[0] +28 +14, z_op2[1]]
z_op4 = [z_op1[0] , z_op1[1] +22*2]
z_je = [z_op1[0] +28 +21 +14, z_op1[1]]
z_j1 = [z_op1[0] +28 +21 , z_op1[1]]
z_j3 = [z_op3[0] +28 +14 , z_op3[1]]
z_j4 = [z_op4[0] +28 +21 , z_op4[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j3, color_line)
bold_line2(z_op4, z_j4, color_line)
bold_line2(z_j1 , z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 1)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text7
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
# タブ の四角の枠とタブの名前を表示する
def tab(tab_name, zs, chr_num, color_line, color_back, color_text):
# zs:TAB LABEL 開始座標
# chr_num:TAB LABEL の文字幅
chr_w = 16
chr_h = 16
xb = 2 # line X の太さ(pixel数)
yb = 2 # line Y の太さ(pixel数)
# 大きな四角の内側に小さな四角を描き、差分を枠線として表示する
LCD.fill_rect(zs[0], zs[1], chr_w *chr_num +xb*2, chr_h +yb*2, color_line)
LCD.fill_rect(zs[0] +xb, zs[1] +yb, chr_w *chr_num, chr_h, color_back)
LCD.text_scaled(tab_name,zs[0] +xb, zs[1] +yb, color_text, 2)
# main menu
def dsp_main_menu():
tab_get = [ 6,2]
tab_com = [ 86,2]
tab_op = [166,2]
tab_set = [246,2]
chr_num = 4
color_line = LCD.BLUE
color_back = LCD.GRAY
color_text = LCD.BLACK
tab('get' , tab_get, chr_num, color_line, color_back, color_text)
tab('com' , tab_com, chr_num, color_line, color_back, color_text)
tab('op' , tab_op, chr_num, color_line, color_back, color_text)
tab('set', tab_set,chr_num, color_line, color_back, color_text)
# sub menu
def dsp_sub_menu_op():
tab_ws = [ 6,240]
tab_mul = [ 86,240]
tab_adsr = [166,240]
tab_dam = [246,240]
chr_num = 4
color_line = LCD.BLUE
color_back = LCD.GRAY
color_text = LCD.BLACK
tab('ws' , tab_ws, chr_num, color_line, color_back, color_text)
tab('mul' , tab_mul, chr_num, color_line, color_back, color_text)
tab('adsr', tab_adsr,chr_num, color_line, color_back, color_text)
tab('dam' , tab_dam, chr_num, color_line, color_back, color_text)
if __name__=='__main__':
###########################################################
print('gc.mem_free() = ', gc.mem_free()) # メモリ利用状況
###########################################################
LCD = LCD_3inch5()
LCD.bl_ctrl(100)
# 表示関係の変数の設定 #####################
# TAB 表示位置の設定
tab_get = [ 6,2]
tab_com = [ 86,2]
tab_op = [166,2]
tab_set = [246,2]
tab_ws = [ 6,240]
tab_mul = [ 86,240]
tab_adsr = [166,240]
tab_dam = [246,240]
tab_alg = [ 6,240]
tab_bo_lfo = [ 86,240]
# TAB 文字幅の設定
chr_get = 4
chr_com = 4
chr_op = 4
chr_set = 4
chr_ws = 4
chr_mul = 4
chr_adsr = 4
chr_dam = 4
chr_alg = 4
chr_bo_lfo = 6
# カラー表示テスト
lcd_color_list = [LCD.BLACK, LCD.RED, LCD.GREEN, LCD.BLUE, LCD.YELLOW,\
LCD.PURPLE, LCD.BLUEGREEN, LCD.GRAY, LCD.WHITE]
# 2025/08/20 Test
for n in range(1):
print(f'Color Patturn Test n = {n}')
for i in range(len(lcd_color_list)):
LCD.fill(lcd_color_list[i])
time.sleep_ms(10)
LCD.show()
time.sleep_ms(90)
LCD.fill(LCD.WHITE)
###########################################################
print('gc.mem_free() = ', gc.mem_free()) # メモリ利用状況
###########################################################
# 2025/09/03 LED.toggle Test
led = Pin(25, Pin.OUT)
for n in range(10000):
print(f'led.toggle() Test n = {n}')
led.toggle()
time.sleep_ms(200)
# 2025/08/20 WS Test
for n in range(1):
print(f'WS Test n = {n}')
# ws 波形の表示テスト
for ws in range(31):
# 2025/08/22-16:03 Test Add
LCD.fill(LCD.WHITE)
dsp_main_menu()
dsp_sub_menu_op()
# wave_form(ws, LCD.WHITE, LCD.BLACK)
wave_form(ws, LCD.YELLOW, LCD.BLACK)
LCD.show()
time.sleep_ms(10)
###########################################################
# print('gc.mem_free() = ', gc.mem_free()) # メモリ利用状況
###########################################################
time.sleep(1)
# ALG Test Patarn 表示
color_line = LCD.BLACK
color_back = LCD.YELLOW
color_text = LCD.RED
ONLY_DOWN = 0
ONLY_UP = 1
BOTH = 2
for n in range(1000):
print(f'ALG Test n = {n}')
for i in range(8):
LCD.fill(LCD.WHITE)
dsp_main_menu()
dsp_sub_menu_op()
alg = i
alg_on_stage = alg # 拡大して上半分に表示したい alg番号
stage = alg_on_stage *3 + BOTH # 暗号化
alg_patarn(alg, stage, color_line, color_back, color_text)
LCD.show()
time.sleep_ms(10)
###########################################################
# print('gc.mem_free() = ', gc.mem_free()) # メモリ利用状況
###########################################################
time.sleep(1)
print('LCD.rotate = ', LCD.rotate)
X_Point_Old = 0
Y_Point_Old = 0
#調整用ポイントの座標の設定
# TOUCH_ADJ = True
# ROTATE = const(180) にすること
if LCD.rotate == 0 or LCD.rotate == 180: # 縦長表示 の直後
# 調整用ポイントの座標の設定
pos40_40 = [ 40, 40]
pos280_40 = [280, 40]
pos40_440 = [ 40,440]
pos280_440 = [280,440]
#color BRG
LCD.fill(LCD.WHITE)
# 調整用ポイントの座標を 5Pixel x 5Pixel で表示する
LCD.fill_rect(pos40_40[0]-2, pos40_40[1]-2, 5, 5, LCD.RED)
LCD.fill_rect(pos280_40[0]-2, pos280_40[1]-2, 5, 5, LCD.RED)
LCD.fill_rect(pos40_440[0]-2, pos40_440[1]-2, 5, 5, LCD.RED)
LCD.fill_rect(pos280_440[0]-2, pos280_440[1]-2, 5, 5, LCD.RED)
LCD.show()
scope = 10 # 移動平均 Average 個数
X_listT = [None] * scope
Y_listT = [None] * scope
X_listL = [None] * scope
Y_listL = [None] * scope
cnt_scope = 0
# 各ポジションの集計結果を利用可能(10回以上計測)になればセット
flag40_40 = 0
flag280_40 = 0
flag40_440 = 0
flag280_440 = 0
# 測定結果が出たらセット
flag_result = 0
# Touch Point 表示
while True:
get = LCD.touch_get()
if get != None:
# タッチされているなら
if TOUCH_ADJ:
# 調整モードなら、タッチ生データ get[2], get[3] を取得
X_PointL = get[0]
Y_PointL = get[1]
X_PointT = get[2]
Y_PointT = get[3]
else:
# LCD 座標変換データ取得
X_PointL = get[0]
Y_PointL = get[1]
# 移動平均計算用にデータを記録
X_listL[cnt_scope] = X_PointL
Y_listL[cnt_scope] = Y_PointL
X_listT[cnt_scope] = X_PointT
Y_listT[cnt_scope] = Y_PointT
if flag_result == 0:
cnt_scope += 1
if cnt_scope >= scope:
cnt_scope = 0
if flag_result == 0:
flag_result = 1
else:
# 移動平均 10 計算
X_totalL = 0
Y_totalL = 0
X_totalT = 0
Y_totalT = 0
for i in range(scope):
X_totalL += X_listL[i]
Y_totalL += Y_listL[i]
X_totalT += X_listT[i]
Y_totalT += Y_listT[i]
# 移動平均 10
X_aveL = int(X_totalL / scope)
Y_aveL = int(Y_totalL / scope)
X_aveT = int(X_totalT / scope)
Y_aveT = int(Y_totalT / scope)
# 領域別に表示
# 初期状態 中心と思われる 4800 4700 の +400 +400
if X_aveT < 5200 and Y_aveT < 5100:
# pos40_40 の 値を収録
ave40_40 = [X_aveT, Y_aveT]
flag40_40 += 1
if flag40_40 >= 10:
# 文字領域を 白色にしてから表示
LCD.fill_rect(20,80,16*8,80, LCD.WHITE)
LCD.text_scaled(f'XL:{X_aveL}',20, 80,LCD.BLUE, 2)
LCD.text_scaled(f'XT:{X_aveT}',20,100,LCD.BLUE, 2)
LCD.text_scaled(f'YL:{Y_aveL}',20,120,LCD.BLUE, 2)
LCD.text_scaled(f'YT:{Y_aveT}',20,140,LCD.BLUE, 2)
# 初期状態 中心と思われる 7350 4700 の -400 +400
elif X_aveT > 6950 and Y_aveT < 5100:
# pos280_40 の 値を収録
ave280_40 = [X_aveT, Y_aveT]
flag280_40 += 1
if flag280_40 >= 10:
# 文字領域を 白色にしてから表示
LCD.fill_rect(180,80,16*8,80, LCD.WHITE)
LCD.text_scaled(f'XL:{X_aveL}',180, 80,LCD.BLUE, 2)
LCD.text_scaled(f'XT:{X_aveT}',180,100,LCD.BLUE, 2)
LCD.text_scaled(f'YL:{Y_aveL}',180,120,LCD.BLUE, 2)
LCD.text_scaled(f'YT:{Y_aveT}',180,140,LCD.BLUE, 2)
# 初期状態 中心と思われる 4800 7700 の +400 -400
elif X_aveT < 5200 and Y_aveT > 7300:
# pos40_440 の 値を収録
ave40_440 = [X_aveT, Y_aveT]
flag40_440 += 1
if flag40_440 >= 10:
# 文字領域を 白色にしてから表示
LCD.fill_rect(20,340,16*8,80, LCD.WHITE)
LCD.text_scaled(f'XL:{X_aveL}',20,340,LCD.BLUE, 2)
LCD.text_scaled(f'XT:{X_aveT}',20,360,LCD.BLUE, 2)
LCD.text_scaled(f'YL:{Y_aveL}',20,380,LCD.BLUE, 2)
LCD.text_scaled(f'YT:{Y_aveT}',20,400,LCD.BLUE, 2)
# 初期状態 中心と思われる 7350 7700 の -400 -400
elif X_aveT > 6950 and Y_aveT > 7300:
# pos280_440 の 値を収録
ave280_440 = [X_aveT, Y_aveT]
flag280_440 += 1
if flag280_440 >= 10:
# 文字領域を 白色にしてから表示
LCD.fill_rect(180,340,16*8,80, LCD.WHITE)
LCD.text_scaled(f'XL:{X_aveL}',180,340,LCD.BLUE, 2)
LCD.text_scaled(f'XT:{X_aveT}',180,360,LCD.BLUE, 2)
LCD.text_scaled(f'YL:{Y_aveL}',180,380,LCD.BLUE, 2)
LCD.text_scaled(f'YT:{Y_aveT}',180,400,LCD.BLUE, 2)
# 四隅のデータが揃ったら結果を表示する
if flag280_40 >= 10 and flag280_40 >= 10 and flag40_440 >= 10 and flag280_440 >= 10:
LCD.fill_rect(10,200,310,120, LCD.WHITE)
LCD.text_scaled(f'Set def Result Data',10,200,LCD.BLACK, 2)
LCD.text_scaled(f'def touch_get(self):',10,220,LCD.BLACK, 2)
LCD.text_scaled(f'rt40_40 ={ave40_40[0]},{ave40_40[1]}',10,240,LCD.BLACK, 2)
LCD.text_scaled(f'rt280_40 ={ave280_40[0]},{ave280_40[1]}',10,260,LCD.BLACK, 2)
LCD.text_scaled(f'rt40_440 ={ave40_440[0]},{ave40_440[1]}',10,280,LCD.BLACK, 2)
LCD.text_scaled(f'rt280_440={ave280_440[0]},{ave280_440[1]}',10,300,LCD.BLACK, 2)
LCD.show()
else:
cnt_scope = 0
flag_result = 0
time.sleep_ms(50)
# 初期のプログラムを残し、ポイントの軌跡を残す
else: # LCD.rotate == 90 or LCD.rotate == 270 : 横長表示
#color BRG
LCD.fill(LCD.WHITE)
LCD.fill_rect(140,5,200,30,LCD.RED)
# LCD.text("Raspberry Pi Pico",170,17,LCD.WHITE)
# 黄文字表示
LCD.text("Raspberry Pi Pico",170,17,LCD.YELLOW)
LCD.text("3.5' IPS LCD TEST",170,47,LCD.BLACK)
display_color = 0x001F
for i in range(len("Raspberry Pi Pico")):
LCD.fill_rect(i*16+108,70,14,20,(display_color))
display_color = display_color << 1
# 2025/06/29:Add 2倍の拡大文字を表示
LCD.text_scaled("Raspberry Pi Pico",108,72,LCD.BLUEGREEN, 2)
# 右下 隅 のセルを赤色にする
LCD.fill_rect(59 *8, 19 *8, 8, 8, LCD.RED)
LCD.fill_rect(59 *8, 39 *8, 8, 8, LCD.RED)
display_color = 0x001F
for i in range(0,12):
# LCD.fill_rect(i*30+60,100,30,50,(display_color))
LCD.fill_rect(i*30+60,120,30,50,(display_color))
display_color = display_color << 1
LCD.show()
# Touch Point 表示
while True:
get = LCD.touch_get()
if get != None:
# 8bits 単位のセルに変換
X_Point = int(get[0] /8)
Y_Point = int(get[1] /8)
if X_Point_Old != X_Point or Y_Point_Old != Y_Point:
# 前回と異なるセルならば
# 前回のセルを黄色にする
if Y_Point_Old < 40:
# LCD.show_up エリアならば
LCD.fill_rect(X_Point_Old *8, Y_Point_Old *8, 8, 8, LCD.YELLOW)
LCD.show()
# 今回のセルを赤色にする
if Y_Point < 40:
# LCD.show_up エリアならば
LCD.fill_rect(X_Point *8, Y_Point *8, 8, 8, LCD.RED)
LCD.show()
# Old Pointer 更新
X_Point_Old = X_Point
Y_Point_Old = Y_Point
time.sleep_ms(100)
追加実験その①~④の考察
プログラムのファイルサイズが大きくなると嵌りやすい?
深い処理(関数から関数を呼ぶことを繰り返すような処理)を繰り返していると、戻れなくなる?
解決のヒント発見
- 原因らしきものは、SPI通信にあるようです。
- SPIの速度を、40MHzから20MHzに変更すると、前記 追加実験その② での嵌まり込みが無くなりました。1000回pass
- 同じRP2350を使っていても Pico2 と Pimoroni Pico Plus 2とでは、SPIのドライブ能力に差があるのか、それとも、PSRAMの転送速度に問題があるのか?
- 描画速度は遅くなるけど大きなプログラム開発に使えるかもしれない。
- 次は、SPI の SCK や MOSI をオシロで波形観測ですね。波形がなまっているだけならドライバを入れてみましょう。
- ファイルサイズ76.5KB
- touch_lcd_TestOK_WS+ALG.py
########################################################################
# WAVE SHARE Pico-ResTouch-LCD-3.5 Test Program をライブラリとして独立させた
# 用意された main_3inch5.py をテスト・改良
# 2025/08/11 : main_3inch5-scale-712.py からライブラリとして独立させた
# touch_lcd-20250811-1214.py
# タッチパネルの調整と初期画面表示は残した状態
# へその緒をなくした(不要なものを削除した)+ MicroPython用の関数も削除
#
########################################################################
# ①初回の起動で表示しない
# self.spi = SPI(1,6_000_000) をコメントアウトでOK
#
# ②self.rotate = 270 では、タッチしても反転表示しないことを修正した。
# ⑤ で LCDの座標に合わせた形で返すように変更
#
# ③文字を整数倍の拡大文字を表示可能にした。(8x8 のフォントでは、判読困難)
# import framebuf で、ビットマップイメージを作成している関係から
# 8x8 のフォントしか扱えないようだ。
# def text_scaled(self, text, x, y, color, scale=1): を追加
# scale で指定した整数倍の拡大文字を表示可能にした。
#
# ④色の追加設定
# def rgb2color565(self, r, g, b): を用意して RBGから構成可能にした。
# Return color565 from RGB color value. Red Green Blue
# self.YELLOW = self.rgb2color565(0xFF, 0xFF, 0x00)
# self.PURPLE = self.rgb2color565(0xFF, 0x00, 0xFF)
# self.BLUEGREEN = self.rgb2color565(0x00, 0xFF, 0xFF)
#
# ⑤タッチパネルの座標をLCDの座標同様になるような形で返すように変更した。
# def self.touch_get(self): の中で、self.rotate を用いて、
# タッチパネルの座標が、LCDの座標(左上隅が 0 0)と一致させるようにした。
# X:横軸 Y:縦軸 左上隅が、X=0, Y=0
#
# ⑥1つのバッファで全画面の表示する 2025/07/15 (20925/07/11の間違いを修正)
# メモリが2倍の Pico2(RP2350)を使用して
# バッファをフルサイズ(480x320)にすれば、1つのバッファで全画面の表示ができる。
#
# ⑦ WS 波形表示
#
# ⑧ ALG パターン表示
#
# ⑨ Pico2(RP2350) 使用を前提にプログラムを整理
# def touch_get(self) の辺り
#
# ⑩ Pimoroni Pico Pi Plus 2 PSRAM 8MB を利用する
#
#
#
########################################################################
from machine import Pin,SPI,PWM
from micropython import const
import math
import framebuf
import time
import os
import gc # メモリ利用状況表示用
# for DEBUG
PRINT_TOUCH_POS = True # タッチ座標を表示する時
TOUCH_ADJ = True # タッチ座標を取得する時。ROTATE = const(180) にすること
LCD_DC = const(8)
LCD_CS = const(9)
LCD_SCK = const(10)
LCD_MOSI = const(11)
LCD_MISO = const(12)
LCD_BL = const(13)
LCD_RST = const(15)
TP_CS = const(16)
TP_IRQ = const(17)
##############################################################
# LCDの向きに合わせて設定する
# Set the rotation Angle to 0°, 90°, 180° or 270°
# 0:USBが左辺上 90:USBが下辺左 180:USBが右辺下 270:USBが上辺右
# タッチ座標を取得して調整するときは。ROTATE = const(180) にすること
##############################################################
ROTATE = const(180)
# この Pixel 分を上下左右に拡大したエリアをタッチ有効とする
# 一部、この倍の領域にしている
TOUCH = const(8)
class LCD_3inch5(framebuf.FrameBuffer):
def __init__(self):
self.RED = 0x07E0
self.GREEN = 0x001f
self.BLUE = 0xf800
self.WHITE = 0xffff
self.BLACK = 0x0000
# Return color565 from RGB color value.
# Red Green Blue
self.YELLOW = self.rgb2color565(0xFF, 0xFF, 0x00)
self.PURPLE = self.rgb2color565(0xFF, 0x00, 0xFF)
self.BLUEGREEN = self.rgb2color565(0x00, 0xFF, 0xFF)
self.GRAY = self.rgb2color565(0x50, 0x28, 0x15)
self.rotate = ROTATE
# 2025/07/15 ここの設定の修正が必要だった
if self.rotate == 0 or self.rotate == 180:
self.width = 320
# 2025/07/15 self.height = 240
self.height = 480
else:
self.width = 480
# 2025/07/15 self.height = 160
self.height = 320
# 制御信号端子の設定
self.cs = Pin(LCD_CS,Pin.OUT)
self.rst = Pin(LCD_RST,Pin.OUT)
self.dc = Pin(LCD_DC,Pin.OUT)
self.tp_cs =Pin(TP_CS,Pin.OUT)
self.irq = Pin(TP_IRQ,Pin.IN)
# 制御信号端子の初期状態設定
self.cs(1)
self.dc(1)
self.rst(1)
self.tp_cs(1)
# LCD(ILI9488) 40MHz
# self.spi_lcd = SPI(1,baudrate=40_000_000,sck=Pin(LCD_SCK),\
# mosi=Pin(LCD_MOSI),miso=Pin(LCD_MISO))
#
# LCD(ILI9488) 20MHz
self.spi_lcd = SPI(1,baudrate=20_000_000,sck=Pin(LCD_SCK),\
mosi=Pin(LCD_MOSI),miso=Pin(LCD_MISO))
print(self.spi_lcd)
#################### このあたりが難解 ################################
# Pico2(RP2350) ならば、画面一杯をしてしてもメモリエラーにならない
self.buffer = bytearray(self.height * self.width * 2)
super().__init__(self.buffer, self.width, self.height, framebuf.RGB565)
#########################################################################
print('gc.mem_free() = ', gc.mem_free()) # メモリ利用状況
self.init_display()
# color565 is Blue:5bits, Red:6bits, and Green:5bits 16bits
# Return color565 from RGB color value.
def rgb2color565(self, r, g, b):
return (r & 0xFC) << 3 | (g & 0xF8) >> 3 | (b & 0xF8) << 8
def init_display(self):
self.rst(0)
time.sleep_ms(10)
self.rst(1)
time.sleep_ms(50)
# INVON = const(0x21) # Display inversion on
self.write_cmd(0x21)
# Power Control 3
self.write_cmd(0xC2)
self.write_data(0x33)
# VMCTR1 = const(0xC5) # VCOM control 1
self.write_cmd(0xC5)
self.write_data(0x00)
self.write_data(0x1e)
self.write_data(0x80)
# FRMCTR1 = const(0xB1) # Frame rate control (In normal mode/full colors)
self.write_cmd(0xB1)
self.write_data(0xB0)
# GMCTRP1 = const(0xE0) # Positive gamma correction
self.write_cmd(0xE0)
self.write_data(0x00)
self.write_data(0x13)
self.write_data(0x18)
self.write_data(0x04)
self.write_data(0x0F)
self.write_data(0x06)
self.write_data(0x3a)
self.write_data(0x56)
self.write_data(0x4d)
self.write_data(0x03)
self.write_data(0x0a)
self.write_data(0x06)
self.write_data(0x30)
self.write_data(0x3e)
self.write_data(0x0f)
# GMCTRN1 = const(0xE1) # Negative gamma correction
self.write_cmd(0xE1)
self.write_data(0x00)
self.write_data(0x13)
self.write_data(0x18)
self.write_data(0x01)
self.write_data(0x11)
self.write_data(0x06)
self.write_data(0x38)
self.write_data(0x34)
self.write_data(0x4d)
self.write_data(0x06)
self.write_data(0x0d)
self.write_data(0x0b)
self.write_data(0x31)
self.write_data(0x37)
self.write_data(0x0f)
# PIXFMT = const(0x3A) # COLMOD: Pixel format set
self.write_cmd(0x3A)
self.write_data(0x55) # 16bits/pixel
# SLPOUT = const(0x11) # Exit sleep mode
self.write_cmd(0x11)
time.sleep_ms(120)
self.write_cmd(0x29)
# DFUNCTR = const(0xB6) # Display function control
self.write_cmd(0xB6)
self.write_data(0x00)
self.write_data(0x62)
# MADCTL = const(0x36) # Memory access control
self.write_cmd(0x36) # Sets the memory access mode for rotation
# bit 7-6:パネル方向 bit 5=0:横長 1:縦長
# bit 3は、常に1 bit 7654 3210
if self.rotate == 0:
self.write_data(0x88) # 1000 1000
elif self.rotate == 180:
self.write_data(0x48) # 0100 1000
elif self.rotate == 90:
self.write_data(0xe8) # 1110 1000
else:
self.write_data(0x28) # 0010 1000
def write_cmd(self, cmd):
self.cs(1)
self.dc(0)
self.cs(0)
self.spi_lcd.write(bytearray([cmd]))
self.cs(1)
def write_data(self, buf):
self.cs(1)
self.dc(1)
self.cs(0)
#self.spi_lcd.write(bytearray([0x00]))
self.spi_lcd.write(bytearray([buf]))
self.cs(1)
# 全エリアに描画
def show(self):
if self.rotate == 0 or self.rotate == 180:
# SET_COLUMN = const(0x2A) # Column address set
self.write_cmd(0x2A)
self.write_data(0x00) # Start Column
self.write_data(0x00) # 0x0000
self.write_data(0x01) # End Column
self.write_data(0x3f) # 0x013f:319
# SET_PAGE = const(0x2B) # Page address set
self.write_cmd(0x2B)
self.write_data(0x00) # Start Page
self.write_data(0x00) # 0x0000
self.write_data(0x01) # End Page
self.write_data(0xdf) # 0x01df:479
else: # self.rotate == 90 or self.rotate == 270:
# SET_COLUMN = const(0x2A) # Column address set
self.write_cmd(0x2A)
self.write_data(0x00) # Start Column
self.write_data(0x00) # 0x0000
self.write_data(0x01) # End Column
self.write_data(0xdf) # 0x01df:479
# SET_PAGE = const(0x2B) # Page address set
self.write_cmd(0x2B)
self.write_data(0x00) # Start Page
self.write_data(0x00) # 0x0000
self.write_data(0x01) # End Page
self.write_data(0x3f) # 0x013f:319
# WRITE_RAM = const(0x2C) # Memory write
self.write_cmd(0x2C)
self.cs(1)
self.dc(1)
self.cs(0)
self.spi_lcd.write(self.buffer)
self.cs(1)
# 2025/06/29 Add
# 拡大表示するテキスト描画関数
# scale:拡大率(整数)
def text_scaled(self, text, x, y, color, scale=1):
# 一時的なフレームバッファを作成(文字描画用)
temp_fb = framebuf.FrameBuffer(bytearray(8 * len(text) * 8),\
8 * len(text), 8, framebuf.MONO_HLSB)
temp_fb.fill(0) # 背景をクリア
temp_fb.text(text, 0, 0, 1) # 文字を描画
# 各ピクセルを拡大して描画
for yy in range(8):
for xx in range(8 * len(text)):
if temp_fb.pixel(xx, yy): # 文字のピクセルがある場合
self.fill_rect(x + xx * scale, y + yy * scale,\
scale, scale, color)
def bl_ctrl(self,duty):
pwm = PWM(Pin(LCD_BL))
pwm.freq(1000)
if(duty>=100):
pwm.duty_u16(65535)
else:
pwm.duty_u16(655*duty)
def touch_get(self):
if self.irq() == 0:
# spi1 Switching to Touch Panel
# 2025/07/03 : 使用都度、設定し直す、この方法が良いようだ。
# Touch Panel(XPT2046) 4MHz
self.spi_touch = SPI(1, baudrate=4_000_000, sck=Pin(LCD_SCK),\
mosi=Pin(LCD_MOSI), miso=Pin(LCD_MISO))
self.tp_cs(0)
time.sleep_ms(1)
for i in range(0,3):
self.spi_touch.write(bytearray([0xD0]))
Read_date = self.spi_touch.read(2)
time.sleep_us(10)
x_touch = ((Read_date[0] <<8) + Read_date[1]) >>3
self.spi_touch.write(bytearray([0x90]))
Read_date = self.spi_touch.read(2)
time.sleep_us(10)
y_touch = ((Read_date[0] <<8) + Read_date[1]) >>3
self.tp_cs(1)
# DEBUG ADJ 用 ####################################################
if PRINT_TOUCH_POS:
print('x_touch = ', x_touch, ' y_touch = ', y_touch)
###################################################################
# spi1 Switching to LCD
# 2025/07/03 : 使用が終われば、設定を元に戻す。この方法が良いようだ。
# LCD(ILI9488) 40MHz
self.spi_lcd = SPI(1, baudrate=40_000_000, sck=Pin(LCD_SCK),\
mosi=Pin(LCD_MOSI), miso=Pin(LCD_MISO))
##############################
# Set Here Adjuste Parameter
# x_min ===> x_max
# 4800 7350
# y_min -----------------
# | |
# 4700 | + + |
# | |
# | LCD Panel |
# | |_
# | | | USB connector
# 7700 | + + |~
# | |
# y_max -----------------
# ~~ USB connector
###########################################################
# 2025/07/24 ADJ
# 四隅ではなく、各40Pixcel 中央寄りの四隅の値を基準に決める方法に変更
# 2025/08/14 Adj No3 Touch LCD
# 左上の XT XY の値
result40_40 = [4800,4720] # [4900,4800]
# 右上の XT XY の値
result280_40 = [7400,4720] # [7450,4800]
# 左下の XT XY の値
result40_440 = [4800,7700] # [4900,7800]
# 右下の XT XY の値
result280_440 = [7400,7700] # [7450,7800]
# 右下の XT XY の値は、利用していない
x_min = int(result40_40[0] - ((result280_40[0] - result40_40[0]) *40 /(280 -40)))
x_max = int(result280_40[0] + ((result280_40[0] - result40_40[0]) *40 /(280 -40)))
y_min = int(result40_40[1] - ((result40_440[1] - result40_40[1]) *40 /(440 -40)))
y_max = int(result40_440[1] + ((result40_440[1] - result40_40[1]) *40 /(440 -40)))
#########################
x_range = x_max - x_min
y_range = y_max - y_min
#########################
# Result_list = [touch_,touch_Y]
# 2025/07/02 : self.rotate の方向で、LCD位置に合わせた座標を返す
if self.rotate == 0 or self.rotate == 180:
if self.rotate == 0: # X軸Y軸の座標入替なし and X軸Y軸とも 数値変換なし
X_Point = 320 - int((x_touch - x_min) *320 /x_range)
Y_Point = 480 - int((y_touch - y_min) *480 /y_range)
elif self.rotate == 180: # X軸Y軸の座標入替なし and Y軸は 数値大小入替
X_Point = int((x_touch - x_min) *320 /x_range)
Y_Point = int((y_touch - y_min) *480 /y_range)
# 範囲内に収める 2025/07/17 修正
if X_Point >= 320:
X_Point = 319
elif X_Point < 0:
X_Point = 0
if Y_Point >= 480:
Y_Point = 479
elif Y_Point < 0:
Y_Point = 0
else: # self.rotate == 90 or self.rotate == 270:
if self.rotate == 90: # X軸Y軸の座標入替あり and X軸は 数値大小入替
X_Point = 480 - int((y_touch - y_min) *480 /y_range)
Y_Point = int((x_touch - x_min) *320 /x_range)
elif self.rotate == 270: # X軸Y軸の座標入替あり and Y軸は 数値大小入替
X_Point = int((y_touch - y_min) *480 /y_range)
Y_Point = 320 - int((x_touch - x_min) *320 /x_range)
# 範囲内に収める 2025/07/17 修正
if X_Point >= 480:
X_Point = 479
elif X_Point < 0:
X_Point = 0
if Y_Point >= 320:
Y_Point = 319
elif Y_Point < 0:
Y_Point = 0
if TOUCH_ADJ: # タッチポイント調整用に生のポイントデータを返す
# 2025/07/23
Result_list = [X_Point, Y_Point, x_touch, y_touch]
else: # LCD Pixcel に変換したデータのみを返す
Result_list = [X_Point, Y_Point]
# 2025/06/27 : タッチされた座標を表示
print(Result_list)
return(Result_list)
#################################################
# MicroPython
#################################################
def bold_pixel(x, y, color, scale):
if scale >= 2:
s = int(scale /2)
x = 0 if (x -s) < 0 else x -s
y = 0 if (y -s) < 0 else y -s
LCD.fill_rect(x, y, scale, scale, color)
# 座標ポイント zs ze で指定された2点のPixel および、その周囲の8点同士を線で描く
def bold_line(zs, ze, color):
for x in range(-1,2):
for y in range(-1,2):
LCD.line(zs[0] +x, zs[1] +y, ze[0] +x, ze[1] +y, color)
# 座標ポイント で指定された2点のPixel および、右側と下側 4点同士を線で描く
def bold_line2(zs, ze, color):
for x in range(2):
for y in range(2):
LCD.line(zs[0] +x, zs[1] +y, ze[0] +x, ze[1] +y, color)
def one_write_line(zl, color_wave):
# zl[[zs], [z1], [z2], [z3], [z4], ]
if len(zl) >= 2:
z_end = zl[0]
for i in range(1, len(zl)):
z_start = z_end
# y軸は、反転することに注意
z_end =[zl[0][0] +zl[i][0], zl[0][1] -zl[i][1]]
bold_line(z_start, z_end, color_wave)
# WS 波形をLCD下半分の決まった位置に表示する
def wave_form(ws, color_back, color_wave):
xs = 0
xb = 8 # 枠の幅 x
ys = 264 # 240~259:[WS]Tab 260~263:Line
yl = ys +18 # 240~259:[WS]Tab 260~263:Line 中央の線
yb = 3 # 枠の幅 y
w = 64 # セルの全体幅
wx = 48 # セルの波形幅
h = 36 # セルの全体高さ
hy = 15 # セルの波形高さの半分 sin価数を利用するため 1/2 にしている
# ws 番号から描画開始位置を決めるためのテーブル
# ws=0, 1, 2, 3, 4,
zone_xs = [xs +w*0, xs +w*1, xs +w*2, xs +w*0, xs +w*3, \
# ws=5, 6, 7, 8, 9,
xs +w*4, xs +w*0, xs +w*4, xs +w*0, xs +w*1, \
# ws=10, 11, 12, 13, 14,
xs +w*2, xs +w*1, xs +w*3, xs +w*4, xs +w*1, \
# ws=15, 16, 17, 18, 19,
xs +w*0, xs +w*0, xs +w*1, xs +w*2, xs +w*2, \
# ws=20, 21, 22, 23, 24,
xs +w*3, xs +w*4, xs +w*2, xs +w*0, xs +w*0, \
# ws=25, 26, 27, 28, 29, 30,
xs +w*1, xs +w*2, xs +w*3, xs +w*3, xs +w*4, xs +w*3]
# ws=0, 1, 2, 3, 4,
zone_ys = [ys +h*0, ys +h*0, ys +h*0, ys +h*5, ys +h*0, \
# ws=5, 6, 7, 8, 9,
ys +h*0, ys +h*4, ys +h*4, ys +h*1, ys +h*1, \
# ws=10, 11, 12, 13, 14,
ys +h*1, ys +h*5, ys +h*1, ys +h*1, ys +h*4, \
# ws=15, 16, 17, 18, 19,
ys +h*0, ys +h*2, ys +h*2, ys +h*2, ys +h*5, \
# ws=20, 21, 22, 23, 24,
ys +h*2, ys +h*2, ys +h*4, ys +h*0, ys +h*3, \
# ws=25, 26, 27, 28, 29, 30,
ys +h*3, ys +h*3, ys +h*5, ys +h*3, ys +h*3, ys +h*4]
# 波形の Y軸 0 line 上下中心線
zone_yl = [yl +h*0, yl +h*0, yl +h*0, yl +h*5, yl +h*0, \
yl +h*0, yl +h*4, yl +h*4, yl +h*1, yl +h*1, \
yl +h*1, yl +h*5, yl +h*1, yl +h*1, yl +h*4, \
yl +h*0, yl +h*2, yl +h*2, yl +h*2, yl +h*5, \
yl +h*2, yl +h*2, yl +h*4, yl +h*0, yl +h*3, \
yl +h*3, yl +h*3, yl +h*5, yl +h*3, yl +h*3, yl +h*4]
if ws == 0:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
for i in range(wx):
xp = zone_xs[ws] +i +xb
# 円周360度を 60分割してサイン波形をプロットする
yp = zone_yl[ws] -int(math.sin(math.radians(i *(360/wx))) *hy)
bold_pixel(xp, yp, color_wave, 3)
elif ws == 1:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
for i in range(int(wx/2)+1):
xp = zone_xs[ws] +i +xb
# 円周360度を 60分割してサイン波形をプロットする
yp = zone_yl[ws] -int(math.sin(math.radians(i *(360/wx))) *hy)
bold_pixel(xp, yp, color_wave, 3)
# 直線部分を描く
xp = zone_xs[ws] +xb +24
yp = zone_yl[ws]
# 起点 1 2 3 4 5 6 7 8
zl = [[xp,yp], [+24,0]]
one_write_line(zl, color_wave)
elif ws == 2:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
for i in range(wx):
xp = zone_xs[ws] +i +xb
# 円周360度を 60分割してサイン波形をプロットする
yp = zone_yl[ws] -int(abs(math.sin(math.radians(i *(360/wx))) *hy))
bold_pixel(xp, yp, color_wave, 3)
elif ws == 3:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形の 1/4 をプロットする
for i in range(0, 12):
xp = zone_xs[ws] +i +xb
yp = zone_yl[ws] -int(abs(math.sin(math.radians(i *(360/wx))) *hy))
bold_pixel(xp, yp, color_wave, 3)
# 円周360度を 60分割してサイン波形の 3/4 をプロットする
for i in range(24, 36):
xp = zone_xs[ws] +i +xb
yp = zone_yl[ws] -int(abs(math.sin(math.radians(i *(360/wx))) *hy))
bold_pixel(xp, yp, color_wave, 3)
# 直線部分を描く
z1 = [zone_xs[ws] +xb +12, zone_ys[ws] +yb +0]
z2 = [zone_xs[ws] +xb +12, zone_ys[ws] +yb +hy]
z3 = [zone_xs[ws] +xb +24, zone_ys[ws] +yb +hy]
bold_line(z1, z2, color_wave)
bold_line(z2, z3, color_wave)
z4 = [zone_xs[ws] +xb +36, zone_ys[ws] +yb +0]
z5 = [zone_xs[ws] +xb +36, zone_ys[ws] +yb +hy]
z6 = [zone_xs[ws] +xb +48, zone_ys[ws] +yb +hy]
bold_line(z4, z5, color_wave)
bold_line(z5, z6, color_wave)
elif ws == 4:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形をプロットする
for i in range(30+1):
xp = zone_xs[ws] +i +xb *2
yp = zone_yl[ws] -int(math.sin(math.radians(i *(360/30))) *hy)
bold_pixel(xp, yp, color_wave, 3)
elif ws == 5:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形をプロットする
for i in range(30+1):
xp = zone_xs[ws] +i +xb *2
yp = zone_yl[ws] -int(abs(math.sin(math.radians(i *(360/30))) *hy))
bold_pixel(xp, yp, color_wave, 3)
elif ws == 6:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [0,+hy], [24,+hy], [24,-hy], [48,-hy], [48,0]]
one_write_line(zl, color_wave)
elif ws == 7:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# サイン波形の 180~270 をプロットする
for i in range(0, 24):
xp = zone_xs[ws] +i +xb
yp = zone_ys[ws] +yb +int(hy*2 - (abs(math.sin(math.radians(i *(360/(wx*2)) +180))) *(-1) *hy +hy*2))
bold_pixel(xp, yp, color_wave, 3)
# サイン波形の 270~360 をプロットする
for i in range(24, 48):
xp = zone_xs[ws] +i +xb
yp = zone_ys[ws] +yb +int(hy*2 - (abs(math.sin(math.radians(i *(360/(wx*2)) +0))) *hy))
bold_pixel(xp, yp, color_wave, 3)
# 直線部分を描く
z1 = [zone_xs[ws] +xb +0, zone_ys[ws] +yb +0]
z2 = [zone_xs[ws] +xb +0, zone_ys[ws] +yb +hy]
z3 = [zone_xs[ws] +xb +48, zone_ys[ws] +yb +hy*2]
z4 = [zone_xs[ws] +xb +48, zone_ys[ws] +yb +hy]
bold_line(z1, z2, color_wave)
bold_line(z3, z4, color_wave)
elif ws == 8:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形をプロットする
for i in range(wx):
xp = zone_xs[ws] +i +xb
y = -int(math.sin(math.radians(i *(360/wx))) *hy)
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
elif ws == 9:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形をプロットする
for i in range(int(wx/2)+1):
xp = zone_xs[ws] +i +xb
y = -int(math.sin(math.radians(i *(360/wx))) *hy)
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
z1 = [zone_xs[ws] +xb +24, zone_ys[ws] +yb +hy]
z2 = [zone_xs[ws] +xb +48, zone_ys[ws] +yb +hy]
bold_line(z1, z2, color_wave)
elif ws == 10:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形をプロットする
for i in range(wx):
xp = zone_xs[ws] +i +xb
y = -int(abs(math.sin(math.radians(i *(360/wx))) *hy))
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
elif ws == 11:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形の 1/4 をプロットする
for i in range(0, 12):
xp = zone_xs[ws] +i +xb
y = -int(abs(math.sin(math.radians(i *(360/wx))) *hy))
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
# 円周360度を 60分割してサイン波形の 3/4 をプロットする
for i in range(24, 36):
xp = zone_xs[ws] +i +xb
y = -int(abs(math.sin(math.radians(i *(360/wx))) *hy))
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
# 直線部分を描く
z1 = [zone_xs[ws] +xb +12, zone_ys[ws] +yb +5]
z2 = [zone_xs[ws] +xb +12, zone_ys[ws] +yb +hy]
z3 = [zone_xs[ws] +xb +24, zone_ys[ws] +yb +hy]
bold_line(z1, z2, color_wave)
bold_line(z2, z3, color_wave)
z4 = [zone_xs[ws] +xb +36, zone_ys[ws] +yb +5]
z5 = [zone_xs[ws] +xb +36, zone_ys[ws] +yb +hy]
z6 = [zone_xs[ws] +xb +48, zone_ys[ws] +yb +hy]
bold_line(z4, z5, color_wave)
bold_line(z5, z6, color_wave)
elif ws == 12:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形をプロットする
for i in range(30+1):
xp = zone_xs[ws] +i +xb *2
y = -int(math.sin(math.radians(i *(360/30))) *hy)
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
elif ws == 13:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 円周360度を 60分割してサイン波形をプロットする
for i in range(30+1):
xp = zone_xs[ws] +i +xb *2
y = -int(abs(math.sin(math.radians(i *(360/30))) *hy))
# 上限・下限を設ける
if y > 11:
y = 11
elif y < -11:
y = -11
yp = zone_yl[ws] +y
bold_pixel(xp, yp, color_wave, 3)
elif ws == 14:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [0,+hy], [24,+hy], [24,0], [48,0]]
one_write_line(zl, color_wave)
elif ws == 15:
# Notthing
pass
elif ws == 16:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [12,+hy], [36,-hy], [48,0]]
one_write_line(zl, color_wave)
elif ws == 17:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [12,+hy], [24,0], [48,0]]
one_write_line(zl, color_wave)
elif ws == 18:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [12,+hy], [24,0], [36,+hy], [48,0]]
one_write_line(zl, color_wave)
elif ws == 19:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [12,+hy], [12,0], [24,0], [36,+hy], [36,0], [48,0]]
one_write_line(zl, color_wave)
elif ws == 20:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb*2
yp = zone_yl[ws]
zl = [[xp,yp], [7,+hy], [21,-hy], [28,0]]
one_write_line(zl, color_wave)
elif ws == 21:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb*2
yp = zone_yl[ws]
zl = [[xp,yp], [7,+hy], [14,0], [21,+hy], [28,0]]
one_write_line(zl, color_wave)
elif ws == 22:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
# 起点 1 2 3 4 5 6 7 8
zl = [[xp,yp], [0,+hy], [12,+hy], [12,0], [24,0], [24,+hy], [36,+hy], [36,0], [48,0]]
one_write_line(zl, color_wave)
elif ws == 23:
# Notthing
pass
elif ws == 24:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [24,+hy], [24,-hy], [48,0]]
one_write_line(zl, color_wave)
elif ws == 25:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [24,+hy], [24,0], [48,0]]
one_write_line(zl, color_wave)
elif ws == 26:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [24,+hy], [24,0], [48,+hy], [48,0]]
one_write_line(zl, color_wave)
elif ws == 27:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb
yp = zone_yl[ws]
zl = [[xp,yp], [12,+hy], [12,0], [24,0], [36,+hy], [36,0], [48,0]]
one_write_line(zl, color_wave)
elif ws == 28:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb*2
yp = zone_yl[ws]
zl = [[xp,yp], [14,+hy], [14,-hy], [28,0]]
one_write_line(zl, color_wave)
elif ws == 29:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb*2
yp = zone_yl[ws]
zl = [[xp,yp], [14,+hy], [14,0], [28,+hy], [28,0]]
one_write_line(zl, color_wave)
elif ws == 30:
# 指定のセル枠を指定色で埋める
LCD.fill_rect(zone_xs[ws],zone_ys[ws], w, h, color_back)
# 直線部分を描く
xp = zone_xs[ws] +xb*2
yp = zone_yl[ws]
zl = [[xp,yp], [0,+hy], [12,+hy], [12,0], [36,0]]
one_write_line(zl, color_wave)
elif ws == 31:
# Nothing
pass
# ALG op(オペレーション)の四角の枠と数値を表示する
def alg_op(op_num_text, zl, fb,color_line, color_back, color_text, scale):
xb = 2 # line X の太さ(pixel数)
yb = 2 # line Y の太さ(pixel数)
xf = 7 # FB line の位置 x差分
yf = 11 # FB line の位置 y差分
xt = 2 # Text の開始位置 x差分
yt = -3 # Text の開始位置 y差分
if scale == 2:
zt = [zl[0] +xt*scale, zl[1] +yt*scale]
zs = [zl[0] , zl[1] -5*scale]
zf = [zl[0] -xf*scale, zl[1] -yf*scale]
w_op = 24*scale # 文字幅 8 pixel 文字 x 3文字
h_op = 8*scale # 文字高さ
else:
zt = [zl[0] +xt, zl[1] +yt]
zs = [zl[0] , zl[1] -5]
zf = [zl[0] -xf, zl[1] -yf]
w_op = 24 # 文字幅 8 pixel 文字 x 3文字
h_op = 8 # 文字高さ
if scale == 2:
if fb ==1: # フィードバックの枠線を描く、中抜き方式
LCD.fill_rect(zf[0], zf[1], w_op +xb*2 +xf*2*scale, yf*scale +yb ,color_line)
LCD.fill_rect(zf[0] +xb, zf[1] +yb, w_op +xf*2*scale, yf*scale -yb ,LCD.WHITE)
LCD.fill_rect(zs[0], zs[1], w_op +xb*2, h_op +yb*2, color_line)
LCD.fill_rect(zs[0] +xb, zs[1] +yb, w_op, h_op, color_back)
# LCD.text(op_num_text, zt[0], zt[1], color_text)
LCD.text_scaled(op_num_text, zt[0], zt[1], color_text, scale)
else:
if fb ==1: # フィードバックの枠線を描く、中抜き方式
LCD.fill_rect(zf[0], zf[1], w_op +xb*2 +xf*2, yf +yb ,color_line)
LCD.fill_rect(zf[0] +xb, zf[1] +yb, w_op +xf*2, yf -yb ,LCD.WHITE)
LCD.fill_rect(zs[0], zs[1], w_op +xb*2, h_op +yb*2, color_line)
LCD.fill_rect(zs[0] +xb, zs[1] +yb, w_op, h_op, color_back)
LCD.text(op_num_text, zt[0], zt[1], color_text)
# ALG を下半分の決まった位置に表示する。+ 画面上半分に stageで指定されたものを拡大表示
def alg_patarn(alg, stage, color_line, color_back, color_text):
# scale == 2 の場合は、2倍に拡大して上段に表示する。その位置の設定
zl_algS = [10, 40] # 拡大して表示する場合の開始位置
# 下半分の決まった位置に表示する各アルゴリズム基準となる OP左端の上下中心点の設定
zl_alg0 = [173 +28, 245 +12+16 +5]
zl_alg1 = [ 31 +28, 245 +12+16 +5]
zl_alg2 = [ 31 +28, 245 +12+16*3 +22 +3]
zl_alg3 = [173, 245 +12+16*3 +3]
zl_alg4 = [173, 245 +12+16*5 +22]
zl_alg5 = [173 +28, 245 +12+16*7 +22]
zl_alg6 = [173, 245 +12+16*9 +22*2]
zl_alg7 = [ 31, 245 +12+16*5 +22*4]
# ALG タイトル表示位置
alg_textS = [10, 35] # 拡大して表示する場合の開始位置
alg_text0 = [165 -27, 245 +12 +10]
alg_text1 = [ 5, 245 +12 +10]
alg_text2 = [ 5, 245 +12+16*2 +22 +30]
alg_text3 = [165 -27, 245 +12+16*2 +10 +3]
alg_text4 = [165 -27, 245 +12+16*4 +22]
alg_text5 = [165 -27, 245 +12+16*6 +22 +10]
alg_text6 = [165 -27, 245 +12+16*8 +22*2 +10]
alg_text7 = [ 5, 245 +12+16*4 +22*4 +20]
# 暗号化された stage を復号
alg_on_stage = int(stage /3)
only_down = False
only_up = False
both = False
if stage %3 == 0:
only_down = True # 下半分のみ表示
elif stage %3 == 1:
only_up = True # 上半分のみ表示
else: # stage %3 == 2
both = True # 両方表示
if alg == 0:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0] +28 +14 , z_op1[1]]
z_je = [z_op2[0] +28 +14 , z_op2[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg0
z_op2 = [z_op1[0] +28 +14 , z_op1[1]]
z_je = [z_op2[0] +28 +14 , z_op2[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text0
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 1:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0], z_op1[1] +22]
z_je = [z_op1[0] +28 +14*2, z_op1[1]]
z_j1 = [z_op1[0] +28 +14 , z_op1[1]]
z_j2 = [z_op2[0] +28 +14 , z_op2[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
z_j1 = [z_j1[0]*2, z_j1[1]*2]
z_j2 = [z_j2[0]*2, z_j2[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j2, color_line)
bold_line2(z_j1 , z_j2, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg1
z_op2 = [z_op1[0], z_op1[1] +22]
z_je = [z_op1[0] +28 +14*2, z_op1[1]]
z_j1 = [z_op1[0] +28 +14 , z_op1[1]]
z_j2 = [z_op2[0] +28 +14 , z_op2[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j2, color_line)
bold_line2(z_j1 , z_j2, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text1
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 2:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0], z_op1[1] +22]
z_op3 = [z_op1[0], z_op1[1] +22*2]
z_op4 = [z_op1[0], z_op1[1] +22*3]
z_je = [z_op1[0] +28 +14*2, z_op1[1]]
z_j1 = [z_op1[0] +28 +14 , z_op1[1]]
z_j2 = [z_op2[0] +28 +14 , z_op2[1]]
z_j3 = [z_op3[0] +28 +14 , z_op3[1]]
z_j4 = [z_op4[0] +28 +14 , z_op4[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_op3 = [z_op3[0]*2, z_op3[1]*2]
z_op4 = [z_op4[0]*2, z_op4[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
z_j1 = [z_j1[0]*2, z_j1[1]*2]
z_j2 = [z_j2[0]*2, z_j2[1]*2]
z_j3 = [z_j3[0]*2, z_j3[1]*2]
z_j4 = [z_j4[0]*2, z_j4[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j2, color_line)
bold_line2(z_op3, z_j3, color_line)
bold_line2(z_op4, z_j4, color_line)
bold_line2(z_j1 , z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
alg_op(' 3 ', z_op3, 1, color_line, color_back, color_text, 2)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg2
z_op2 = [z_op1[0], z_op1[1] +22]
z_op3 = [z_op1[0], z_op1[1] +22*2]
z_op4 = [z_op1[0], z_op1[1] +22*3]
z_je = [z_op1[0] +28 +14*2, z_op1[1]]
z_j1 = [z_op1[0] +28 +14 , z_op1[1]]
z_j2 = [z_op2[0] +28 +14 , z_op2[1]]
z_j3 = [z_op3[0] +28 +14 , z_op3[1]]
z_j4 = [z_op4[0] +28 +14 , z_op4[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j2, color_line)
bold_line2(z_op3, z_j3, color_line)
bold_line2(z_op4, z_j4, color_line)
bold_line2(z_j1 , z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
alg_op(' 3 ', z_op3, 1, color_line, color_back, color_text, 1)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text2
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 3:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0] , z_op1[1] +22]
z_op3 = [z_op1[0] +28 +14 , z_op1[1] +22]
z_op4 = [z_op1[0] +28*2 +14*3 , z_op1[1]]
z_je = [z_op4[0] +28 +14 , z_op4[1]]
z_j1 = [z_op1[0] +28*2 +14*2 , z_op1[1]]
z_j3 = [z_op3[0] +28 +14 , z_op3[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_op3 = [z_op3[0]*2, z_op3[1]*2]
z_op4 = [z_op4[0]*2, z_op4[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
z_j1 = [z_j1[0]*2, z_j1[1]*2]
z_j3 = [z_j3[0]*2, z_j3[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j3, color_line)
bold_line2(z_j1, z_j3, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 2)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg3
z_op2 = [z_op1[0] , z_op1[1] +22]
z_op3 = [z_op1[0] +28 +14 , z_op1[1] +22]
z_op4 = [z_op1[0] +28*2 +14*3 , z_op1[1]]
z_je = [z_op4[0] +28 +14 , z_op4[1]]
z_j1 = [z_op1[0] +28*2 +14*2 , z_op1[1]]
z_j3 = [z_op3[0] +28 +14 , z_op3[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j3, color_line)
bold_line2(z_j1, z_j3, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 1)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text3
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 4:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0] +28 +14 , z_op1[1]]
z_op3 = [z_op2[0] +28 +7 , z_op1[1]]
z_op4 = [z_op3[0] +28 +7 , z_op1[1]]
z_je = [z_op4[0] +28 +14 , z_op2[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_op3 = [z_op3[0]*2, z_op3[1]*2]
z_op4 = [z_op4[0]*2, z_op4[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
# op 表示
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 2)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg4
z_op2 = [z_op1[0] +28 +14 , z_op1[1]]
z_op3 = [z_op2[0] +28 +7 , z_op1[1]]
z_op4 = [z_op3[0] +28 +7 , z_op1[1]]
z_je = [z_op4[0] +28 +14 , z_op2[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 1)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text4
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 5:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0] +28 +14 , z_op1[1]]
z_op3 = [z_op1[0] , z_op1[1] +22]
z_op4 = [z_op2[0] , z_op2[1] +22]
z_je = [z_op2[0] +28 +14*2 , z_op2[1]]
z_j2 = [z_op2[0] +28 +14 , z_op2[1]]
z_j4 = [z_op4[0] +28 +14 , z_op4[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_op3 = [z_op3[0]*2, z_op3[1]*2]
z_op4 = [z_op4[0]*2, z_op4[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
z_j2 = [z_j2[0]*2, z_j2[1]*2]
z_j4 = [z_j4[0]*2, z_j4[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op3, z_j4, color_line)
bold_line2(z_j2, z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
alg_op(' 3 ', z_op3, 1, color_line, color_back, color_text, 2)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg5
z_op2 = [z_op1[0] +28 +14 , z_op1[1]]
z_op3 = [z_op1[0] , z_op1[1] +22]
z_op4 = [z_op2[0] , z_op2[1] +22]
z_je = [z_op2[0] +28 +14*2 , z_op2[1]]
z_j2 = [z_op2[0] +28 +14 , z_op2[1]]
z_j4 = [z_op4[0] +28 +14 , z_op4[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op3, z_j4, color_line)
bold_line2(z_j2, z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
alg_op(' 3 ', z_op3, 1, color_line, color_back, color_text, 1)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text5
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 6:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op1 = zl_algS
z_op2 = [z_op1[0] , z_op1[1] +22]
z_op3 = [z_op2[0] +28 +14 , z_op2[1]]
z_op4 = [z_op3[0] +28 +7 , z_op3[1]]
z_je = [z_op1[0] +28*2 +7 +14*5 , z_op1[1]]
z_j1 = [z_op1[0] +28*2 +7 +14*4 , z_op1[1]]
z_j4 = [z_op4[0] +28 +14 , z_op4[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_op3 = [z_op3[0]*2, z_op3[1]*2]
z_op4 = [z_op4[0]*2, z_op4[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
z_j1 = [z_j1[0]*2, z_j1[1]*2]
z_j4 = [z_j4[0]*2, z_j4[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j4, color_line)
bold_line2(z_j1, z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 2)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op1 = zl_alg6
z_op2 = [z_op1[0] , z_op1[1] +22]
z_op3 = [z_op2[0] +28 +14 , z_op2[1]]
z_op4 = [z_op3[0] +28 +7 , z_op3[1]]
z_je = [z_op1[0] +28*2 +7 +14*5 , z_op1[1]]
z_j1 = [z_op1[0] +28*2 +7 +14*4 , z_op1[1]]
z_j4 = [z_op4[0] +28 +14 , z_op4[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j4, color_line)
bold_line2(z_j1, z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 1)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text6
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
elif alg == 7:
if alg == alg_on_stage and (only_up or both):
# 上半分に描く 描画ポイントの設定
z_op2 = [zl_algS[0], zl_algS[1] +22]
# op2 を起点にする
z_op1 = [z_op2[0] +35, z_op2[1] -22]
z_op3 = [z_op2[0] +28 +14, z_op2[1]]
z_op4 = [z_op1[0] , z_op1[1] +22*2]
z_je = [z_op1[0] +28 +21 +14, z_op1[1]]
z_j1 = [z_op1[0] +28 +21 , z_op1[1]]
z_j3 = [z_op3[0] +28 +14 , z_op3[1]]
z_j4 = [z_op4[0] +28 +21 , z_op4[1]]
# 描画ポイントを拡張する
z_op1 = [z_op1[0]*2, z_op1[1]*2]
z_op2 = [z_op2[0]*2, z_op2[1]*2]
z_op3 = [z_op3[0]*2, z_op3[1]*2]
z_op4 = [z_op4[0]*2, z_op4[1]*2]
z_je = [z_je[0]*2, z_je[1]*2]
z_j1 = [z_j1[0]*2, z_j1[1]*2]
z_j3 = [z_j3[0]*2, z_j3[1]*2]
z_j4 = [z_j4[0]*2, z_j4[1]*2]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j3, color_line)
bold_line2(z_op4, z_j4, color_line)
bold_line2(z_j1 , z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 2)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 2)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 2)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 2)
# ALG 表示(共通)
zt = alg_textS
LCD.text_scaled(f'ALG: {alg}', zt[0], zt[1], color_text, 2)
if alg != alg_on_stage or (alg == alg_on_stage and (only_down or both)):
# 下半分に描く 描画ポイントの設定
z_op2 = [zl_alg7[0], zl_alg7[1] +22]
# op2 を起点にする
z_op1 = [z_op2[0] +35, z_op2[1] -22]
z_op3 = [z_op2[0] +28 +14, z_op2[1]]
z_op4 = [z_op1[0] , z_op1[1] +22*2]
z_je = [z_op1[0] +28 +21 +14, z_op1[1]]
z_j1 = [z_op1[0] +28 +21 , z_op1[1]]
z_j3 = [z_op3[0] +28 +14 , z_op3[1]]
z_j4 = [z_op4[0] +28 +21 , z_op4[1]]
# 横線を描く
bold_line2(z_op1, z_je, color_line)
bold_line2(z_op2, z_j3, color_line)
bold_line2(z_op4, z_j4, color_line)
bold_line2(z_j1 , z_j4, color_line)
# op 表示
alg_op(' 1 ', z_op1, 1, color_line, color_back, color_text, 1)
alg_op(' 2 ', z_op2, 0, color_line, color_back, color_text, 1)
alg_op(' 3 ', z_op3, 0, color_line, color_back, color_text, 1)
alg_op(' 4 ', z_op4, 0, color_line, color_back, color_text, 1)
# ALG 表示
zt = alg_text7
# 文字枠をLCD.BLURGREENで埋める
LCD.fill_rect(zt[0], zt[1], 24, 32, LCD.BLUEGREEN)
LCD.text('ALG', zt[0], zt[1], color_text)
LCD.text_scaled(f'{alg}', zt[0], zt[1] +10, color_text, 2)
# タブ の四角の枠とタブの名前を表示する
def tab(tab_name, zs, chr_num, color_line, color_back, color_text):
# zs:TAB LABEL 開始座標
# chr_num:TAB LABEL の文字幅
chr_w = 16
chr_h = 16
xb = 2 # line X の太さ(pixel数)
yb = 2 # line Y の太さ(pixel数)
# 大きな四角の内側に小さな四角を描き、差分を枠線として表示する
LCD.fill_rect(zs[0], zs[1], chr_w *chr_num +xb*2, chr_h +yb*2, color_line)
LCD.fill_rect(zs[0] +xb, zs[1] +yb, chr_w *chr_num, chr_h, color_back)
LCD.text_scaled(tab_name,zs[0] +xb, zs[1] +yb, color_text, 2)
# main menu
def dsp_main_menu():
tab_get = [ 6,2]
tab_com = [ 86,2]
tab_op = [166,2]
tab_set = [246,2]
chr_num = 4
color_line = LCD.BLUE
color_back = LCD.GRAY
color_text = LCD.BLACK
tab('get' , tab_get, chr_num, color_line, color_back, color_text)
tab('com' , tab_com, chr_num, color_line, color_back, color_text)
tab('op' , tab_op, chr_num, color_line, color_back, color_text)
tab('set', tab_set,chr_num, color_line, color_back, color_text)
# sub menu
def dsp_sub_menu_op():
tab_ws = [ 6,240]
tab_mul = [ 86,240]
tab_adsr = [166,240]
tab_dam = [246,240]
chr_num = 4
color_line = LCD.BLUE
color_back = LCD.GRAY
color_text = LCD.BLACK
tab('ws' , tab_ws, chr_num, color_line, color_back, color_text)
tab('mul' , tab_mul, chr_num, color_line, color_back, color_text)
tab('adsr', tab_adsr,chr_num, color_line, color_back, color_text)
tab('dam' , tab_dam, chr_num, color_line, color_back, color_text)
if __name__=='__main__':
###########################################################
print('gc.mem_free() = ', gc.mem_free()) # メモリ利用状況
###########################################################
LCD = LCD_3inch5()
LCD.bl_ctrl(100)
# 表示関係の変数の設定 #####################
# TAB 表示位置の設定
tab_get = [ 6,2]
tab_com = [ 86,2]
tab_op = [166,2]
tab_set = [246,2]
tab_ws = [ 6,240]
tab_mul = [ 86,240]
tab_adsr = [166,240]
tab_dam = [246,240]
tab_alg = [ 6,240]
tab_bo_lfo = [ 86,240]
# TAB 文字幅の設定
chr_get = 4
chr_com = 4
chr_op = 4
chr_set = 4
chr_ws = 4
chr_mul = 4
chr_adsr = 4
chr_dam = 4
chr_alg = 4
chr_bo_lfo = 6
# カラー表示テスト
lcd_color_list = [LCD.BLACK, LCD.RED, LCD.GREEN, LCD.BLUE, LCD.YELLOW,\
LCD.PURPLE, LCD.BLUEGREEN, LCD.GRAY, LCD.WHITE]
# 2025/08/20 Test
for n in range(1):
print(f'Color Patturn Test n = {n}')
for i in range(len(lcd_color_list)):
LCD.fill(lcd_color_list[i])
time.sleep_ms(10)
LCD.show()
time.sleep_ms(90)
LCD.fill(LCD.WHITE)
###########################################################
print('gc.mem_free() = ', gc.mem_free()) # メモリ利用状況
###########################################################
# 2025/08/20 WS Test
for n in range(1):
print(f'WS Test n = {n}')
# ws 波形の表示テスト
for ws in range(31):
# 2025/08/22-16:03 Test Add
LCD.fill(LCD.WHITE)
dsp_main_menu()
dsp_sub_menu_op()
# wave_form(ws, LCD.WHITE, LCD.BLACK)
wave_form(ws, LCD.YELLOW, LCD.BLACK)
LCD.show()
time.sleep_ms(10)
###########################################################
# print('gc.mem_free() = ', gc.mem_free()) # メモリ利用状況
###########################################################
time.sleep(1)
# ALG Test Patarn 表示
color_line = LCD.BLACK
color_back = LCD.YELLOW
color_text = LCD.RED
ONLY_DOWN = 0
ONLY_UP = 1
BOTH = 2
for n in range(1000):
print(f'ALG Test n = {n}')
for i in range(8):
LCD.fill(LCD.WHITE)
dsp_main_menu()
dsp_sub_menu_op()
alg = i
alg_on_stage = alg # 拡大して上半分に表示したい alg番号
stage = alg_on_stage *3 + BOTH # 暗号化
alg_patarn(alg, stage, color_line, color_back, color_text)
LCD.show()
time.sleep_ms(10)
###########################################################
# print('gc.mem_free() = ', gc.mem_free()) # メモリ利用状況
###########################################################
time.sleep(1)
print('LCD.rotate = ', LCD.rotate)
X_Point_Old = 0
Y_Point_Old = 0
#調整用ポイントの座標の設定
# TOUCH_ADJ = True
# ROTATE = const(180) にすること
if LCD.rotate == 0 or LCD.rotate == 180: # 縦長表示 の直後
# 調整用ポイントの座標の設定
pos40_40 = [ 40, 40]
pos280_40 = [280, 40]
pos40_440 = [ 40,440]
pos280_440 = [280,440]
#color BRG
LCD.fill(LCD.WHITE)
# 調整用ポイントの座標を 5Pixel x 5Pixel で表示する
LCD.fill_rect(pos40_40[0]-2, pos40_40[1]-2, 5, 5, LCD.RED)
LCD.fill_rect(pos280_40[0]-2, pos280_40[1]-2, 5, 5, LCD.RED)
LCD.fill_rect(pos40_440[0]-2, pos40_440[1]-2, 5, 5, LCD.RED)
LCD.fill_rect(pos280_440[0]-2, pos280_440[1]-2, 5, 5, LCD.RED)
LCD.show()
scope = 10 # 移動平均 Average 個数
X_listT = [None] * scope
Y_listT = [None] * scope
X_listL = [None] * scope
Y_listL = [None] * scope
cnt_scope = 0
# 各ポジションの集計結果を利用可能(10回以上計測)になればセット
flag40_40 = 0
flag280_40 = 0
flag40_440 = 0
flag280_440 = 0
# 測定結果が出たらセット
flag_result = 0
# Touch Point 表示
while True:
get = LCD.touch_get()
if get != None:
# タッチされているなら
if TOUCH_ADJ:
# 調整モードなら、タッチ生データ get[2], get[3] を取得
X_PointL = get[0]
Y_PointL = get[1]
X_PointT = get[2]
Y_PointT = get[3]
else:
# LCD 座標変換データ取得
X_PointL = get[0]
Y_PointL = get[1]
# 移動平均計算用にデータを記録
X_listL[cnt_scope] = X_PointL
Y_listL[cnt_scope] = Y_PointL
X_listT[cnt_scope] = X_PointT
Y_listT[cnt_scope] = Y_PointT
if flag_result == 0:
cnt_scope += 1
if cnt_scope >= scope:
cnt_scope = 0
if flag_result == 0:
flag_result = 1
else:
# 移動平均 10 計算
X_totalL = 0
Y_totalL = 0
X_totalT = 0
Y_totalT = 0
for i in range(scope):
X_totalL += X_listL[i]
Y_totalL += Y_listL[i]
X_totalT += X_listT[i]
Y_totalT += Y_listT[i]
# 移動平均 10
X_aveL = int(X_totalL / scope)
Y_aveL = int(Y_totalL / scope)
X_aveT = int(X_totalT / scope)
Y_aveT = int(Y_totalT / scope)
# 領域別に表示
# 初期状態 中心と思われる 4800 4700 の +400 +400
if X_aveT < 5200 and Y_aveT < 5100:
# pos40_40 の 値を収録
ave40_40 = [X_aveT, Y_aveT]
flag40_40 += 1
if flag40_40 >= 10:
# 文字領域を 白色にしてから表示
LCD.fill_rect(20,80,16*8,80, LCD.WHITE)
LCD.text_scaled(f'XL:{X_aveL}',20, 80,LCD.BLUE, 2)
LCD.text_scaled(f'XT:{X_aveT}',20,100,LCD.BLUE, 2)
LCD.text_scaled(f'YL:{Y_aveL}',20,120,LCD.BLUE, 2)
LCD.text_scaled(f'YT:{Y_aveT}',20,140,LCD.BLUE, 2)
# 初期状態 中心と思われる 7350 4700 の -400 +400
elif X_aveT > 6950 and Y_aveT < 5100:
# pos280_40 の 値を収録
ave280_40 = [X_aveT, Y_aveT]
flag280_40 += 1
if flag280_40 >= 10:
# 文字領域を 白色にしてから表示
LCD.fill_rect(180,80,16*8,80, LCD.WHITE)
LCD.text_scaled(f'XL:{X_aveL}',180, 80,LCD.BLUE, 2)
LCD.text_scaled(f'XT:{X_aveT}',180,100,LCD.BLUE, 2)
LCD.text_scaled(f'YL:{Y_aveL}',180,120,LCD.BLUE, 2)
LCD.text_scaled(f'YT:{Y_aveT}',180,140,LCD.BLUE, 2)
# 初期状態 中心と思われる 4800 7700 の +400 -400
elif X_aveT < 5200 and Y_aveT > 7300:
# pos40_440 の 値を収録
ave40_440 = [X_aveT, Y_aveT]
flag40_440 += 1
if flag40_440 >= 10:
# 文字領域を 白色にしてから表示
LCD.fill_rect(20,340,16*8,80, LCD.WHITE)
LCD.text_scaled(f'XL:{X_aveL}',20,340,LCD.BLUE, 2)
LCD.text_scaled(f'XT:{X_aveT}',20,360,LCD.BLUE, 2)
LCD.text_scaled(f'YL:{Y_aveL}',20,380,LCD.BLUE, 2)
LCD.text_scaled(f'YT:{Y_aveT}',20,400,LCD.BLUE, 2)
# 初期状態 中心と思われる 7350 7700 の -400 -400
elif X_aveT > 6950 and Y_aveT > 7300:
# pos280_440 の 値を収録
ave280_440 = [X_aveT, Y_aveT]
flag280_440 += 1
if flag280_440 >= 10:
# 文字領域を 白色にしてから表示
LCD.fill_rect(180,340,16*8,80, LCD.WHITE)
LCD.text_scaled(f'XL:{X_aveL}',180,340,LCD.BLUE, 2)
LCD.text_scaled(f'XT:{X_aveT}',180,360,LCD.BLUE, 2)
LCD.text_scaled(f'YL:{Y_aveL}',180,380,LCD.BLUE, 2)
LCD.text_scaled(f'YT:{Y_aveT}',180,400,LCD.BLUE, 2)
# 四隅のデータが揃ったら結果を表示する
if flag280_40 >= 10 and flag280_40 >= 10 and flag40_440 >= 10 and flag280_440 >= 10:
LCD.fill_rect(10,200,310,120, LCD.WHITE)
LCD.text_scaled(f'Set def Result Data',10,200,LCD.BLACK, 2)
LCD.text_scaled(f'def touch_get(self):',10,220,LCD.BLACK, 2)
LCD.text_scaled(f'rt40_40 ={ave40_40[0]},{ave40_40[1]}',10,240,LCD.BLACK, 2)
LCD.text_scaled(f'rt280_40 ={ave280_40[0]},{ave280_40[1]}',10,260,LCD.BLACK, 2)
LCD.text_scaled(f'rt40_440 ={ave40_440[0]},{ave40_440[1]}',10,280,LCD.BLACK, 2)
LCD.text_scaled(f'rt280_440={ave280_440[0]},{ave280_440[1]}',10,300,LCD.BLACK, 2)
LCD.show()
else:
cnt_scope = 0
flag_result = 0
time.sleep_ms(50)
# 初期のプログラムを残し、ポイントの軌跡を残す
else: # LCD.rotate == 90 or LCD.rotate == 270 : 横長表示
#color BRG
LCD.fill(LCD.WHITE)
LCD.fill_rect(140,5,200,30,LCD.RED)
# LCD.text("Raspberry Pi Pico",170,17,LCD.WHITE)
# 黄文字表示
LCD.text("Raspberry Pi Pico",170,17,LCD.YELLOW)
LCD.text("3.5' IPS LCD TEST",170,47,LCD.BLACK)
display_color = 0x001F
for i in range(len("Raspberry Pi Pico")):
LCD.fill_rect(i*16+108,70,14,20,(display_color))
display_color = display_color << 1
# 2025/06/29:Add 2倍の拡大文字を表示
LCD.text_scaled("Raspberry Pi Pico",108,72,LCD.BLUEGREEN, 2)
# 右下 隅 のセルを赤色にする
LCD.fill_rect(59 *8, 19 *8, 8, 8, LCD.RED)
LCD.fill_rect(59 *8, 39 *8, 8, 8, LCD.RED)
display_color = 0x001F
for i in range(0,12):
# LCD.fill_rect(i*30+60,100,30,50,(display_color))
LCD.fill_rect(i*30+60,120,30,50,(display_color))
display_color = display_color << 1
LCD.show()
# Touch Point 表示
while True:
get = LCD.touch_get()
if get != None:
# 8bits 単位のセルに変換
X_Point = int(get[0] /8)
Y_Point = int(get[1] /8)
if X_Point_Old != X_Point or Y_Point_Old != Y_Point:
# 前回と異なるセルならば
# 前回のセルを黄色にする
if Y_Point_Old < 40:
# LCD.show_up エリアならば
LCD.fill_rect(X_Point_Old *8, Y_Point_Old *8, 8, 8, LCD.YELLOW)
LCD.show()
# 今回のセルを赤色にする
if Y_Point < 40:
# LCD.show_up エリアならば
LCD.fill_rect(X_Point *8, Y_Point *8, 8, 8, LCD.RED)
LCD.show()
# Old Pointer 更新
X_Point_Old = X_Point
Y_Point_Old = Y_Point
time.sleep_ms(100)
ご参考
オシロスコープで、SPI SCK と MOSI 信号を観測しました。
Rapberry Pi Pic2 の波形です。
CIMG8997.JPG
Pimoroni Pico Plus 2 の波形です。
-
どちらも、SPI を 40MHz で動作させた時の信号です。上側の波形はSCK、下側の波形は MOSI です。目立った違いは見当たりません。
-
可能性として、Pimoroni Pico Plus 2 の PSRAMの転送速度、または、SPIのデータ処理速度に問題があるようです。
-
まま、20MHzで確実に動作すれば、描画速度は落ちるものの大きなプログラムは作れる可能性が見えてきました。
-
本投稿は、これにて終了。
-
最後までご覧いただきありがとうございました。
投稿者の人気記事
-
Hyodot
さんが
2025/09/03
に
編集
をしました。
(メッセージ: 初版)
-
Hyodot
さんが
2025/09/04
に
編集
をしました。
-
Hyodot
さんが
2025/09/04
に
編集
をしました。
-
Hyodot
さんが
2025/09/04
に
編集
をしました。
-
Hyodot
さんが
2025/09/04
に
編集
をしました。
-
Hyodot
さんが
2025/09/05
に
編集
をしました。
ログインしてコメントを投稿する