質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

2587閲覧

lcdに文字列が表示されない

alf

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2022/01/21 10:55

編集2022/01/21 18:06

*lcdは16×2のものです
エラーはないのですが,lcdが光っているだけで文字が表示されません.
文字の先頭の位置を上手く引き渡せていないのでしょうか?
初めてポインタというものやlcdを使うのできちんと理解できていません.
lcdに表示できる仕組みだけでも教えてほしいです.お願いいたします.
*/

int rs=4;
int e=6;
int d7=13;
int d6=12;
int d5=11;
int d4=10;
//4ビットの書き込み
void lcd_write4(int str,int rs_2){
if(rs_2==0){
//コマンドの入力
digitalWrite(rs,0);
}else{
//データの入力
digitalWrite(rs,1);
}
//上位4ビットに書き込む
digitalWrite(e,1);
digitalWrite(d7,(str>>7)&0x01);//x
digitalWrite(d6,(str>>6)&0x01);//x
digitalWrite(d5,(str>>5)&0x01); //e
digitalWrite(d4,(str>>4)&0x01); //rs
delay(5);
digitalWrite(e,0);
delay(5);
//下位4ビットに書きこむ
digitalWrite(e,1);
digitalWrite(d7,(str>>3)&0x01); //d7
digitalWrite(d6,(str>>2)&0x01); //d6
digitalWrite(d5,(str>>1)&0x01); //d5
digitalWrite(d4,str&0x01);//d4
delay(5);
digitalWrite(e,0);
delay(5);
}

/そのまま/
int str_e;
int str_rs;
int str_d7;
int str_d6;
int str_d5;
int str_d4;
//8ビットの書き込み
void lcd_write8(int str){
//enableを1にする
digitalWrite(e,1);
digitalWrite(e,(str>>5)&0x01);
digitalWrite(rs,(str>>4)&0x01);
digitalWrite(d7,(str>>3)&0x01);
digitalWrite(d6,(str>>2)&0x01);
digitalWrite(d5,(str>>1)&0x01);
digitalWrite(d4,str&0x01);
delay(50);
digitalWrite(e,0);
delay(50);
}
//lcdの初期化
void lcd_init(){
//ポート設定
pinMode(e,OUTPUT);
pinMode(rs,OUTPUT);
pinMode(d7,OUTPUT);
pinMode(d6,OUTPUT);
pinMode(d5,OUTPUT);
pinMode(d4,OUTPUT);

delay(50);

digitalWrite(rs,LOW);
lcd_write8(0x23);

digitalWrite(rs,LOW);
lcd_write8(0x23);

digitalWrite(rs,LOW);
lcd_write8(0x23);

digitalWrite(rs,LOW);
lcd_write8(0x22);

lcd_write4(0x28,0);
lcd_write4(0x0E,0);
lcd_write4(0x06,0);
}

//lcdのカーソル
void lcd_locate(int x,int y){
//rsが0になる必要があるため
lcd_write4(0x80+x+y*0x40,0);
}

//main
int main(void){
char a1[]="hello";
char a2[]="world";
lcd_init();
lcd_locate(0,0);
lcd_prints(a1);
lcd_locate(1,0);
lcd_prints(a2);
/* //lcdに文字列出力上
lcd_locate(0,0);
lcd_prints("hello");
//lcdに文字列出力下
lcd_locate(1,0);
lcd_prints("world");*/
while(1){
;
}
delay(50);
return 0;
}
//lcdの表示(文字)
void lcd_print(char c){
rs=1;
delay(1);

lcd_write4(c,rs);
}
//lcdの表示(文字列)
void lcd_prints(char *x){
while(*x != 0x00){
//rsをHIGHにするための1
lcd_print(*x);
x++;
}
}
void setup( ) {
//lcdの初期化
lcd_init();
}
void loop() {
//lcdの初期化
lcd_init();
lcd_locate(0,0);
lcd_prints(" ");
lcd_locate(1,0);
lcd_prints(" ");
while(1){
;
}
}
イメージ説明/

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

