ArduinoUnoと液晶、ACM1602K-NLW-BBWで表示 (ライブラリー化)



x 原因は、わからないが液晶がちらつく場合は、ウェートを調整してね!!

x 74hc164を使用

目的
液晶のテスト

-88

![o_con88.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d5cccdd0-d767-f80d-866c-855567d2ab3f.jpeg)


-306

![o_con306.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/da2953a3-c1b0-e2fc-b53d-cea29a60650e.jpeg)


-305

![o_con305.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/38e9ce26-9931-0459-cc2a-bb02a20990af.jpeg)


-240

![o_con240.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/3cdb7ce4-bfa5-8025-c8ca-352a672965db.jpeg)

-315

![o_con313.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/8da21ea8-ad20-86ef-7c63-628648823ab1.jpeg)

-314


![o_con314.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/81d34ce0-0cc2-7b03-9986-5c86e19da977.jpeg)


-199

![o_con199.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/24de7187-fc34-2ef6-4009-bb8f596e0e0b.jpeg)




リンクもみてね


Arduino UNOと液晶、ACM1602K-NLW-BBW(SC1602互換?)でHello Worldを表示



https://qiita.com/caa45040/items/974d5145a3357783f962





-o_con297.jpg- イメージ　いろいろ間違っているが指摘しないように


![o_con297.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/b31e53be-bf1a-7f16-1822-8fb381ed5b40.jpeg)



-o_con298.jpg-　イメージ　いろいろ間違っているが指摘しないように


![o_con298.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/73e6d374-f588-f46e-ec58-24662667107e.jpeg)





Arduino ファイル分割　で検索するといろいろ出てくる


引用


https://bellitblog.net/2021/01/07/arduino-file-create/







プログラム



```c++


//LCD_NS_UNO_1

#include <Arduino.h>

#include "LCD_UNO_1.h"


//初期化
void setup()
{

  lcd.begin(16, 2);

  lcd.clear();

} //setup


//カウンター
unsigned char LL = 0;


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

  //lcd.clear();

  //文字列の表示
  lcd.setCursor(0, 0);
  lcd.print("HELLO WORLD");

  //値の表示
  lcd.setCursor(0, 1);
  lcd.print(  (int)(LL++)  );

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

} //loop




```



LCD_UNO_1.hのプログラム




```c++



//LCD_UNO_1.h


#define DW digitalWrite

#define swdclk 4 // 4pin
#define swdio  3 // 3pin
#define en     2 // 2pin


//液晶に一文字送信する
void seg1(int v, int rs)
{
  for (int jj = 0; jj < 8; jj++) {
    if ( (v << jj) & 0x80 ) {
      DW(swdio, 1); //ビットが1
    } else {
      DW(swdio, 0); //ビットが0
    }//endif
    DW(swdclk, 1);
    DW(swdclk, 0);
  }//for
  DW(swdio, rs);
  DW(en, 1); delay(30);
  DW(en, 0); delay(30);
}//seg1


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


//LCD初期化関数
void lcd_int1()
{
  //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ライン目にカーソルを移動

  //debug
  char *str1 = "ON LCD ";
  while ( *str1 != 0 ) {
    seg1( *str1 , 1  );
    str1++;
  }
  delay(500);

  //画面クリア
  //seg1(   0x01  , 0  );
  //delay(5);
}//lcd_int1


//クラスの定義
struct _lcd {
  void begin(int col, int rows);     //メソッドの宣言
  void clear();                      //メソッドの宣言
  void setCursor(int col, int rows); //メソッドの宣言
  int  write(char ch);               //メソッドの宣言
  int  print(char *str1);            //メソッドの宣言
  int  print(int num);               //メソッドの宣言 オーバーロード
};


//ポートをhiにする 初期化
//メソッドの定義
void _lcd::begin(int col, int rows)
{
  lcd_int1();
  //delay(3000);
}//begin


//ポートをhiにする 初期化
//メソッドの定義
void _lcd::clear()
{
  //画面クリア
  seg1(   0x01  , 0  );
  delay(500);
}//clear


//ポートをhiにする 初期化
//メソッドの定義
void _lcd::setCursor(int col, int rows)
{
  int vram = (rows * 0x40) + col;

  seg1( 0x80 + vram , 0  ); //1ライン目にカーソルを移動
  delay(1);
}//setCursor


//液晶への一文字出力
//メソッドの定義
int _lcd::write(char ch)
{
  seg1(ch, 1);

  return (0);
}//write


//文字列の表示
//メソッドの定義
int _lcd::print(char *str1)
{
  //文字の中身がゼロか
  while (*str1) {

    //一文字出力
    write(*str1 ++);

  } //while

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


//文字列の表示 オーバーロード
//メソッドの定義
int _lcd::print(int num)
{
  String thisString9 = String( num );
  char *str1 = (char *)thisString9.c_str();

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

    //一文字出力
    write(*str1 ++);

  } //while

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


//実体の作成
_lcd lcd;




```