
H8/3048マイコンを使ってLCDに文字を表示させたくデータシートを見ながらプログラミングしているのですが、全く表示されません。間違っている箇所があればご指摘ください。
#include "3048fone.h"
/* lcd_port.h */
struct st_lcdc{
union{/* PortB Data Register */
unsigned char BYTE;/* Byte Access*/
struct{/* Bit Access */
unsigned char E:1;/* Enable Flag*/
unsigned char RW:1;/* R/W Flag*/
unsigned char RS:1;/* Register Select Flag */
unsigned char :1;
unsigned char DR:4;/* Data Register(DR)*/
}BIT;
}PBDR;
};
#define LCDC (*(volatile struct st_lcdc *)0xFFFFD6)
void wait(int);
int main(void)
{
PB.DDR=0xEF;
LCDC.PBDR.BYTE=0x83;
LCDC.PBDR.BIT.E=0;
wait(10);
LCDC.PBDR.BYTE=0x83;LCDC.PBDR.BIT.E=0;
wait(2);
LCDC.PBDR.BYTE=0x83;LCDC.PBDR.BIT.E=0;
wait(2);
LCDC.PBDR.BYTE=0x82;LCDC.PBDR.BIT.E=0;
wait(2);
LCDC.PBDR.BYTE=0x82LCDC.PBDR.BIT.E=0;
wait(2);
LCDC.PBDR.BYTE=0x80LCDC.PBDR.BIT.E=0;
wait(2);
LCDC.PBDR.BYTE=0x80;
LCDC.PBDR.BIT.E=0;
wait(2);
LCDC.PBDR.BYTE=0x88;
LCDC.PBDR.BIT.E=0;
wait(2);
LCDC.PBDR.BYTE=0x80;
LCDC.PBDR.BIT.E=0;
wait(2);
LCDC.PBDR.BYTE=0x81;
LCDC.PBDR.BIT.E=0;
wait(2);
LCDC.PBDR.BYTE=0x80;
LCDC.PBDR.BIT.E=0;
wait(2);
LCDC.PBDR.BYTE=0x86;LCDC.PBDR.BIT.E=0;
wait(2);
/* 書き込み開始 Hを書き込む*/
LCDC.PBDR.BYTE=0xA4;LCDC.PBDR.BIT.E=0;
wait(2);
LCDC.PBDR.BYTE=0xA8;LCDC.PBDR.BIT.E=0;
wait(2);
return(0);
}
void wait(int m)
{
int i;
for(i=0;i<(m*1000);i++){}
}
No.3ベストアンサー
- 回答日時:
E信号が気になったので、最後?の補足です。
LCDC.PBDR.BYTE=0x83; LCDC.PBDR.BIT.E=0;
↑こんなのをやると、EとDRが同時に立ち上がるので問題かもしれませんね。
普通は、↓の様にすると思います。
LCDC.PBDR.BIT.E=0;
wait(2);
LCDC.PBDR.BIT.DR=3;
wait(2);
LCDC.PBDR.BIT.E=1;
wait(2);
LCDC.PBDR.BIT.E=0;
wait(2);
こうすることで、確実にDRが安定してからEのみ変化します。
もちろん、全ての箇所ですよ!
E信号がLアクティブなら問題ないのですが、良く見るE信号はHアクティブなので補足させていただきました。
それでは、がんばってください。
No.4
- 回答日時:
LCD出力に必要な処理は入れてますか?
(LCD初期化、マイコンのポートの設定等)
トランジスタ技術の2004年5月号にH8マイコンを使用したLCD出力に関する記事が載っていて、C言語のサンプルも用意されています。参考URLからサンプルソースもダウンロードできます。
参考にして見てください。
参考URL:http://www.cqpub.co.jp/toragi/
No.2
- 回答日時:
えーとですね・・・。
(^^;全部の箇所でwait入れてみましたか?
↓こんなのとか
LCDC.PBDR.BYTE=0x81;
LCDC.PBDR.BIT.E=0;
↓こんなのとか
LCDC.PBDR.BYTE=0xA8; LCDC.PBDR.BIT.E=0;
いたるところにありますよね。全部waitが必要と思いますよ。
とりあえず1行単位にwaitしてみては?
データブックがあれば、必要最小限が判明するのですが・・・。(-_-;
それとLCDに電源入ってますか?
電源を入れるとめちゃくちゃな表示を行うと思います。
そして、少なからず制御できているのであれば、ちらちらっとでも表示が変わると思います。
うんともすんとも言わないのなら、ソフトではなくハードウェアに問題があると思います。
補足にもありますが、時間を長くしても影響ないと思いますので、思い切って長くしてみるのも良いかもしれませんね。
でもでも、16MHzで考えると少なく見積もってもwait(2)で12.5us有りますので問題ないように思えますが・・・、
LCDのE信号パルス幅は最低何usですか?
・・・と書きながらもう少し詳しくソース見るとR/W信号が変化していないような気がしますが・・。
Rで読込みWで書き込み←W=0で全て書き込みですか?
そうならそれでいいのですが。
あとは、4bitづつデータを書き込むのでH/L指定なども必要なきがしますが、その辺は大丈夫ですか?
それに何を表示させていますか?
0x48?→Gかな?
どのあたりで初期化して、どのあたりで何を表示しているか位は書いてもらわないと・・・、分かりません。
No.1
- 回答日時:
気になるのが、
LCDC.PBDR.BYTE=0x83; LCDC.PBDR.BIT.E=0;
この部分です。
Eに1をセットした後、間髪入れず0を設定しています。
LCDは比較的遅いのでH8のスピードに追従できるか・・・?
やるんだったら↓こうではないですか?
LCDC.PBDR.BYTE=0x83;
wait(2);
LCDC.PBDR.BIT.E=0;
wait(2);
それに、コンパイル→アセンブリコードを確認した方が良いかもしれませんね。
LCDC.PBDR.BIT.E=0;
↑これが確実にEのみリセットしているかアセンブリコードを見ないと分かりませんよ。
一旦1Byte全て0にして改めて0x03書いてるかもしれませんし・・・。
多分大丈夫と思いますが。
あとは、LCDのデータブックが無いので分かりません。
ありがとうございます。
LCDC.PBDR.BYTE=0x83;
wait(2);
LCDC.PBDR.BIT.E=0;
wait(2);
のようにしてみたのですが、変化ありませんでした。
もっとループを回して時間を置いたほうがいいんでしょうか?
データシートが無いのでわからないと言われてしまって当然かと思いますがすみません・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- Excel(エクセル) Excel 2019 32-bit版を64-bit版にするには? 8 2023/07/28 14:20
- 英語 be sorry for doingとbe sorry to have doneの意味の違いについて 2 2023/06/09 13:57
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- 英語 英文和訳についての質問です。 2 2023/06/23 06:38
- その他(プログラミング・Web制作) pythonのこのエラーがわかりません 3 2022/11/16 14:54
- Visual Basic(VBA) VBAでArrayListを使う為の「mscorlib.tlb」の参照設定について 3 2022/03/23 19:45
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 共用体について コマンド...
-
atoi( ) の反対をやりたい
-
CStringをwchar_tに変換したい
-
C言語のfor文です。 繰り返しの...
-
c言語の問題の説明、各所ごとに
-
getchar()を int でとる理由...
-
C言語の入力した文字を反転させ...
-
const char** p;のとき、free(p...
-
ソケット通信で大容量のメール...
-
fgetsなどのときのstdinのバッ...
-
c++ 文字列を入力して、一文字...
-
簡単な電卓プログラムについて
-
間接参照のレベルが異なっています
-
PostgresSQLから得たデータが画...
-
【C言語】テキストファイル内の...
-
switch文で文字を比較すること...
-
テキストデータをそのままバイ...
-
数字文字の出現回数を表示する...
-
-'0'の意味について
-
C#からC言語で作成したDLLに文...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
文字列から空白を取り除きたい...
-
間接参照のレベルが異なっています
-
C言語のfor文です。 繰り返しの...
-
CStringをwchar_tに変換したい
-
テキストデータをそのままバイ...
-
charからLPTSTRへの変換方法
-
atoi( ) の反対をやりたい
-
charでの計算?
-
配列をnビットシフトする
-
c++ 文字列を入力して、一文字...
-
'const char *' 型は 'char *' ...
-
c言語でユーザ関数を利用して入...
-
干支のプログラム
-
switch文で文字を比較すること...
-
char型からのバイト数取得
-
ネットワークにつながっている...
-
getchar()を int でとる理由...
-
間接操作のレベルとは
-
str系関数を使わずに二つの文字...
おすすめ情報