まず、Arduinoの言語仕様を理解した方が良いです。

通常、Arduinoではsetup関数とloop関数を書いて、main関数を書きません。
→他でmain関数が用意されていてそれを使います。

自分でmain関数を書く方法もあります。
それは、裏でArduino的な何かが動いて欲しくない時に用います。
裏で動いていないので、delayとかmillisとかは使えません。
そして、その場合はsetup関数やloop関数も単なる関数となるので、それらを書いてもmain関数からの流れで使わなければ何もしません。

※今回はmain関数は使わない、通常の書き方が適切です。
その場合、main関数のwhile(1) より前の部分をsetup関数に移動させれば良いです。

次に、回路ですけど、書いてあるピン位置と添付図の位置が全然違います。
まずはそこから始めないと、本格的なLCDのスケッチ部に取り掛かれません。

で、ここからがLCD操作の方になりますけど、ちょっとチェックしてみたら・・・
こちらも間違いが満載です。
どうしたものか・・・

まぁ取りあえず、回路とスケッチを上述の内容で書き換えてください。


≪追記≫

①まず、使われていない「/そのまま/」と書いてあるあたりの変数を消します。
(残しても問題はないですけど)

②setup関数から見ていくとまず、lcd_init関数ですけど、一番最初以外にも2か所あります。
lcdは起動後に一度だけ初期化すれば良いですから、2番目と3番目(loop関数内)を消します。

③lcd_init関数内で、なぜか digitalWrite(rs,LOW);が入り込んでいる。これは不要。
その代わり?に必要なdelayが無い。
lcd_write8(0x23);あたりも、Eピンはクロックピン相当なので0x「2」3の部分は不要
その他の操作コマンドも正しいのかは確認していないけど、最期は画面クリア0x01にした方が良い。

④lcd_write8関数で、Eピンの操作だけども
RSを操作して、EピンをHIGHです。つまり、EをHIGHにしてからRSを操作しても遅いです。

⑤setup関数内の
lcd_locate(0,0);
lcd_prints(a1);
lcd_locate(1,0);
lcd_prints(a2);

は指定位置の間違いでしょう。x,yですから2番目は2行目の先頭の0,1では?

⑥loop関数内の処理全体はこれがあると変に文字が消えます。
__llo
としたいのでしょうか?
消すのならちゃんと消さないとオカシイですよ。

※細かい所は上記以外にも修正しましたけど、表示させる所までは書き換えておきました。
https://www.tinkercad.com/things/jpwEI8twTNi

投稿2022/01/21 12:49

編集2022/01/21 15:58
nac_tnk

総合スコア463

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

alf

2022/01/22 00:42 編集

pin番号下の値でした.何も考えずにシミュレーターから出したまま使っていました. すごくあきれるようなミスを指摘してくださりありがとうございます. 教えていただいたように直したら白く塗りつぶされたものが表示されるようになりました.
nac_tnk

2022/01/21 14:20

他の回答者の方も言っているように、表示させる=使うのが目的ならライブラリを使う方が良いですよ。 tinkercadも使えない機能も多いですけど、LiquidCrystalライブラリはちゃんと使えます。 ※ただし、LCD自体がヨーロッパバージョンです。半角カナはありません。 それとも学習目的なのでしょうか? それなら一通りチェックはしますけど。
alf

2022/01/21 14:22

学習目的です
alf

2022/01/21 16:22

//色々調べたり直したら表示できました!ありがとうございました。 int rs=12; int e=11; int d7=2; int d6=3; int d5=4; int d4=5; char a1[]=" ";//上の行に空白を入れる char a2[]=" ";//下の行に空白を入れる //4ビットの書き込み void lcd_write4(int str,int rs_2){ if(rs_2==0){ //コマンドの入力 digitalWrite(rs,0); }else if (rs_2==1){ //データの入力 digitalWrite(rs,1); } //上位4ビットのマスク処理 digitalWrite(e,1); int str_4=(str>>4)&(0x0f); //str=x x e rs d7 d6 d5 d4 //4つシフトする //str=? ? ? ? x x e rs //0 0 0 0 1 1 1 1でマスクすると //str_4 = 0 0 0 0 x x e rs digitalWrite(d7,(str_4>>3)&0x01);//x //? ? ? 0 0 0 0 x //0 0 0 0 0 0 0 1 //0 0 0 0 0 0 0 x でxだけ取り出せる digitalWrite(d6,(str_4>>2)&0x01);//x digitalWrite(d5,(str_4>>1)&0x01); //e digitalWrite(d4,str_4&0x01); //rs delay(5); digitalWrite(e,0); delay(5); //下位4ビットのマスク処理 digitalWrite(e,1); digitalWrite(d7,(str>>3)&0x01); //d7 digitalWrite(d6,(str>>2)&0x01); //d6 digitalWrite(d5,(str>>1)&0x01); //d5 digitalWrite(d4,str&0x01);//d4 delay(5); digitalWrite(e,0); delay(5); } //8ビットの書き込み void lcd_write8(int str){ //enableを1にする digitalWrite(e,1); digitalWrite(e,(str>>5)&0x01);//e //x x e rs d7 d6 d5 d4 //? ? ? ? ? x x e //0 0 0 0 0 0 0 1 //0 0 0 0 0 0 0 e //eだけを取り出す digitalWrite(rs,(str>>4)&0x01);//rs digitalWrite(d7,(str>>3)&0x01);//d7 digitalWrite(d6,(str>>2)&0x01);//d6 digitalWrite(d5,(str>>1)&0x01);//d5 digitalWrite(d4,str&0x01);//d4 delay(50); digitalWrite(e,0); delay(50); } //lcdの初期化 void lcd_init(){ //ポート設定 pinMode(e,OUTPUT); pinMode(rs,OUTPUT); pinMode(d7,OUTPUT); pinMode(d6,OUTPUT); pinMode(d5,OUTPUT); pinMode(d4,OUTPUT); delay(50); digitalWrite(rs,LOW); lcd_write8(0x23); digitalWrite(rs,LOW); lcd_write8(0x23); digitalWrite(rs,LOW); lcd_write8(0x23); digitalWrite(rs,LOW); lcd_write8(0x22); lcd_write4(0x28,0); //0 0 1 0 1 0 0 0 lcd_write4(0x0E,0); lcd_write4(0x06,0); } //lcdのカーソル void lcd_locate(int x,int y){ //rsが0になる必要があるため lcd_write4(0x80+x+y*0x40,0); } //lcdの表示 void lcd_prints(char *x){ //null文字が来るまで文字を1文字ずつ読み取る while(*x != 0x00){ //lcd_print(x); lcd_write4(*x,1); x++; } } void setup( ) { //lcdの初期化 lcd_init(); lcd_init(); lcd_locate(0,0); lcd_prints(a1); lcd_locate(0,1); lcd_prints(a2); } void loop() { //lcdの初期化 lcd_init(); lcd_locate(0,0); //出力したい文字1行目 lcd_prints("hello"); lcd_locate(0,1); //出力したい文字2行目 lcd_prints("everyone"); while(1){ ; } }
alf

2022/01/21 16:30 編集

追記の方に記述されていたのですね、今気づきました。②③➃を直します。コードまで直していただきありがとうございます。参考にして理解します。
guest

0

 まずは、Arduinoのライブラリ関数を使って表示させてみよう。
それできちんと表示できるのを確認してから、自作関数で挑戦してみるがよろしい

Arduino 日本語リファレンス

投稿2022/01/21 12:01

y_waiwai

総合スコア87784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問