プロが教えるわが家の防犯対策術!

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++){}
}

A 回答 (4件)

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アクティブなので補足させていただきました。
それでは、がんばってください。
    • good
    • 0

LCD出力に必要な処理は入れてますか?


(LCD初期化、マイコンのポートの設定等)

トランジスタ技術の2004年5月号にH8マイコンを使用したLCD出力に関する記事が載っていて、C言語のサンプルも用意されています。参考URLからサンプルソースもダウンロードできます。

参考にして見てください。

参考URL:http://www.cqpub.co.jp/toragi/
    • good
    • 0

えーとですね・・・。

(^^;

全部の箇所で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かな?

どのあたりで初期化して、どのあたりで何を表示しているか位は書いてもらわないと・・・、分かりません。
    • good
    • 0

気になるのが、


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のデータブックが無いので分かりません。
    • good
    • 0
この回答へのお礼

ありがとうございます。
LCDC.PBDR.BYTE=0x83;
wait(2);
LCDC.PBDR.BIT.E=0;
wait(2);
のようにしてみたのですが、変化ありませんでした。
もっとループを回して時間を置いたほうがいいんでしょうか?
データシートが無いのでわからないと言われてしまって当然かと思いますがすみません・・・

お礼日時:2004/11/17 18:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!