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

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

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

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

Q&A

解決済

3回答

1626閲覧

LCDモジュールへの文字の表示

Merrifield

総合スコア31

C

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

0グッド

0クリップ

投稿2020/05/14 10:36

編集2020/05/15 01:33

Cube suite+という開発環境で、LCDモジュールに何かしら文字や数字などを表示するプログラムを作成したいです。マイコンは78KOR/KG3で、LCDモジュールは、ACM1602N1-FKW-FBWを使用します。液晶画面に表示させるということをやったことがないので、どのようにプログラムを作ればよいのか考え方が分からないのですが、教えていただけないでしょうか。まだ、初学者なので質問の仕方も適切ではないのかもしれませんが、なにか質問などありましたらお答えします。

サンプルプログラムのようなものがありました。時計表示機能つき温度データロガーのプログラムのようです。これをもとに考えたいのですが、どのあたりが必要な部分になるでしょうか。

/* Include files */ #include "macrodriver.h" #include "System.h" #include "String.h" #include "Stdlib.h" /* LCD定義*/ typedef struct { UCHAR rs : 1; UCHAR sts : 1; UCHAR data : 8; } ST_LCDCMD; #define D_LCD_X_SIZE 16 /* LCD表示サイズX */ #define D_LCD_Y_SIZE 2 /* LCD表示サイズY */ #define D_LCD_SIZE (D_LCD_X_SIZE * D_LCD_Y_SIZE) #define D_LCD_CGRAMSIZE (8 * 8) /* LCDインストラクション設定*/ #define D_LCD_CLR 0x01 /* 表示クリア*/ #define D_LCD_HOME 0x02 /* カーソルをホームポジションへ移動*/ #define D_LCD_ENTRY 0x04 /* エントリー・モード・セット(デフォルトはカーソル左移動,表示シフトなし*/ #define D_LCD_SET 0x08 /* 表示ON/OFF設定(デフォルトは表示OFF,カーソルOFF,ブリンクOFF) */ #define D_LCD_SHIFT 0x10 /* カーソル/表示の移動(デフォルトはカーソル位置を左へシフト*/ #define D_LCD_FUNC 0x20 /* ファンクションセット(データ長、表示行数、キャラクタドット数) */ #define D_LCD_CGRAM 0x40 /* CGRAMのアドレス設定*/ #define D_LCD_DDRAM 0x80 /* DDRAMのアドレス設定*/ /* LCDインストラクションのbit設定*/ #define D_LCD_ENTRY_INC 0x02 /* カーソル右移動(インクリメント) */ #define D_LCD_SET_ON 0x04 /* 表示ON */ #define D_LCD_2LINE 0x08 /* 表示行数を2行にする*/ /* in main.c */ extern void wait100usec( UINT para1_ ); extern void wait1msec( UINT para1_ ); /* in This file. */ void lcd_temperature( void ); /****************************************************************************** ** Global define *******************************************************************************/ /* - - - - - - - - - 他参照- - - - - - - - - - */ /* in main.c */ extern USHORT gTemperatureAd;extern USHORT gTemperatureAd2; /* - - - - - - - このファイルでの定義- - - - - - - - */ ST_LCDCMD gtLcdCmd; /* LCDへコマンド送る際の構造体*/ UCHAR gLcdUpdate; /* LCD表示を更新するカウンタ*/ UCHAR gtLcdBuffer[ D_LCD_SIZE + 1 ]; /* LCDのキャラクタ単位のRAMバッファ16文字x2行*/ UCHAR gLcdCursor; /* LCDカーソル位置*/ const UCHAR gLCDTEXT[] = “ オンド1: 2: ”; /* 温度表示時の文字列*/ const UCHAR gtCgramData[] = { /* LCDへ定義する℃のフォントデータ*/ 0x08, 0x14, 0x08, 0x07, 0x08, 0x08, 0x08, 0x07, 0x00, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x00, 0x00, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f }; /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* LCDへデータ書き込み(8bitデータ送信) */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ void lcd_write8bit( UCHAR rs_, UCHAR status_, UCHAR data_ ) { UCHAR lcddata; /* RS : レジスタ選択信号*/ lcddata = rs_; /* E : 動作起動信号*/ lcddata ¦= (status_ << 1); /* DB : 8bitデータバス*/ lcddata ¦= (data_ << 2); /* データを出力する*/ P8 = lcddata; wait100usec( 1 ); /* 動作起動(イネーブル信号)をLOWにする*/ P8.1 = 0; wait100usec( 1 ); } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* LCDへデータ書き込み(4bitデータ送信) */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ void lcd_write4bit( UCHAR rs_, UCHAR status_, UCHAR data_ ) { UCHAR lcddata, dat; /* RS : レジスタ選択信号*/ lcddata = rs_; /* E : 動作起動信号*/ lcddata ¦= (status_ << 1); /* DB : 上位4bitデータを送る*/ dat = (data_ & 0xf0) >> 1; lcddata ¦= dat; /* データを出力する*/ P8 = lcddata; wait100usec( 2 ); /* 動作起動をLOWにする*/ P8.1 = 0; wait100usec( 2 ); /* RS : レジスタ選択信号*/ lcddata = rs_; /* E : 動作起動信号*/ lcddata ¦= (status_ << 1); /* DB : 下位4bitデータを送る*/ dat = (data_ & 0x0f) << 3; lcddata ¦= dat; /* データを出力する*/ P8 = lcddata; wait100usec( 2 ); /* 動作起動(イネーブル信号)をLOWにする*/ P8.1 = 0; wait100usec( 2 ); } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* LCD初期化*/ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ void lcd_init() { int i; UCHAR dat; gLcdUpdate = 0; gLcdCursor = 0; memset( gtLcdBuffer, ' ', sizeof(gtLcdBuffer) ); lcd_write4bit( 0, 1, 0x38 ); /* 8bitモードへ設定*/ wait1msec( 100 ); lcd_write8bit( 0, 1, 4 ); /* 4bitモードインターフェース設定*/ gtLcdCmd.rs = 0; /* ファンクション行数セット*/ gtLcdCmd.sts = 1; gtLcdCmd.data = D_LCD_FUNC ¦ D_LCD_2LINE; lcd_write4bit( gtLcdCmd.rs, gtLcdCmd.sts, gtLcdCmd.data ); wait1msec( 100 ); /* エントリー・モード設定*/ gtLcdCmd.rs = 0; gtLcdCmd.sts = 1; gtLcdCmd.data = D_LCD_ENTRY ¦ D_LCD_ENTRY_INC; lcd_write4bit( gtLcdCmd.rs, gtLcdCmd.sts, gtLcdCmd.data ); wait1msec( 5 ); /* 表示ON, カーソルOFF, ブリンクOFF */ gtLcdCmd.rs = 0; gtLcdCmd.sts = 1; gtLcdCmd.data = D_LCD_SET ¦ D_LCD_SET_ON; lcd_write4bit( gtLcdCmd.rs, gtLcdCmd.sts, gtLcdCmd.data ); wait1msec( 5 ); /* 表示クリア*/ lcd_write4bit( 0, 1, D_LCD_CLR ); wait1msec( 10 ); /* CGRAMへデータを転送する*/ lcd_write4bit( 0, 1, D_LCD_CGRAM ); for ( i = 0; i < D_LCD_CGRAMSIZE; i++ ) { /* CGRAMデータ書き込み*/ dat = gtCgramData[ i ]; lcd_write4bit( 1, 1, dat ); wait100usec( 1 ); } } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* 温度表示*/ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ void lcd_temperature( ) { int i; UCHAR num1[ 7 ], num2[ 7 ]; UINT temp1, temp2; /* 各センサより温度を計算*/ temp1 = gTemperatureAd; temp2 = gTemperatureAd2; itoa( temp1, (char *)num1, 10 ); itoa( temp2, (char *)num2, 10 ); for ( i = 0; i < D_LCD_X_SIZE; i++) { gtLcdBuffer[ i + D_LCD_X_SIZE ] = gLCDTEXT[ i ]; } gtLcdBuffer[ 7 + D_LCD_X_SIZE ] = num1[ 0 ]; gtLcdBuffer[ 8 + D_LCD_X_SIZE ] = num1[ 1 ]; if ( num1[ 1 ] != 0 ) { gtLcdBuffer[ 9 + D_LCD_X_SIZE ] = 0; /* 「℃」表示*/ } gtLcdBuffer[ 13 + D_LCD_X_SIZE ] = num2[ 0 ]; gtLcdBuffer[ 14 + D_LCD_X_SIZE ] = num2[ 1 ]; if ( num2[ 1 ] != 0 ) { gtLcdBuffer[ 15 + D_LCD_X_SIZE ] = 0; /* 「℃」表示*/ } } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* LCDバッファVRAMからLCD VRAMへ転送*/ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ void lcd_vram2lcd() { UINT i; UCHAR dat; /* DDRAMアドレス設定*/ lcd_write4bit( 0, 1, D_LCD_DDRAM ); wait1msec( 1 ); for ( i = 0; i < (D_LCD_SIZE/2); i++ ) { /* DDRAMデータ書き込み*/ dat = gtLcdBuffer[ i ]; lcd_write4bit( 1, 1, dat ); wait100usec( 1 ); } /* DDRAMアドレス設定*/ lcd_write4bit( 0, 1, D_LCD_DDRAM + 0x40 ); wait1msec( 1 ); for ( i = 0; i < (D_LCD_SIZE/2); i++ ) { /* DDRAMデータ書き込み*/ dat = gtLcdBuffer[ i + D_LCD_X_SIZE ]; lcd_write4bit( 1, 1, dat ); wait100usec( 1 ); } wait1msec( 1 ); }

