x 原因は、わからないが液晶がちらつく場合は、ウェートを調整してね!!
x 74hc164を使用
目的
液晶のテスト
-88
-306
-305
-240
-315
-314
-199
リンクもみてね
Arduino UNOと液晶、ACM1602K-NLW-BBW(SC1602互換?)でHello Worldを表示
-o_con297.jpg- イメージ いろいろ間違っているが指摘しないように
-o_con298.jpg- イメージ いろいろ間違っているが指摘しないように
Arduino ファイル分割 で検索するといろいろ出てくる
引用
プログラム
//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のプログラム
//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;