SSブログ

H8-SX基板 LCDであのメッセージを表示してみまた。今回は動画付き [RX&SH&H8]

※LCDをポートを叩いて動かす場合、もしかしたら必要無いかもしれないけれど、一応H8/300Hの流儀でアドレス兼用PINを使う為にシングルチップモードにしています。MD0をVCCに接続します。詳しくは配線図を見て。
IMG_1796.JPG勿論HEW+デバックモニタで開発しています。
細かいタイミング調整も、
ソース修正、ビルド、実行、シンクロで確認、またソース修正
って流れが非常に快適に行えます。
是非みなさんも使ってみてくださいね。




下は基板とLCD間のなんとなくな配線図です。
h8sx_with_sc1602_01.png


粗末な物ですが宜しければ
/***********************************************************************/
/*                                                                     */
/*  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の動作原理と実装法がわかる!

SuperHで学ぶμITRON仕様OS―リアルタイムOSの動作原理と実装法がわかる!

  • 作者: 鹿取 祐二
  • 出版社/メーカー: 電波新聞社
  • 発売日: 2005/12
  • メディア: 単行本



H8マイコン+C言語効率アップテクニック

H8マイコン+C言語効率アップテクニック

  • 作者: 鹿取 祐二
  • 出版社/メーカー: オーム社
  • 発売日: 2004/11
  • メディア: 単行本



nice!(0)  コメント(1)  トラックバック(0) 

nice! 0

コメント 1

masato

そのまんま動かしてみました。おまけに LCD が 5V 用だったものでコントラスト用に乾電池で負電圧をかけると言う手抜きです。
by masato (2010-03-14 22:15) 

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。