Hyodotのアイコン画像
Hyodot 2025年09月03日作成 (2025年09月05日更新)
製作品 製作品 閲覧数 369
Hyodot 2025年09月03日作成 (2025年09月05日更新) 製作品 製作品 閲覧数 369

シンセサイザーのADSR入力方法(実験)

外観:
実験の様子

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
Rapberry Pi Pic2 の場合

Pimoroni Pico Plus 2 の波形です。

CIMG9002.JPG
Pimoroni Pico Plus 2 の場合

  • どちらも、SPI を 40MHz で動作させた時の信号です。上側の波形はSCK、下側の波形は MOSI です。目立った違いは見当たりません。

  • 可能性として、Pimoroni Pico Plus 2 の PSRAMの転送速度、または、SPIのデータ処理速度に問題があるようです。

  • まま、20MHzで確実に動作すれば、描画速度は落ちるものの大きなプログラムは作れる可能性が見えてきました。

  • 本投稿は、これにて終了。

  • 最後までご覧いただきありがとうございました。

Hyodotのアイコン画像
真空管アンプ、トランジスタ回路、IC(SN74xx)、Z80。 その後、24時間戦えますかモード?に突入、電子工作から途絶。 定年で戦いを終え、電子工作を再開、浦島太郎。 PIC、IchigoJam、Arduino、RaspberryPi、micro:bit、 今は、Pico Pythonで遊んでいます。 アセンブラーもやるアラ・セブン。 ・・・アラセブン 脳トレ成果を 置き土産・・・
ログインしてコメントを投稿する