' ' ********************************************* ' * 2.8インチ 65KフルカラーLCD * ' * 横320 x 縦240 ドット [ILI9341] SPI * ' * タッチ・スクリーン (XPT2046) テスト * ' * O-Family 2019. 9.26 * ' ********************************************* ' $regfile = "m88pdef.dat" '使用するAVRを設定。(ATmega88P) Config Clockdiv = 1 'AVRの動作クロックを8MHzに変更する。 $crystal = 8000000 'AVRクロックを設定。 $hwstack = 64 'ハードウェア・スタックの容量を設定。 $swstack = 10 'ソフトウェア・スタックの容量を設定。 $framesize = 24 'フレーム領域の容量を設定。 ' ' * G-LCDの初期設定 * ' Const Portrait = 1 'LCDの画面設置方向(90度回転)。 (0:横置き[X=320,Y=240] , 1:縦置き[X=240,Y=320]) Const Rotate_180 = 0 'LCDの画面設置方向(180度回転)。(0:コネクターが上側 , 1:コネクターが下側) Dim Offset256 As Byte 'LCDアドレスのオフセットフラグ。(0:0-255 , 1:256-319) $lib "glcd-ILI9341_2R8_240x320.lib" 'ILI9341の2.8インチ240x320版ライブラリを組み込む。 ' LCDの接続ポートを指定する。 Cs1 = [CS] , Rst = [RESET] , A0 = [DC] , Si = [SDI] , Sclk = [SCK] Config Graphlcd = Color , Cs1 = Portd.3 , Rst = Portd.4 , A0 = Portd.5 , Si = Portd.6 , Sclk = Portd.7 '[Cs1]と[Rst]はオプション。 Initlcd 'ILI9341を初期化する。 Cls 'G-LCDの全画面を消去する。 ' ' * 色の名前を定義する * [RRRG_GGBB] = [R2,R1,R0,G2_G1,G0,B1,B0] ' Const Black = &B0000_0000 Const Red = &B1110_0000 Const Green = &B0001_1100 Const Blue = &B0000_0011 Const Magenta = &B1110_0011 Const Yellow = &B1111_1100 Const Cyan = &B0001_1111 Const White = &B1111_1111 ' Const Orange = &B1111_0100 Const Brightgreen = &B0011_1110 Const Brightblue = &B0001_1111 Const Darkred = &B1100_0000 Const Darkgreen = &B0001_0100 Const Darkblue = &B0000_0010 '-------------------------------------------------------------------------------------------------- ' ' * タッチ・スクリーン・コントローラの設定 * ' (XPT2046 , ADS7846 , TSC2046 , AK4182A) ' Touch_clk Alias Portd.7 'XPT2046 [Touch_CLK]接続ポート。 Touch_cs Alias Portd.2 'XPT2046 [Touch_CS]接続ポート。 Touch_din Alias Portd.6 'XPT2046 [Touch_DIN]接続ポート。 Touch_do Alias Pind.1 'XPT2046 [Touch_DO]接続ポート。 Touch_irq Alias Pind.0 'XPT2046 [Touch_IRQ]接続ポート。 ' Config Touch_clk = Output 'XPT2046 [Touch_CLK]の接続ポートを出力に設定する。 Config Touch_cs = Output 'XPT2046 [Touch_CS]の接続ポートを出力に設定する。 Set Touch_cs 'XPT2046 [Touch_CS]を[H]にする。 Config Touch_din = Output 'XPT2046 [Touch_DIN]の接続ポートを出力に設定する。 Config Touch_do = Input 'XPT2046 [Touch_DO]の接続ポートを入力に設定する。 Config Touch_irq = Input 'XPT2046 [Touch_IRQ]の接続ポートを入力に設定する。 ' Dim Touchx As Word 'タッチ・スクリーンの[X]データ。 Dim Touchy As Word 'タッチ・スクリーンの[Y]データ。 Dim Touchflag As Byte 'タッチ・スクリーンの検出フラグ。 Dim Temptclk As Byte '[Touch_CLK]ポートの状態保管用。 Dim X_command As Byte , Y_command As Byte : X_command = &B1101_0000 : Y_command = &B1001_0000 'XPT2046のA/D測定開始コマンド。 ' Temptclk = Touch_clk '[Touch_CLK]ポートの状態を保管する。 Reset Touch_cs 'XPT2046の[Touch_CS]を[L]にする。 Shiftout Touch_din , Touch_clk , X_command , 1 'タッチ・コントローラの設定コマンドを送信する。 Set Touch_cs 'XPT2046の[Touch_CS]を[H]にする。 Touch_clk = Temptclk '[Touch_CLK]ポートの状態を戻す。 ' Dim Touchxmin As Word : Touchxmin = 300 '[X]の最小規定値。(タッチ・スクリーンの個体差により調整が必要) Dim Touchxmax As Word : Touchxmax = 3800 '[X]の最大規定値。(タッチ・スクリーンの個体差により調整が必要) Dim Touchymin As Word : Touchymin = 400 '[Y]の最小規定値。(タッチ・スクリーンの個体差により調整が必要) Dim Touchymax As Word : Touchymax = 3900 '[Y]の最大規定値。(タッチ・スクリーンの個体差により調整が必要) '-------------------------------------------------------------------------------------------------- ' ' **************** ' * 描画のテスト * ' **************** ' Dim Coefficientx As Word , Coefficienty As Word '[X]と[Y]の画面位置係数。 Dim Temp1 As Byte '汎用テンポラリ変数 Byte型 No.1 Dim Temp2 As Byte '汎用テンポラリ変数 Byte型 No.2 Dim Tempw1 As Word '汎用テンポラリ変数 Word型 No.1 Dim Tempw2 As Word '汎用テンポラリ変数 Word型 No.2 Dim Tempdw1 As Dword '汎用テンポラリ変数 Dword型 No.1 Dim Tempstr As String * 10 '汎用テンポラリ変数 String型 ' ' Main: Tempw1 = Touchxmax - Touchxmin '[X]のA/D値範囲を計算する。 Tempdw1 = 2400000 / Tempw1 '[X](240dot * 10000) / [X]のA/D値範囲 Coefficientx = Tempdw1 '[X]の画面位置係数を求める。 Tempw1 = Touchymax - Touchymin '[Y]のA/D値範囲を計算する。 Tempdw1 = 3200000 / Tempw1 '[Y](320dot * 10000) / [Y]のA/D値範囲 Coefficienty = Tempdw1 '[Y]の画面位置係数を求める。 ' Cls 'G-LCDの全画面を消去する。 Setfont Color8x8 'フォントを選択する。 Offset256 = 0 'LCDアドレスのオフセット値。(0: 0-255) Box(0 , 0) -(239 , 255) , White '表示エリアの枠。 Offset256 = 1 'LCDアドレスのオフセット値。(1: 256-319) Box(0 , 256) -(239 , 319) , Red '表示エリアの枠。 Offset256 = 0 'LCDアドレスのオフセット値。(0: 0-255) Boxfill(229 , 0) -(239 , 10) , Yellow '消去エリアの枠。 ' Mainloop: Gosub Touchget 'タッチ・スクリーン・コントローラの読み取り。 If Touchflag <> 0 Then 'If 画面へのタッチがあったか? Then Touchflag = 0 ' Tempstr = Str(touchx) '[X]のA/D座標値を表示する。 Lcdat 100 , 90 , "X: " ; Format(tempstr , " 0") , White , Blue Tempstr = Str(touchy) '[Y]のA/D座標値を表示する。 Lcdat 120 , 90 , "Y: " ; Format(tempstr , " 0") , White , Blue ' Tempw1 = Touchx - Touchxmin '[X]のA/D値と係数から[X]の画面座標を計算する。 Tempdw1 = Coefficientx * Tempw1 Tempdw1 = Tempdw1 / 10000 Temp1 = Tempdw1 Temp1 = 239 - Temp1 '[X]軸はアドレスの左右が逆のため補正。 ' Tempw2 = Touchy - Touchymin '[Y]のA/D値と係数から[Y]の画面座標を計算する。 Tempdw1 = Coefficienty * Tempw2 Tempdw1 = Tempdw1 / 10000 Tempw2 = Tempdw1 Temp2 = Tempw2 ' If Temp1 > 229 And Tempw2 < 10 Then Goto Main 'If 画面消去エリアか? Then If Tempw2 < 256 Then 'If [Y]座標が255以内か? Then Offset256 = 0 Else '[Y]座標が255を超えた場合。 Offset256 = 1 End If If Temp1 > 238 Then 'If [X]の円描画が画面を超えるか? Then Temp1 = 238 End If Circle(temp1 , Temp2) , 2 , Green 'タッチされた位置に円を描画する。 Offset256 = 0 ' ' Waitms 1 '連続描画の待ち時間。 End If Goto Mainloop '-------------------------------------------------------------------------------------------------- ' ' ********************************************************** ' * タッチ・スクリーン・コントローラの読み取りサブルーチン * (Touchx = [X]のA/D値 , Touchy = [Y]のA/D値) ' * (XPT2046 , ADS7846 , TSC2046 , AK4182A) * (Touchflag = タッチの検出フラグ, 1:検出あり) ' ********************************************************** ' Dim Touch_mean As Byte , Touchx_sum As Word , Touchy_sum As Word Touchget: If Touch_irq = 0 Then 'If 画面へのタッチがあったか[Touch_IRQ]=[L] ? Then Temptclk = Touch_clk '[Touch_CLK]ポートの状態を保管する。 ' Touchx_sum = 0 '平均の合計を初期化する。 Touchy_sum = 0 ' For Touch_mean = 1 To 16 'タッチ・スクリーンのA/D値を16回サンプルする。 Waitus 30 'A/D値の安定待ち時間。 Reset Touch_clk '[Touch_CLK]を[L]にする。 Reset Touch_din '[Touch_DIN]を[L]にする。 Reset Touch_cs '[Touch_CS]を[L]にする。 ' Shiftout Touch_din , Touch_clk , X_command , 1 , 8 , 2 '[X]のA/D開始コマンドを送信する。 Reset Touch_din '[Touch_DIN]を[L]にする。 Set Touch_clk '[Touch_CLK]を[H]にする。 Waitus 2 '9クロック目のパルスを作る。 Reset Touch_clk '[Touch_CLK]を[L]にする。 Waitus 2 ' Shiftin Touch_do , Touch_clk , Touchx , 1 , 12 , 2 '[X]のA/Dデータを受信する。 Shift Touchx , Right , 4 '右詰の12bitにする。 ' Shiftout Touch_din , Touch_clk , Y_command , 1 , 8 , 2 '[Y]のA/D開始コマンドを送信する。 Reset Touch_din '[Touch_DIN]を[L]にする。 Set Touch_clk '[Touch_CLK]を[H]にする。 Waitus 2 '9クロック目のパルスを作る。 Reset Touch_clk '[Touch_CLK]を[L]にする。 Waitus 2 ' Shiftin Touch_do , Touch_clk , Touchy , 1 , 12 , 2 '[Y]のA/Dデータを受信する。 Shift Touchy , Right , 4 '右詰の12bitにする。 ' Set Touch_cs '[Touch_CS]を[H]にする。 ' Touchx_sum = Touchx_sum + Touchx '平均用の合計を加算する。 Touchy_sum = Touchy_sum + Touchy Next Touch_mean Touch_clk = Temptclk '[Touch_CLK]ポートの状態を戻す。 ' Shift Touchx_sum , Right , 4 '[X]値の平均を取る。 Touchx = Touchx_sum Shift Touchy_sum , Right , 4 '[Y]値の平均を取る。 Touchy = Touchy_sum ' If Touchx > Touchxmin Then 'If [X]値が最小規定値より大きいか? Then If Touchx < Touchxmax Then 'If [X]値が最大規定値より小さいか? Then If Touchy > Touchymin Then 'If [Y]値が最小規定値より大きいか? Then If Touchy < Touchymax Then 'If [Y]値が最大規定値より小さいか? Then Touchflag = 1 'タッチ・スクリーンの検出フラグを立てる。 End If End If End If End If End If Return End '-------------------------------------------------------------------------------------------------- ' ' * フォント データ * ' $include "color8x8.font"