www.pudn.com > usbhost_source.rar > LCD.C


/** 
*	Lcd.c		HD44780 LCDコントローラドライバ(20桁×4行対応) 
* 
*	PB	I/O	LCD (Data8bit) 
*				b0- D0 
*				b1- D1 
*				b2- D2 
*				b3- D3 
*				b4- D4 
*				b5- D5 
*				b6- D6 
*				b7- D7 
*	PA	O		b3- E 
*				b4- R/~W 
*				b7- RS 
* 
*/ 
#include	"ut.h" 
#include	"lcd.h" 
#include	"h8_3052f.h" 
 
 
#define ASSERT_E( )	{ PADR |= 0x08; } 
#define ASSERT_RW( )	{ PADR |= 0x10; } 
#define ASSERT_RS( )	{ PADR |= 0x80; } 
 
#define NEGATE_E( )	{ PADR &= 0xf7; } 
#define NEGATE_RW( )	{ PADR &= 0xef; } 
#define NEGATE_RS( )	{ PADR &= 0x7f; } 
 
#define WRITE_MODE( )	{ PBDDR = 0xff; } 
#define WRITE_DATA( x )	{ PBDR = x; } 
 
#define READ_MODE( )	{ PBDDR = 0; } 
#define READ_DATA( )	( PBDR ) 
 
#define	WAITBUSY( )	while( lcdbusy( ) ) 
 
 
/** 
*	何もしない 
*/ 
static	void nop( void ) 
{ 
} 
 
 
/** 
*	LCDにデータ書く 
*/ 
void	lcdwrite( unsigned char data ) 
{ 
	WRITE_MODE( ); 
 
	NEGATE_RW( ); 
	nop( ); 
 
	WRITE_DATA( data ); 
	ASSERT_E( ); 
	nop( ); 
	NEGATE_E( ); 
} 
 
 
/** 
*	LCDからデータ読む 
*/ 
unsigned char	lcdread( void ) 
{ 
	unsigned char	data; 
 
	READ_MODE( ); 
 
	ASSERT_RW( ); 
	nop( ); 
 
	ASSERT_E( ); 
	nop( ); 
	data = READ_DATA( ); 
	NEGATE_E( ); 
 
	return data; 
} 
 
 
/** 
*	インストラクション書く 
*/ 
void	lcdwriteir( unsigned char data ) 
{ 
	NEGATE_RS( ); 
	lcdwrite( data ); 
} 
 
 
/** 
*	インストラクション読む 
*/ 
unsigned char	lcdreadir( void ) 
{ 
	NEGATE_RS( ); 
	return	lcdread( ); 
} 
 
 
/** 
*	データレジスタ書く 
*/ 
void	lcdwritedr( unsigned char data ) 
{ 
	ASSERT_RS( ); 
	lcdwrite( data ); 
} 
 
 
/** 
*	データレジスタ読む 
*/ 
unsigned char	lcdreaddr( void ) 
{ 
	ASSERT_RS( ); 
	return	lcdread( ); 
} 
 
 
/** 
*	ビジー状態取る 
*/ 
short	lcdbusy( void ) 
{ 
	return	lcdreadir( ) & 0x80; 
} 
 
 
char	lcdx, lcdy; 
 
 
/** 
*	LCD初期化 
*/ 
void	lcdinit( void ) 
{ 
	/* 初期化シーケンス */ 
	waitms( 20 );			/* Wait 20 ms */ 
	lcdwriteir( 0x30 ); 
	waitms( 5 ); 
	lcdwriteir( 0x30 ); 
	waitms( 1 ); 
	lcdwriteir( 0x30 ); 
	waitms( 1 ); 
	lcdwriteir( 0x30 );		/* Data length 8bits */ 
	waitms( 1 ); 
	WAITBUSY( ); 
	lcdwriteir( 0x38 );		/* Set function */ 
	WAITBUSY( ); 
	lcdwriteir( 0x08 );		/* Display off, cursor off, blink off */ 
	WAITBUSY( ); 
	lcdwriteir( 0x01 );		/* Clear display */ 
	WAITBUSY( ); 
	lcdwriteir( 0x06 );		/* Entry mode : cursor increment */ 
	WAITBUSY( ); 
	lcdwriteir( 0x0C );		/* Display on, cursor off, blink off */ 
 
	lcdx = lcdy = 0; 
} 
 
/** 
*	カーソル位置指定 
*/ 
void	lcdlocate( char x, char y ) 
{ 
	char	addr; 
 
	switch ( y ){ 
		case 0:		addr = 0x00 + x;	break; 
		case 1:		addr = 0x40 + x;	break; 
		case 2:		addr = 0x14 + x;	break; 
		case 3:		addr = 0x54 + x;	break; 
		default: 
			return; 
	} 
 
	lcdx = x; 
	lcdy = y; 
	WAITBUSY( ); 
	lcdwriteir( 0x80 | addr );		/* Set DD RAM address */ 
} 
 
 
/** 
*	画面クリア 
*/ 
void	lcdcls( void ) 
{ 
	WAITBUSY( ); 
	lcdwriteir( 0x01 ); 
	lcdx = lcdy = 0; 
} 
 
 
/** 
*	カーソル表示・非表示 
*/ 
void	lcddispcursor( char on ) 
{ 
	WAITBUSY( ); 
	lcdwriteir( 0x0C | ( on ? 0x02 : 0 ) ); 
} 
 
 
/** 
*	バックスペース 
*/ 
void	lcdbs( void ) 
{ 
	if( lcdx == 0 ){ 
		return; 
	} 
	lcdx--; 
	lcdlocate( lcdx, lcdy ); 
} 
 
 
/** 
*	一文字表示 
*/ 
void	lcdputch( char c ) 
{ 
	if( c == '\b' ){ 
		lcdbs( );  
		return; 
	} 
	WAITBUSY( ); 
	lcdwritedr( c ); 
	lcdx++; 
} 
 
 
/** 
*	指定位置に一文字表示(キャラクタコード指定可) 
*/ 
void	lcdputcode( char x, char y, char code ) 
{ 
	lcdlocate( x, y ); 
	WAITBUSY( ); 
	lcdwritedr( code ); 
} 
 
 
/** 
*	文字列表示 
*/ 
void	lcdputstr( char *str ) 
{ 
	while( *str != '\0' ){ 
		lcdputch( *( str++ ) ); 
	} 
} 
 
 
/** 
*	位置を指定して文字列を表示する 
*/ 
void	lcdprint( char x, char y, char *str ) 
{ 
	lcdlocate( x, y ); 
	lcdputstr( str ); 
} 
 
 
/** 
*	指定位置から指定数の文字を消す 
*/ 
void	lcdspace( char x, char y, char cnt ) 
{ 
	char	i; 
 
	lcdlocate( x + i, y ); 
	for( i = 0; i < cnt; i++ ){ 
		lcdputch( ' ' ); 
	} 
} 
 
 
/** 
*	一行クリア 
*/ 
void	lcdlcls( char line ) 
{ 
	lcdspace( 0, line, 16 ); 
} 
 
 
/* end of lcd.c */