SSブログ

USBじゃあないけれど、、、 [USB]

USBは単なる電源供給ラインにしか過ぎませんが、キャラクタLCDを例のJB8 USB開発ボードに接続してみました。

まあ、ソフトウエアwaitのところは適当なんで、その内タイミングを調べてみますけど。

※プログラムには記述されていませんが、LCDは電源投入後、一定時間経過してから初期化する必要が有ります。

※勿論USBのデバックにも使用するつもりです。

/************************************************************/
/* JB8でキャラクタLCDを動かす                               */
/*              Copyright (c) せくすぃ部長 since 2007/11/25 */
/************************************************************/
#include <hidef.h> /* for EnableInterrupts macro */
#include <string.h> /**/
#include "derivative.h" /* include peripheral declarations */

#define  __CPU_CLOCK__  (6000000UL)
#define  __BUS_CLOCK__  (3000000UL)

#define  RS_bit     PTE_PTE1    /**/
#define  E_bit      PTC_PTC0    /**/

union sc1602
{
  unsigned char BYTE;
  struct
  {
    unsigned char RSV1:4;
    unsigned char DATA:4;
  } BIT;
};

#define  LCD (*(volatile union sc1602 *)&PTA)

#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  CURSORON        LcdWrite(CMD_MODE,0x0f)     /*カーソルON*/
#define  CURSOROFF       LcdWrite(CMD_MODE,0x0c)     /*カーソルOFF*/
#define  ROWSIZE         16
#define  COLSIZE         2
#define  LCDBUFFERSIZE   (ROWSIZE * COLSIZE)

#define  WAIT_1U    { __asm nop; __asm nop; __asm nop; }
#define  ms_wait( tim )  soft_wait( tim )  /**/

/************************************************************/
/* 大域変数の皆さん                                         */
/************************************************************/
char LcdBuf[ LCDBUFFERSIZE ];  /*LCD用の表示バッファ*/

/************************************************************/
/* プロトタイプ宣言の皆さん                                 */
/************************************************************/
static void wait10u( volatile int tim );
static void soft_wait( volatile int tim );
static void LcdWrite( int mode, char c );
static void LcdWrite4( char c );
void LCD_Refresh( void );
void LCD_Cls( void );
void LCDInit( void );

/************************************************************/
/* ソフトウエアWAIT 引数はmsとする                          */
/************************************************************/
static void soft_wait( volatile int tim )
{
  tim *= 100;

  wait10u( tim );
}

static void wait10u( volatile int tim )
{
  for( ; tim > 0; tim-- )
  {
    WAIT_1U;
    WAIT_1U;
    WAIT_1U;
    WAIT_1U;
    WAIT_1U;
    WAIT_1U;
    WAIT_1U;
    WAIT_1U;
    WAIT_1U;
    WAIT_1U;
  }
}

/************************************************************/
/* 4bit単位でのLCD書込み処理                                */
/* 引数cはLCDにコマンドを書込むかデータ、但し上位4bitのみ有 */
/* 効                                                       */
/************************************************************/
static void LcdWrite4( char c )
{
  E_bit = 1;  /*Ebitを立てる*/
  LCD.BIT.DATA = c;  /*データ書込み*/
  E_bit = 0;  /*Ebitを下げると書き込まれる*/
}

/************************************************************/
/* LCD書込み処理                                            */
/* 引数modeはLCDにコマンドを書込むか、データを書込むかを    */
/* 選択                                                      */
/************************************************************/
static void LcdWrite( int mode, char c )
{
  RS_bit = ( mode == DATA_MODE ) ? 1 : 0;  /*データモードとコマンドモードの切り換え*/
  LcdWrite4( c >> 4 );  /*上位4bitを書き込む*/
  LcdWrite4( c );  /*下位4bitを書き込む*/
  wait10u( 5 );
}

/************************************************************/
/* refresh                                                  */
/* 画面更新処理                                             */
/************************************************************/
void LCD_Refresh( void )
{
  int i;

/*  DISPLAYCLEAR;  */
  CURSORHOME;
  wait10u( 172 );  /*1.64ms以上待つ*/
  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 )
{
  (void)memset( LcdBuf, ' ', sizeof(LcdBuf) );
}

/************************************************************/
/*  初期化処理                                              */
/*  LCDを4bitバスモードに設定する                           */
/************************************************************/
void LCDInit( void )
{
  LCD_Cls();
  /*ソフトウエアRESET*/
  RS_bit = 0;
  E_bit = 0;	/*RS=E=RW=0*/
  LcdWrite4( 0x03 );  /*3を書くらしい*/
  ms_wait( 5 );       /*4.1ms以上待つ*/
  LcdWrite4( 0x03 );  /*3を書くらしい*/
  ms_wait( 1 );       /*1ms以上待つ*/
  LcdWrite4( 0x03 );  /*3を書くらしい*/
  ms_wait( 1 );       /*1ms以上待つ*/
  LcdWrite4( 0x02 );  /*2を書くらしい*/
  /*初期設定*/
  FUNCTIONSET;
  FUNCTIONSET;
  DISPLAYOFF;
  ENTRYMODESET;
  DISPLAYCLEAR;
  ms_wait( 1 );        /*待ち*/
  CURSORHOME;
  ms_wait( 1 );        /*待ち*/
  DISPLAYON;
}

/************************************************************/
/* プログラムmain                                           */
/************************************************************/
void main( void )
{
  static const char msg[] = {"モウスグVISTAガ ウゴキソウデス"};

  /*WDTの停止*/
  CONFIG_COPD = 1;

  /*入出力ポートの設定*/
  DDRA = 0xf0;  /*ポートAの4~7がデータ 0b1111 0000*/
  DDRC = 0x01;  /*ポートCの0がEbit 0b0000 0001*/
  DDRE = 0x02;  /*ポートEの1がRSbitを制御する 0b0000 0010*/

/*  EnableInterrupts;*/ /* enable interrupts */

  LCDInit();
  (void)strncpy( LcdBuf, msg, sizeof(msg) - 1 );
  LCD_Refresh();

  for(;;) ;
}
/************************************************************/
/*              Copyright (c) せくすぃ部長 since 2007/11/25 */
/************************************************************/


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

nice! 0

コメント 0

コメントを書く

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

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

トラックバック 0

新しいGadgetを入手TRONSHOWへのお誘い ブログトップ

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