• ベストアンサー

LCD表示の制御

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=0x82 LCDC.PBDR.BIT.E=0; wait(2); LCDC.PBDR.BYTE=0x80 LCDC.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++){} }

質問者が選んだベストアンサー

  • ベストアンサー
  • txrx
  • ベストアンサー率45% (83/184)
回答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アクティブなので補足させていただきました。 それでは、がんばってください。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • katouka09
  • ベストアンサー率50% (130/256)
回答No.4

LCD出力に必要な処理は入れてますか? (LCD初期化、マイコンのポートの設定等) トランジスタ技術の2004年5月号にH8マイコンを使用したLCD出力に関する記事が載っていて、C言語のサンプルも用意されています。参考URLからサンプルソースもダウンロードできます。 参考にして見てください。

参考URL:
http://www.cqpub.co.jp/toragi/
全文を見る
すると、全ての回答が全文表示されます。
  • txrx
  • ベストアンサー率45% (83/184)
回答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かな? どのあたりで初期化して、どのあたりで何を表示しているか位は書いてもらわないと・・・、分かりません。

全文を見る
すると、全ての回答が全文表示されます。
  • txrx
  • ベストアンサー率45% (83/184)
回答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のデータブックが無いので分かりません。

matsumai
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • LCDモニターの駆動

    SH7144Fマイコンを用いて秋月のLCDモニターSC1602BSの駆動を試みています。 以下のようなソースを用意したのですが、文字化けが発生し、20回くらいリセットをかけるとうまく表示されるようになります。 結線方法はBFチェックなしの4BITです。 #include "7144.h" #define E_SIG 0x20 #define RS_SIG 0x10 void wait(void) { int t = 20000; while(t--); } void waits(void) { int ts = 800; while(ts--); } void lcdo(unsigned char d) { d=d | E_SIG; PE.DRL.BYTE.L = d; d = d & 0xdf; PE.DRL.BYTE.L = d; waits(); } void lcdinit(void) { lcdo(3); lcdo(3); lcdo(3); lcdo(2); lcdo(2); lcdo(8); lcdo(0); lcdo(0x0c); lcdo0); lcdo(6); } void lcdclr(void) { PE.DRL.BYTE.L = 0; lcdo(0); lcdo(1); wait(); } void lcdxy(int y,int x) { PE.DRL.BYTE.L = 0; lcdo(y); lcdo(x); waits(); } void lcdo2(unsigned char d) { unsigned dd; dd = d; d = d >> 4; d = d & 0x0f; d = d | RS_SIG; lcdo(d); waits(); dd = dd & 0x0f; dd = dd | RS_SIG; lcdo(dd); waits(); } void dsp1g(int c,char *str) { int i; for(i = 1;i <= c;i++) { lcdo2(*str); str++; } } void initLCD(void) { wait(); lcdinit(); waits(); lcdclr(); } void main() { PFC.PEIORL.BYTE.L = 0xff; wait(); lcdinit(); waits(); lcdclr(); lcdxy(8,0); lcdxy(8,2); dsp1g(5,"HELLO"); waits(); lcdxy(0x0c,2); dsp1g(5,"WORLD"); while(1); } 上記ソースに含まれる間違いや改善点がありましたらどうかご教授ください。

  • C言語のコードについて

    C言語の問題なのですか、作成したのですが内容がわからないです。 コードをわかりやすく解説していただけると嬉しいです。 #include <stdio.h> void printBinary(unsigned char num) { int i ; /*①上位ビットから順に表示する*/ for(i = 7 ; i >= 0; i--) { /*②シフトとマスクを使用しています。*/ printf("%d", (num>>i) &0x01 ); } printf("\n"); } int main(void) { unsigned char num1 = 0xD2;/*11010010*/ unsigned char num2 = 0x5E;/*01011110*/ printf("0xD2 : "); printBinary(num1); printf("0x5E : "); printBinary(num2); return 0; }

  • モータの制御

    //ステッピングモータの回転 //右に2回転、停止、左に1回転、停止これを3回繰り返す //ITUO使用、フラグが立つのを待つ //10msごとにモータに出力 //str_4.c #include <3048f.h> void ioinit(void) { PB.DDR = 0xff; } void ituinit(void) { ITUO.TCR.BIT.CCLR = 1; //カウンタクリア要因 ITUO.TCR.BIT.TPSC = 3; //タイマプリスケーラ 25MHz/8=3.125MHz ITUO.GRA = 31249; //3.125MHz/31250=100Hz、10ms、100pps ITUO.TIER.BIT.IMIEA = 0; //IMFAフラグによる割り込み禁止 } void wait(void) //停止時間 { Long t=200000; while(t--); } int main(void) { int i = 3; //繰り返しカウンタ int p; //回転パルス数 int md = 0x11; //モータ出力データ ioinit(); ituinit(); PB.DR.BYTE = md; wait(); ITU.TSTR.BIT.STR0 = 1; //タイマスタート while(i--){ for(p=0;p<96;p++){ //2回転 PB.DR.BYTE = md; md <<= 1; //右回転 if(md == 0x110) //4回シフトしたかの判断 md = 0x11; //4回シフトで初期値に戻す while(!ITU0.TSR.BIT.IMFA); //フラグが立つのを待つ ITU0.TSR.BIT.IMFA = 0; //フラグクリア } wait(); //少し停止 for(p=50;p>0;p--){ //1回転、1パルス多くした PB.DR.BYTE = md; md >>= 1; //左回転 if(md == 0x08) //4回シフトしたかの判断 md = 0x88; //4回シフトで初期値に戻す while(!ITU0.TSR.BIT.IMFA); //フラグが立つのを待つ ITU0.TSR.BIT.IMFA = 0; //フラグクリア } wait(); } PB.DR.BYTE = 0x00; //モータ励磁OFF while(1); //ここでとまっている } このプログラムのフローチャートがわかりません。

  • USART通信で文字化け

    __CONFIG( WDTDIS & UNPROTECT & BORDIS & MCLRDIS & PWRTEN & HS & LVPDIS ); // // test.c 2009/07/30 HI-TECH C Compiler // プリスケーラ1/256 セラミック発振子10MHz使用 1命令当り102us // unsigned char buff[10]; unsigned int RecCnt=0; main(){ /*Port initalizeなど .................... */ RCSTA = 0x90; TXSTA = 0x24; SPBRG = 0x40; //BaudRate 9600 FOCS 10MHz unsigned int i; while(1){ putch('A'); for(i=0; i<60000; i++); putch('K'); for(i=0; i<60000; i++); } } ヘッダーファイル #ifndef _SERIAL_H_ #define _SERIAL_H_ #define BAUD 9600 #define FOSC 10000000L #define NINE 0 // Use 9bit communication? FALSE=8bit #define DIVIDER ((int)(FOSC/(16UL * BAUD) -1)) #define HIGH_SPEED 1 #if HIGH_SPEED == 1 #define SPEED 0x04 #else #define SPEED 0 #endif #define RX_PIN TRISB1 #define TX_PIN TRISB2 /* Serial initialization */ #define init_comms()\ RX_PIN = 1; \ TX_PIN = 1; \ SPBRG = DIVIDER; \ RCSTA = (NINE_BITS|0x90); \ TXSTA = (SPEED|NINE_BITS|0x20) void putch(unsigned char); unsigned char getch(void); unsigned char getche(void); #endif void putch(unsigned char byte) { unsigned int i; /* output one byte */ while(!TXIF) /* set when register is empty */ continue; TXREG = byte; } unsigned char getch() { /* retrieve one byte */ while(!RCIF) /* set when register is not empty */ continue; return RCREG; } 上記が自分で作成したUSART通信を使用したプログラムです。AとKを送信しています。ですがハイパーターミナルで受信した文字列を見てみるとまったく異なる文字や空白など文字化けをしていました。 前に作成した時は正常に表示されたのですが、今また流用してみると文字化けしていました。 発振子に10MHz使用でBRGH=1(高速)と9600bps→SPBRG=0x40 原因はここだと思うのですが、、、謎です。 丸投げな感じですが、どうか分かる方回答をお願いします。

  • プログラムに詳しい方お願いします

    プログラム詳しい方どなたかお願いします。 これはDCチョッパの自動制御のプログラムなんですが、フローチャートで示すことはできますか? できればその動作の説明もお願いします。 #include "_ffmc16.h" #include "extern.h" #include "monitor.h" unsigned int LED=0xE0; unsigned long LOOP=60000; #define PRD 255 unsigned int ON=10; unsigned int AN0=0; void main(void) { long i=0; __set_il(7); __EI(); /* enable interrupt(for Accemic) */ IO_PDR1.byte=0xF7; IO_DDR1.byte=0x1F; IO_PRL01.byte.PRLL1=ON; IO_PRL01.byte.PRLH1=PRD-ON; IO_PPG01.byte=0x00; IO_PPGC01.word=0xA100; IO_DDR5.byte=0x00; IO_ADCSH.bit.BUSY=0; IO_ADER.byte=0x07; IO_ADCSL.byte=0x92; IO_ADCRLH.byte.ADCRH=0xF8; IO_ADCSH.bit.STRT=1; while(1){ /* endless loop */ IO_PDR1.byte=LED; //for (i=LOOP;i--;i>0)IO_PDR1.byte=LED; //for (i=LOOP;i--;i>0)IO_PDR1.byte=0xFF; IO_PRL01.byte.PRLL1=ON; IO_PRL01.byte.PRLH1=PRD-ON; AN0=IO_ADCRLH.DATA8; if(AN0<100){ON=ON+1;} else if(AN0>100){ON=ON-1;} if(ON<0){ON=0;} if(ON>150){ON=150;} for(i=1000;i--;i>0){} } } /***************************************************************************** interrupt routine ******************************************************************************/ /* reload timer interrupt routine */ __interrupt void reload_int(void) { } /* ADC interrupt routine */ __interrupt void ADC_int(void) { } /* Ext interrupt routine */ __interrupt void ext_int(void) { } /* Vector Table */ #pragma section INTVECT,locate=0xfffc00 #pragma intvect _start 0x8 0x0 /* Reset Vector */ #pragma intvect reload_int 17 /* reload timer interrupt vecter */ #pragma intvect ADC_int 18 /* AD converter Vector */ #pragma intvect ext_int 24 /* Ext Interrupt vecter */

  • 困っています

    どうしても、--unsigned型のビット内容表示--の所が意味が分かりません。分かりやすく教えてください。宜しくお願いします。 /* 0~UINT_MAXを2進・8進・16進で表示 */ #include <stdio.h> #include <limits.h> /*--- 整数xのセットされたビット数を返す ---*/ int count_bits(unsigned x) { int count =0; while (x) { if (x & 1u) count++; x>>=1; } return (count); } /*---- unsigned型のビット数を返す ----*/ int int_bits(void) { return (count_bits(~0U)); } /*---- unsigned型のビットを内容を表示 ---*/ void print_bits(unsigned x) { int i; for (i=int_bits() -1; i>=0; i--) putchar(((x>>i) & 1U) ? '1' : '0'); } int main(void) { unsigned i; for (i=0; i<UINT_MAX; i++) { print_bits(i); printf(" %6o %5u %4X\n", i, i, i); } return(0); }

  • h8マイコンで AD変換ができなくて困っています

    マイコンでAD変換をしようと思っています>< #include<3048.h> void ioinit(); void adinit(); int i; int ADDRA; main() { ioinit(); adinit(); while(1){ AD.ADCSR.BIT.ADST = 1; // A/D変換スタート while(AD.ADCSR.BIT.ADF==1); // A/D変換終了まで待つ int i = ADDRA; // レジスタに格納された値をiとする if (i>=0xA5){ // 電圧が6.5vより高くなった場合 P5.DR.BYTE = 0x01; } else if (i<=0x19){ // 電圧が1vより小さくなった場合 P5.DR.BYTE = 0x02; } else if (0x19<=i<=0xA5){ // それ以外の電圧だった場合 P5.DR.BYTE = 0x03; } AD.ADCSR.BIT.ADF=0; //フラグクリア } } // I/OポートDDR設定 void ioinit() { P5.DDR=0xff; } // A/D変換設定 void adinit() { AD.ADCSR.BYTE = 0x33; } このプログラムでAD変換がまったくできません><電圧を変えていくことでP5につながっているLEDで変換結果を見たいと思っています。ADDRAのプログラムあたりがおかしいと思っています;;ちなみにポート7に電圧計とつなげています。その電圧値を変えていくことで結果を見ようとしています。0xA5は6.5Vのときの反応だから回路も分圧させたものにして10Vまでの対応にしました><どこがおかしいのか教えていただけるとてもうれしいです><助けてください;;

  • 1bppファイルを8bpp(raw)に変換する。

    環境 Windows7 VS2008 SP1 1bppの画像を8bppに変換しようとしているのですが うまくいきません。自分ではこれで 合っていると思うのですが・・・ 何かアドバイスお願いしますm(__)m int Main1bppTo8bpp(WCHAR *filename,int width,int height) { //width,heightは8bppになったときの幅,高さを指定する。 FILE *fpt; _wfopen_s(&fpt,filename,L"rb"); if(fpt==0x00) { MessageBox(NULL,L"1bppTo8bpp Error",L"1bppTo8bpp Error",MB_OK); return -1; } else { unsigned char *layer,*Output; layer=(unsigned char*)calloc(((width/8)+1)*height*sizeof(unsigned char),sizeof(unsigned char)); Output=(unsigned char*)malloc(width*height); //読み込み fread(&layer[0],sizeof(unsigned char),((width/8)+1)*height,fpt); FILE *fpt_output; _wfopen_s(&fpt_output,L"1bppTo8bpp.raw",L"wb"); int i,j,flag=0x00; for(i=0;i<((width/8)+1)*height;i+=((width/8)+1)) { for(j=0;j<((width/8)+1);j++) { //8bit目 if((layer[i+j]&BIT8)==BIT8) { Output[i+j+flag]=0x00; } else { Output[i+j+flag]=0xff; } //7bit目 if((layer[i+j]&BIT7)==BIT7) { Output[i+j+flag+1]=0x00; } else { Output[i+j+flag+1]=0xff; } //6bit目 if((layer[i+j]&BIT6)==BIT6) { Output[i+j+flag+2]=0x00; } else { Output[i+j+flag+2]=0xff; } //5bit目 if((layer[i+j]&BIT5)==BIT5) { Output[i+j+flag+3]=0x00; } else { Output[i+j+flag+3]=0xff; } //4bit目 if((layer[i+j]&BIT4)==BIT4) { Output[i+j+flag+4]=0x00; } else { Output[i+j+flag+4]=0xff; } //3bit目 if((layer[i+j]&BIT3)==BIT3) { Output[i+j+flag+5]=0x00; } else { Output[i+j+flag+5]=0xff; } //2bit目 if((layer[i+j]&BIT2)==BIT2) { Output[i+j+flag+6]=0x00; } else { Output[i+j+flag+6]=0xff; } //1bit目 if((layer[i+j]&BIT1)==BIT1) { Output[i+j+flag+7]=0x00; } else { Output[i+j+flag+7]=0xff; } flag=flag+8; } flag=0x00; } //最終的な「fwrite」はここでする。 fwrite(&Output[0],sizeof(unsigned char),width*height,fpt_output); free(layer); free(Output); fclose(fpt); fclose(fpt_output); } return 0;

  • H8SX/1655のタイマー割り込みについて教えてください。

    H8SX/1655のタイマー割り込みについて教えてください。 CQ出版の『今すぐ使える!H8マイコン基板』の基板の動作確認として、 基板上のLEDをタイマー割り込みで点滅させようとしたのですが動作しません。 HEWの設定上の問題と思いますが、思い当たるところがあれば教えてください。 HEW:Version 4.06.00.047 "iodefine.h"は自動生成されたものです。 ---HEWのコード #include <machine.h> #include "iodefine.h" unsigned long cnt0; // wait関数用 //割込み関数 #pragma interrupt( int_timer0 ) void int_timer0( void ) { TPU0.TSR.BIT.TGFA= 0; // フラグクリア cnt0++; } void wait( unsigned long wait_set ) { cnt0 = 0; while( cnt0 < wait_set ); } void main(void) { MSTP.CRA.BIT._TPUL =0; // 低消費電力モード解除 //タイマー設定 TPU0.TCR.BYTE = 0x23; //φ/64 TPU0.TIER.BIT.TGIEA = 1; TPU0.TGRA = 375; // 1/375 TPU.TSTR.BYTE = 0x01; // Timer Start //ポート設定 PM.DDR = 0x08; // LED Output port //割り込み許可 set_imask_ccr(0); while(1) { wait( 500 ); PM.DR.BIT.B3 = 1; wait( 500 ); PM.DR.BIT.B3 = 0; } } //intprg.c // vector 88 TGI0A TPU0 //__interrupt(vect=88) void INT_TGI0A_TPU0(void){/* sleep(); */} __interrupt(vect=88) void INT_TGI0A_TPU0(void){int_timer0(); }

  • PICプログラミング

    テストプログラムとして以下のようなプログラムを作ってみました。 RB0を一定時間だけHIGHにした後に、LOWに戻すプログラムなのですが、テスターで測定したところRB0は結果的にHIGHのままでした。wait関数が間違っているのかと思いましたが、どう考えても文法的な間違いはないと思います。 原因がまったく分からないので、分かる方がいましたらヒントだけでもいいので是非教えてください。よろしくお願いします。 PIC16F819 セラロック20MHz #include <pic.h> __CONFIG(DEBUGEN&WDTDIS&LVPDIS&HS&PWRTEN); #define voltage 5.0 void wait(int a){ int i,j; for(i=0;i<=30000;i++) for(j=0;j<=2000*a;j++); } void init_a2d(void){ ADCON0=0x80; ADCON1=0x00; ADON=1; } unsigned char read_a2d(unsigned char channel){ channel&=0x07; ADCON0&=0xC5; ADCON0|=(channel<<3); // GODONE=1; // while(GODONE)continue; ADCON0|=0x04; while(ADCON0&0x04)continue; return(ADRESH); } void main(void){ int i,j; unsigned char x; double y; init_a2d(); GIE=0; TRISB=0x00; PORTB=0x00; RB0=1;    wait(5); RB0=0; }

このQ&Aのポイント
  • 通話中が消えないため、MFC-J6580CDWのネットワーク設定をリセットしようとしましたが、方法がわかりません。
  • Windows10を使用していて、無線LANで接続されています。関連するソフトやアプリはありません。
  • 問題はアナログ回線の電話回線に関連しているようです。
回答を見る