H8-SX基板 LCDであのメッセージを表示してみまた。今回は動画付き [RX&SH&H8]
※LCDをポートを叩いて動かす場合、もしかしたら必要無いかもしれないけれど、一応H8/300Hの流儀でアドレス兼用PINを使う為にシングルチップモードにしています。MD0をVCCに接続します。詳しくは配線図を見て。
勿論HEW+デバックモニタで開発しています。
細かいタイミング調整も、
ソース修正、ビルド、実行、シンクロで確認、またソース修正
って流れが非常に快適に行えます。
是非みなさんも使ってみてくださいね。
下は基板とLCD間のなんとなくな配線図です。
粗末な物ですが宜しければ
勿論HEW+デバックモニタで開発しています。
細かいタイミング調整も、
ソース修正、ビルド、実行、シンクロで確認、またソース修正
って流れが非常に快適に行えます。
是非みなさんも使ってみてくださいね。
下は基板とLCD間のなんとなくな配線図です。
粗末な物ですが宜しければ
/***********************************************************************/ /* */ /* FILE :sc1602.c */ /* DATE :Tue, Mar 02, 2010 */ /* DESCRIPTION :Main Program */ /* CPU TYPE :H8SX/1658 */ /* */ /* This file is generated by Renesas Project Generator (Ver.4.16). */ /* */ /***********************************************************************/ #include <string.h> #include "iodefine.h" /*************************************************************************/ /* 端子定義 */ /*************************************************************************/ #define LCD_DATA_DIR_IN PF.DDR = 0x10 #define LCD_DATA_DIR_OUT PF.DDR = 0x1f #define LCD_DATA_OUT(data) do{PF.DR.BYTE &= 0xf0; PF.DR.BYTE |= data & 0x0f;}while(0) #define LCD_RW PE.DR.BIT.B7 #define LCD_E PE.DR.BIT.B6 #define LCD_RS PF.DR.BIT.B4 #define LCD_RW_LO LCD_RW = 0 #define LCD_RW_HI LCD_RW = 1 #define LCD_E_LO LCD_E = 0 #define LCD_E_HI LCD_E = 1 #define LCD_RS_LO LCD_RS = 0 #define LCD_RS_HI LCD_RS = 1 /*************************************************************************/ /* その他の定義 */ /*************************************************************************/ #define DATA_MODE 0 /*データを書込みモード*/ #define CMD_MODE 1 /*コマンドを書込みモード*/ #define FUNCTIONSET LcdWrite(CMD_MODE,0x28) /*ファンクションセットで4bitモードを選択*/ #define DISPLAYOFF LcdWrite(CMD_MODE,0x08) /*表示OFF*/ #define DISPLAYON LcdWrite(CMD_MODE,0x0c) /*表示ON*/ #define DISPLAYCLEAR LcdWrite(CMD_MODE,0x01) /*表示クリア*/ #define ENTRYMODESET LcdWrite(CMD_MODE,0x06) /*インクリメント、表示をシフトしない*/ #define CURSORHOME LcdWrite(CMD_MODE,0x02) /*カーソルホーム*/ #define LINE1 LcdWrite(CMD_MODE,0x80+0x00) /*一行目*/ #define LINE2 LcdWrite(CMD_MODE,0x80+0x40) /*二行目*/ #define LINE3 LcdWrite(CMD_MODE,0x80+0x14) /*三行目*/ #define LINE4 LcdWrite(CMD_MODE,0x80+0x54) /*四行目*/ #define ROWSIZE 16 #define COLSIZE 2 #define LCDBUFFERSIZE (ROWSIZE * COLSIZE) /*************************************************************************/ /* プロトタイプ宣言 */ /*************************************************************************/ static void LcdWrite( int mode, char c ); static void LcdWrite4( char c ); static char LcdRead4( void ); static void WaitBusyNegate( void ); /*************************************************************************/ /* 大域変数宣言 */ /*************************************************************************/ char LcdBuf[ LCDBUFFERSIZE ]; /*LCD用の表示バッファ*/ static int c_x; /*バッファ上のカーソル位置*/ static int c_y; /*バッファ上のカーソル位置*/ /*************************************************************************/ /* 時間待ち処理 */ /*************************************************************************/ static void WaitMs( volatile long tim ) { volatile long i; for( ; tim > 0; tim-- ) { for( i = 0; i < 4360; i++ ) ; } } /*************************************************************************/ /* 4bit単位でのLCD書込み処理 */ /* 引数cはLCDにコマンドを書込むかデータ、但し上位4bitのみ有効 */ /*************************************************************************/ static void LcdWrite4( char c ) { LCD_E_HI; /*Ebitを立てる*/ LCD_E_HI; /*Ebitを立てる*/ LCD_DATA_OUT(c); /*データ書込み*/ LCD_DATA_OUT(c); /*データ書込み*/ LCD_E_LO; /*Ebitを下げると書き込まれる*/ } /*************************************************************************/ /* 4bit単位でのLCD読み込み処理 */ /*************************************************************************/ static char LcdRead4( void ) { char temp; LCD_DATA_DIR_IN; /*データバスを入力に変更*/ LCD_RS_LO; /*RSを下げる*/ LCD_RW_HI; /*RWbitを立てる*/ LCD_RW_HI; /*RWbitを立てる*/ LCD_E_HI; /*Ebitを立てる*/ LCD_E_HI; /*Ebitを立てる*/ temp = PF.PORT.BYTE & 0x0f; LCD_E_LO; /*Ebitを下げる*/ LCD_E_LO; /*Ebitを下げる*/ LCD_RW_LO; /*RWbitを下げる*/ LCD_DATA_DIR_OUT; /*データバスを出力に変更*/ return temp; } /*************************************************************************/ /* LCD書込み処理 */ /* 引数modeはLCDにコマンドを書込むか、データを書込むかを選択 */ /*************************************************************************/ static void LcdWrite( int mode, char c ) { /*データモードとコマンドモードの切り換え*/ if( mode == DATA_MODE ) LCD_RS_HI; else LCD_RS_LO; LcdWrite4( c >> 4 ); /*上位4bitを書き込む*/ LcdWrite4( c ); /*下位4bitを書き込む*/ // WaitMs( 1 ); /*1ms以上待つ*/ WaitBusyNegate(); } /*************************************************************************/ /* SC1602 BUSY確認処理 */ /* BUSY FLAGが落ちるまで待つ */ /*************************************************************************/ static void WaitBusyNegate( void ) { volatile char msb,lsb; while( 1 ) { msb = LcdRead4(); lsb = LcdRead4(); if( !(msb & 0x08) ) break; } } /*************************************************************************/ /* locate */ /* 画面表示位置設定処理 */ /*************************************************************************/ void LCD_Locate(int x,int y) { c_x = x; c_y = y; } /*************************************************************************/ /* refresh */ /* 画面更新処理 */ /*************************************************************************/ void LCD_Refresh( void ) { int i; /* DISPLAYCLEAR; */ CURSORHOME; LINE1; /*一行目の入力*/ for(i = 0; i < LCDBUFFERSIZE; i++) { switch ( i ) { case ROWSIZE : LINE2; break; /*二行目*/ default: break; } LcdWrite( DATA_MODE, LcdBuf[ i ] ); } } /*************************************************************************/ /* CLS */ /*************************************************************************/ void LCD_Cls( void ) { c_x = c_y = 0; memset( LcdBuf, ' ', sizeof(LcdBuf) ); } /*************************************************************************/ /* SC1602初期化 */ /* LCDを4bitバスモードに設定する */ /*************************************************************************/ void SC1602_Init( void ) { memset( LcdBuf, ' ', sizeof(LcdBuf) ); /*ポートの初期化が必要*/ PE.DDR = 0xc0; /*PEの6,7を出力に変更*/ PF.DDR = 0x1f; /*PFの0~4を出力に変更*/ PE.DR.BYTE &= 0x3f; /*始めは何でもLO出力*/ PF.DR.BYTE = 0x00; /*始めは何でもLO出力*/ LcdWrite4( 0x03 ); /*3を書くらしい*/ WaitMs( 5 ); /*4.1ms以上待つ*/ LcdWrite4( 0x03 ); /*3を書くらしい*/ WaitMs( 1 ); /*1ms以上待つ*/ LcdWrite4( 0x03 ); /*3を書くらしい*/ WaitMs( 1 ); /*1ms以上待つ*/ LcdWrite4( 0x02 ); /*2を書くらしい*/ /*初期設定*/ FUNCTIONSET; FUNCTIONSET; DISPLAYOFF; ENTRYMODESET; DISPLAYCLEAR; WaitMs( 1 ); /*待ち*/ CURSORHOME; WaitMs( 1 ); /*待ち*/ DISPLAYON; } /*************************************************************************/ /* main */ /*************************************************************************/ void main(void); #ifdef __cplusplus extern "C" { void abort(void); } #endif void main(void) { int i; const char msg[] = "モウスグDOSガ ウゴキソウデス"; const char msg2[] = "ソンナ ワケ ナイデスネ"; PM.DDR = 0x08; PM.DR.BIT.B3 = 0; SC1602_Init(); memcpy( LcdBuf, msg, sizeof(msg) - 1 ); LCD_Refresh(); for( ;; ) { WaitMs( 2000 ); /*待ち*/ LCD_Cls(); PM.DR.BIT.B3 ^= 1; memcpy( LcdBuf, msg, sizeof(msg) - 1 ); LCD_Refresh(); WaitMs( 2000 ); /*待ち*/ LCD_Cls(); PM.DR.BIT.B3 ^= 1; memcpy( LcdBuf, msg2, sizeof(msg2) - 1 ); LCD_Refresh(); } } #ifdef __cplusplus void abort(void) { } #endif /*********************************************************************************/ /* end of file */ /* designed by hamayan since 2009/05/21 */ /*********************************************************************************/
SuperHで学ぶμITRON仕様OS―リアルタイムOSの動作原理と実装法がわかる!
- 作者: 鹿取 祐二
- 出版社/メーカー: 電波新聞社
- 発売日: 2005/12
- メディア: 単行本
2010-03-02 22:20
nice!(0)
コメント(1)
トラックバック(0)
そのまんま動かしてみました。おまけに LCD が 5V 用だったものでコントラスト用に乾電池で負電圧をかけると言う手抜きです。
by masato (2010-03-14 22:15)