STM32C011で液晶温度計を作って遊ぶ。(MCP9701)(PA13)(PA14)(ターゲットリセット)


x MCP9701-E/TO 販売コード 103199

参考

↓ここをクリック↓

http://100year.cocolog-nifty.com/blog/2010/04/arduinolcd3-0bb.html


x 過去ログを見よ
x 「Arduino」関連を見てください

x 自己責任の意味がわかる人がお読みください。
x 間違った操作を行うと二度と書き込めなくなります。
x なぜか知らないが、表示速度を速くするとジャムるので各自で調整してくざさい。
x 74HC164を使いピン数を減らしています。
x ターゲットリセットを接続してください。
x 非常用として「3秒ルール」があり、起動後、3秒以内に接続してください。

接続

1
2 VCC
3 GND
4 ターゲットリセット

8 液晶 CLK (SWCLK)
7 液晶 DATA (SWDIO)
6 液晶 EN
5 ADC MCP9701

基板パターン ACM1602K-NLW-BBW

o_con88.jpg

![o_con88.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/dc17291d-7d93-439c-ff28-58e09ed1372d.jpeg)



結果


![o_cop919.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/977e98e0-204a-376e-c4e1-b5d32c6a06a3.jpeg)



プログラム

```c++


//GPIO_LCD_MCP9701_XXC_C011_1

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


//*          *****  *****  
//*         *       *    * 
//*         *       *    *
//*         *       *    *
//*         *       *    *
//********   *****  *****


//定義
#define DW   digitalWrite

//STM32G031J6M6 i2cピンの定義
//#define sdaPin PA12    // ArduinoA4
//#define sclPin PA11    // ArduinoA5

//#define S5851A 0x48

#define swdclk   PA14 // 8pin
#define swdio    PA13 // 7pin
//#define swdclk   PA11 // 5pin
//#define swdio    PA12 // 6pin
//#define swdclk   PA12 // 6pin
//#define swdio    PA11 // 5pin
//#define t_led1   PA12 // 6pin
//#define t_led2   PA11 // 5pin
//#define en       PA0  // 4pin
//#define in7      PB7  // 1pin
//#define en      PB7  // 1pin
#define en      PA12  // 6pin

// tx PA14(PB6) 8PIN
// rx PC14(PB7) 1PIN

//シフトパターン
//              12345678   12345678   12345678   12345678
char b8[8] = {0b10000000,0b01000000,0b00100000,0b00010000,
              0b00001000,0b00000100,0b00000010,0b00000001 };

//液晶の初期化配列
int lcd_int[]={
  0x30,0x30,0x30,0x38,0x08,0x01,0x06,0x08+0x04
};//lcd_init

//温度の定義
char ss[] =  {
  "#9#9#9#8#7#7#6#5#5#4#3#3"
  "#2#1#1#0-9-9-8-7-7-6-5-5"
  "-4-3-3-2-2-1-1 0 1 1 2 2"
  " 3 4 4 5 6 6 7 8 8 91010"
  "111212131414151616171818"
  "192020212222232424252626"
  "272828293030313232333434"
  "353636373838394040414242"
  "434444454546474748494950"
  "50#0#0#0#0#0#0#0#0#0#0#0"
  "#0#0#0#0#0#0#0#0"
};

//液晶に一文字を表示する。
void seg1(int v,int rs)
{
    //一文字分のデータをセット
    for(int jj=0;jj<8;jj++){
        if( (v & b8[jj]) == 0 ){
                DW(swdio,0); //ビットが0
        } else {
                DW(swdio,1); //ビットが1
        }//endif
        DW(swdclk,1);
        DW(swdclk,0);
    }//for
    
    DW(swdio,rs);   //コマンド/データ
    DW(en,1); delay(1);  //イネーブルオン
    DW(en,0);       //イネーブルオフ
}//seg1


//文字列の表示 nana_seg
int ns_printf(char *str1) {

    //文字の中身がゼロか
    while(*str1){

        //一文字出力
        seg1( *str1 ++ , 1  );

    } //while

    //戻り値
    return(0);
}//ns_printf


//初期化
void setup() {

  delay(3000); //not Delete (絶対消すな)(消しちゃィゃーん)

  //GPIO初期化
  pinMode(swdclk,OUTPUT);
  pinMode(swdio,OUTPUT);
  pinMode(en,OUTPUT);
  DW(en,0);

  //液晶の初期化
  for(int ii=0;ii<8;ii++){ 
    seg1( lcd_int[ii] , 0);delay(2);
  }//for

  //スタートアップ表示
  seg1( 0x80+0x00 , 0  ); //1ライン目にカーソルを移動
  ns_printf( "START" ); delay(500);
  seg1(   0x01  , 0  ); delay(5); //画面クリア

} //setup


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

  //アナログ値の読み込み
  int s = analogRead(PA8);   // PIN5

  //s=250;

  //温度の表示

  seg1( 0x80+0x00 , 0  ); //1ライン目にカーソルを移動
  seg1( (char)ss[((s>>2)&0x7f)*2]   ,1 ); //10の桁
  seg1( (char)ss[((s>>2)&0x7f)*2+1] ,1 ); // 1の桁

  //1秒の待ち
  delay(1000);
    
} //loop


```