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 */
/************************************************************/
コメント 0