78KOR/KG3ターゲットボード
QB-78KORKG3-TB
チュートリアル・ガイド
実践編より

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

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

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

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

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

thkana

2020/05/14 11:34

> 液晶画面に表示させるということをやったことがない では何ならやったことがあるのですか?
Merrifield

2020/05/14 12:58

Aruduinoで、デジタル出力、入力、アナログ出力、入力の基本的なことを最近やりました。
dodox86

2020/05/15 00:53

質問を読むことを阻むかのようにご提示のソースコードが読みづらいです。teratailではマークダウン記法と言うものが使えます。 https://teratail.com/help/question-tips#questionTips3-5-1 https://teratail.com/questions/238564 あたりを参考にして、ソースコードを適切に表示するようにしてください。 また、サンプルプログラムを引用したのであれば、どこから持ってきたのか、出典(出所)を明らかにしましょう。 ※どなたも注意をしていないので、きっと皆さん疲れてしまったのでしょうね。
Merrifield

2020/05/15 01:32

ご指摘ありがとうございます。 修正いたしました。
guest

回答3

0

終了済みですけど今さら気づいたので。

サンプルプログラムのようなものがありました。
これをもとに考えたいのですが、どのあたりが必要な部分になるでしょうか。

ほぼありません。

お示しのプログラムは昔ながらのHD44780互換パラレル接続のLCDの制御プログラムで、あなたが使おうとしているLCDは(型番が間違っていますがACM1602N1-FLW-FBWだとすれば)I2C接続のものです。
I2C接続のLCDは、HD44780のものと制御コード体系だけは多少似ていますが、信号の送り方も初期設定もかなりの別物で、より複雑です。
諦めてそのコードが使えるHD44780互換LCDを買い直すことを強くおすすめします。

