⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.c

📁 USBhost source
💻 C
字号:
/**
*	Lcd.c		HD44780 LCD僐儞僩儘乕儔僪儔僀僶乮俀侽寘亊係峴懳墳乯
*
*	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 )
{
}


/**
*	俴俠俢偵僨乕僞彂偔
*/
void	lcdwrite( unsigned char data )
{
	WRITE_MODE( );

	NEGATE_RW( );
	nop( );

	WRITE_DATA( data );
	ASSERT_E( );
	nop( );
	NEGATE_E( );
}


/**
*	俴俠俢偐傜僨乕僞撉傓
*/
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;


/**
*	俴俠俢弶婜壔
*/
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 */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -