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 */