投稿2020/05/18 14:11

ikadzuchi

総合スコア3047

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

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

0

ベストアンサー

なにかコードを書いて、それがうまく動かない、というのであれば回答のしようもあるんですが、
なにもわからないのでイチから教えろ、では答えようがありません。

まずは、あなたの使おうとするCPUのデータシート、及び、その表示器のデータシートをとってきて、よく読みましょう。
はなしはそれからになります

投稿2020/05/14 13:01

y_waiwai

総合スコア88042

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

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

Merrifield

2020/05/14 13:08

データシートは、見ているのですが、それがどうプログラムに繋がるのか分からないのです。データシートなにを見ればよいのでしょうか。
y_waiwai

2020/05/14 13:12

その表示器とどうつなぐか、を考えてみてはどうですか。 それさえもわからないというのは、そもそもそのようなことをするのはムリなので諦めよう、としかいいようがないですね。
Merrifield

2020/05/15 00:34

そういった部分も勉強するために、今回取り組んでいるのですが、なにかよい勉強方法などありますか。
y_waiwai

2020/05/15 00:44

おそらく仕事のはなしだとは思いますが(78K0なんつー古いCPUでは)、できれば断ったほうがいいかと思いますよ。 回路設計からやらなければならない時点で、初心者のレベルではどーにもなりません
dodox86

2020/05/15 01:01

範囲が広く、この質問回答ひとつで解決する問題には到底思えませんね。「どのように取り組んで、作っていくか」を示して終わる程度でしょうか。仕事なら、その道のプロの直接的なサポートが必要なのでは。
Merrifield

2020/05/15 08:20

こういった回路設計のことなどは、どのように勉強するのでしょうか。
y_waiwai

2020/05/15 08:26

とりあえず、回路設計 入門、あたりでぐぐってみれば。 まあ、現実的な実現性からいいますと、まずはArduinoでその表示器を動かしましょう。 それがきっちりできるようになるなら、それを78K0で動かすことを考えればいいです
Merrifield

2020/05/17 12:35

ありがとうございます。まずarduinoでやってみます。
guest

0

モジュールの型名でググります
型名が間違ってるっぽいのでそれっぽいやつでググります
秋月のページを見つけます
データシート読みます
端子からしてi2cで通信することがわかります
19ページ辺りにコマンド表があるのでそれ見ます

次にマイコンでi2c通信する方法を調べます。
マイコンの型番を…

って感じです

投稿2020/05/14 11:09

ozwk

総合スコア13553

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

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

pepperleaf

2020/05/14 11:47

> 端子からしてi2cで通信することがわかります > 19ページ辺りにコマンド表があるのでそれ見ます ここまで書くのなら、リンク位は置きましょう。
Merrifield

2020/05/14 13:00

マイコンの型番は、間違えていないのです。調べてもあまり出てこないからこちらで質問させていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問