1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

1ピン入力、十字キーで遊ぶ。(最終章) (実装編) STM32C0116-DK

Last updated at Posted at 2025-08-17

いろいろ注意

  • 過去ログに注意!!!
  • インクルドファイルがわかる人

目的

十字キーから値を読み込んでシリアルポートに出力する

結果

Screenshot from 2025-08-18 06-17-45.png

イメージ

Screenshot from 2025-08-18 06-21-20.png

回路(各自、元の回路図を確認)

o_coq942.jpg

o_coq944.jpg

プログラム




//INPUT_KEY_C0116_1


//インクルド
#include <Arduino.h>
#include "INPUT_KEY.h"


//初期化
void setup() {

  //シリアルポートの初期化
  Serial.begin(9600);  // シリアル通信の速度を9600bpsにする。

  //ADCの初期化(3.3Vを4096に分解)
  analogReadResolution(12);  //センサーの分解度4096

}//setup


//メインループ
void loop() {

  // ボタンの信号の読み込み
  int a = input_key();

  // ボタンの状態表示
  Serial.println(a);

  // 速すぎるからウェート
  delay(1000);  // 0.3秒待つ

}//loop



INPUT_KEY.cpp




//INPUT_KEY.cpp


//インクルド
#include <Arduino.h>
#include "INPUT_KEY.h"


//定義 デバッグ
//char *key_num_s[] = {"NO_KEY","RIGHT","UP","DOWN","LEFT","SELECT"};


//inupt(入力)mV 比較ルーチン
int i_key(int Voltage)
{

  //output キー番号

  Voltage = Voltage / 100;

  if ( Voltage < SELECT_t_LEFT ) { //3
    return (N_SELECT);//戻り値(5)
  } else if  ( Voltage < LEFT_t_DOWN ) { //3-10
    return (N_LEFT);//戻り値(4)
  } else if ( Voltage < DOWN_t_UP ) { //10-16
    return (N_DOWN);//戻り値(3)
  } else if ( Voltage < UP_t_RIGHT  ) { //16-23
    return (N_UP);//戻り値(2)
  } else if ( Voltage < RIGHT_t_NO_KEY ) { //23-30
    return (N_RIGHT);//戻り値(1)
  } else { //30-
    return (N_NO_KEY);//戻り値(0)
  }//end if

}//i_key


//押されるまで待ってキー番号を返す
int input_key(void) {

  int sensorValue; //センサーの値(十字キー)
  int Voltage; //(電圧)
  int key_num_in1; //キー番号 比較用1
  int key_num_in2; //キー番号 比較用2
  int key_num = 0; //キー番号 戻り値
  while (key_num == 0) {
    sensorValue = analogRead(A8);  //十字キーから値を読み込む
    Voltage = (sensorValue * 3300) >> 12;  //十字キーの値から電圧に変換
    key_num_in1 = i_key(Voltage); //電圧からキー番号に変換
    //key_num_in1 = 3; //デバッグ
    if (key_num_in1 != 0) { //キー番号が0以外
      delay(3);  // 3m秒待つ
      sensorValue = analogRead(A8);  //十字キーから値を読み込む
      Voltage = (sensorValue * 3300) >> 12;  //十字キーの値から電圧に変換
      key_num_in2 = i_key(Voltage); //電圧からキー番号に変換
      //key_num_in2 = 3;  //デバッグ
      if (key_num_in1 == key_num_in2) { //キー番号が同じ時
        key_num = key_num_in2;
      }//endif
    }//endif
    //if (key_num == 0) {key_num = 9;}//debug
  }//while

  //printf("key_num = [%d]\n",key_num); //debug
  return (key_num); //キー番号を返す

}//input_key



INPUT_KEY.h



//INPUT_KEY.h

#define N_SELECT 5
#define N_LEFT   4
#define N_DOWN   3
#define N_UP     2
#define N_RIGHT  1
#define N_NO_KEY 0

#define P_SELECT ((((int)(0.0*100))+5)/10)
#define P_LEFT   ((((int)(0.67*100))+5)/10)
#define P_DOWN   ((((int)(1.32*100))+5)/10)
#define P_UP     ((((int)(2.01*100))+5)/10)
#define P_RIGHT  ((((int)(2.65*100))+5)/10)
#define P_NO_KEY ((((int)(3.3*100))+5)/10)

#define SELECT_t_LEFT  ((P_SELECT+P_LEFT)/2)
#define LEFT_t_DOWN    ((P_LEFT+P_DOWN)/2)
#define DOWN_t_UP      ((P_DOWN+P_UP)/2)
#define UP_t_RIGHT     ((P_UP+P_RIGHT)/2)
#define RIGHT_t_NO_KEY ((P_RIGHT+P_NO_KEY)/2)


//プロトタイプ宣言
int i_key(int Voltage); //キーの比較
int input_key(void);    //押されるまで待ってキー番号を返す



1
0
0

Register as a new user and use Qiita more conveniently

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?