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

📄 drv_hd44780.c

📁 深圳优龙公司LPC2148开发板(与iar公司开发板基本相同)的原理图和配套样例程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*************************************************************************
 *
 *    Used with ICCARM and AARM.
 *
 *    (c) Copyright IAR Systems 2003
 *
 *    File name   : main.c
 *    Description : Define main module
 *
 *    History :
 *    1. Data   	 : Feb 12, 2005
 *  	 Author 	 : Stanimir Bonev
 *  	 Description : Create
 *
 *    $Revision: 1.3 $
**************************************************************************/
#include "drv_hd44780.h"
#include "drv_hd44780_cnfg.h"

extern void LightCntr( LPC_BOOL On ) ;

/* delay definition */
#define HD44780_POWER_UP_DLY		  400     /* 40 ms (tick 100us) */
#define HD44780_FIRST_COMM_DLY  	  41	  /* 4.1 ms (tick 100us) */
#define HD44780_SECOND_COMM_DLY 	  1 	  /* 100 us (tick 100us) */
#define HD44780_MAX_COMM_DLY		  30	  /* 3ms (tick 100us) */

/* HD44780 command set */
#define HD44780_CLEAR   			  0x01    /* Clear dislplay */
#define HD44780_RETURN  			  0x02    /* Return dispaly to home */

#define HD44780_ENTRY_MODE  		  0x04    /* Set Cursor, Display move and direction */
#define HD44780_ENTRY_MODE_CURSOR_S   0x00
#define HD44780_ENTRY_MODE_BOTH_S     0x01
#define HD44780_ENTRY_MODE_DEC  	  0x00
#define HD44780_ENTRY_MODE_INC  	  0x02

#define HD44780_DISPLAY_CTRL		  0x08    /* Set dispaly and cursor mode */
#define HD44780_DISPLAY_CTRL_C_NORM   0x00
#define HD44780_DISPLAY_CTRL_C_BLINK  0x01
#define HD44780_DISPLAY_CTRL_C_OFF    0x00
#define HD44780_DISPLAY_CTRL_C_ON     0x02
#define HD44780_DISPLAY_CTRL_D_OFF    0x00
#define HD44780_DISPLAY_CTRL_D_ON     0x04

#define HD44780_DISPLAY_MOVE		  0x10    /* Dispaly and cursor move */
#define HD44780_DISPLAY_MOVE_LEFT     0x00
#define HD44780_DISPLAY_MOVE_RIGHT    0x04
#define HD44780_DISPLAY_MOVE_C  	  0x00
#define HD44780_DISPLAY_MOVE_D  	  0x08

#define HD44780_FUNCTION_SET		  0x20    /* Set diplay function */
#define HD44780_FUNCTION_SET_DOT_5_8  0x00
#define HD44780_FUNCTION_SET_DOT_5_10 0x04
#define HD44780_FUNCTION_SET_1_LINE   0x00
#define HD44780_FUNCTION_SET_2_LINE   0x08
#define HD44780_FUNCTION_SET_4_BIT    0x00
#define HD44780_FUNCTION_SET_8_BIT    0x10

#define HD44780_SET_CGRAM_ADD   	  0x40    /* Set AC point to CGRAM */
#define HD44780_SET_DDRAM_ADD   	  0x80    /* Set AC point to DDRAM */

// HD44780 Read Status
#define HD44780_STATUS_AC_MASK  	  0x7F    /* AC Mask */
#define HD44780_STATUS_BUSY_MASK	  0x80    /* Busy Mask */

#define HD44780_BUSY_CHECK  		  TRUE
#define HD44780_NOT_BUSY_CHECK  	  FALSE

/* Display address range definition */
#define HD44780_MIN_LINE1_ADD   	  0x00
#define HD44780_MAX_LINE1_ADD   	  0x27
#define HD44780_MIN_LINE2_ADD   	  0x40
#define HD44780_MAX_LINE2_ADD   	  0x67

#define HD44780_INPUT_SET_MASK  	  ~0x00003C00
#define HD44780_OUTPUT_SET_MASK 	  0x30403C00

typedef struct
{
LPC_INT32U  		:10;
	LPC_INT32U DataIO : 4;
LPC_INT32U  		: 8;
	LPC_INT32U RS : 1;
LPC_INT32U  		: 5;
	LPC_INT32U E : 1;
	LPC_INT32U R_W : 1;
LPC_INT32U  		: 2;
} HD44780_IO_DEF;

volatile HD44780_IO_DEF* HD44780_IO = ( HD44780_IO_DEF* ) 0xE0028000;   /* IOPIN0 */
volatile HD44780_IO_DEF* HD44780_IO_Set = ( HD44780_IO_DEF* ) 0xE0028004;   /* IOSET0 */
volatile HD44780_IO_DEF* HD44780_IO_Clr = ( HD44780_IO_DEF* ) 0xE002800C;   /* IOCLR0 */

HD44780_CTRL_DEF HD4478_Ctrl =
{
	0,  				  /* Dispaly Position */
	HD44780_AC_DIR,   	/* Address counter direction */
	HD44780_MOVE, 		/* Cursor or dispaly move */
	HD44780_INTERFACE,	/* Interface to MCU */
	HD44780_LINE, 		/* Number of line */
	HD44780_DOT_MATRIX,   /* Character Dot matrix */
	HD44780_DISPLAY_STATE,/* Dispaly state On or Off */
	HD44780_CURSOR_STATE, /* Cursor state On or Off */
	HD44780_CURSOR_MODE,  /* Cursor mode Blink or not */
};

/*************************************************************************
 * Function Name: HD44780WrData
 * Parameters: LPC_INT8U Data
 * Return: none
 * Description: Write data to HD44780
 *
 *************************************************************************/
void HD44780WrData( LPC_INT8U Data )
{
	HD44780_IO_Clr->R_W = HD44780_IO_Set->RS = 1;
	HD44780_IO_Set->E = 1;
	if ( HD4478_Ctrl.Interface == HD44780_8_BIT )
	{
		HD44780_IO_Set->DataIO = Data;
		HD44780_IO_Clr->DataIO = ~Data;
	}
	else
	{
		HD44780_IO_Set->DataIO = ( ( Data >> 4 ) & 0xF );
		HD44780_IO_Clr->DataIO = ~( ( Data >> 4 ) & 0xF );
		HD44780_BUS_DLY();
		HD44780_IO_Clr->E = 1;
		HD44780_BUS_DLY();
		HD44780_IO_Set->E = 1;
		HD44780_IO_Set->DataIO = Data & 0xF;
		HD44780_IO_Clr->DataIO = ~( Data & 0xF );
	}
	HD44780_BUS_DLY();
	HD44780_IO_Clr->E = 1;
}

/*************************************************************************
 * Function Name: HD44780RdData
 * Parameters: none
 * Return: LPC_INT8U
 * Description: Read data from HD44780
 *
 *************************************************************************/
LPC_INT8U HD44780RdData( void )
{
	LPC_INT8U Data;
	HD44780_IO_Set->R_W = HD44780_IO_Set->RS = 1;
	IO0DIR &= HD44780_INPUT_SET_MASK;
	HD44780_IO_Set->E = 1;
	if ( HD4478_Ctrl.Interface == HD44780_8_BIT )
	{
		Data = HD44780_IO->DataIO;
	}
	else
	{
		Data = ( HD44780_IO->DataIO << 4 ) & 0xF0;
		HD44780_IO_Clr->E = 1;
		HD44780_BUS_DLY();
		HD44780_IO_Set->E = 1;
		HD44780_BUS_DLY();
		Data |= HD44780_IO->DataIO & 0xF;
	}
	HD44780_IO_Clr->R_W = HD44780_IO_Clr->E = 1;
	IO0DIR |= HD44780_OUTPUT_SET_MASK;
	return Data;
}

/*************************************************************************
 * Function Name: HD44780WrComm
 * Parameters: LPC_INT8U LPC_INT8U Command
 * Return: none
 * Description: Send comand to HD44780
 *
 *************************************************************************/
void HD44780WrComm( LPC_INT8U Command )
{
	HD44780_IO_Clr->R_W = HD44780_IO_Clr->RS = 1;
	HD44780_IO_Set->E = 1;
	if ( HD4478_Ctrl.Interface == HD44780_8_BIT )
	{
		HD44780_IO_Set->DataIO = Command;
		HD44780_IO_Clr->DataIO = ~Command;
	}
	else
	{
		HD44780_IO_Set->DataIO = ( ( Command >> 4 ) & 0xF );
		HD44780_IO_Clr->DataIO = ~( ( Command >> 4 ) & 0xF );
		HD44780_BUS_DLY();
		HD44780_IO_Clr->E = 1;
		HD44780_BUS_DLY();
		HD44780_IO_Set->E = 1;
		HD44780_IO_Set->DataIO = ( Command & 0xF );
		HD44780_IO_Clr->DataIO = ~( Command & 0xF );
	}
	HD44780_BUS_DLY();
	HD44780_IO_Clr->E = 1;
}

/*************************************************************************
 * Function Name: HD44780RdStatus
 * Parameters: none
 * Return: LPC_INT8U
 * Description: Read status of HD44780
 *
 *************************************************************************/
LPC_INT8U HD44780RdStatus( void )
{
	LPC_INT8U Data;
	HD44780_IO_Set->R_W = HD44780_IO_Clr->RS = 1;
	IO0DIR &= HD44780_INPUT_SET_MASK;
	HD44780_IO_Set->E = 1;
	if ( HD4478_Ctrl.Interface == HD44780_8_BIT )
	{
		Data = HD44780_IO->DataIO;
	}
	else
	{
		Data = ( HD44780_IO->DataIO << 4 ) & 0xF0;
		HD44780_BUS_DLY();
		HD44780_IO_Clr->E = 1;
		HD44780_BUS_DLY();
		HD44780_IO_Set->E = 1;
		Data |= HD44780_IO->DataIO & 0xF;
	}
	HD44780_BUS_DLY();
	HD44780_IO_Clr->R_W = HD44780_IO_Clr->E = 1;
	IO0DIR |= HD44780_OUTPUT_SET_MASK;
	return Data;
}

/*************************************************************************
 * Function Name: HD44780_GetDDRamAdd
 * Parameters: HD44780_XY_DEF X,
 *  		   HD44780_XY_DEF Y,
 *  		   LPC_INT8U * DDAdd
 * Return: HD44780_ERROR_CODE_DEF
 *  	   HD44780_OK	 0: Pass
 *	   HD44780_ERROR 2: Out of boundary
 * Description: Calculate DDRAM address by X,Y cooardinate
 *
 *************************************************************************/
HD44780_ERROR_CODE_DEF HD44780_GetDDRamAdd( HD44780_XY_DEF X , HD44780_XY_DEF Y , LPC_INT8U* DDAdd )
{
	/* Find Addres by coordinate */
	if ( Y > 2 )
	{
		return HD44780_ERROR;
	}
	if ( X > HD44780_MAX_LINE1_ADD )
	{
		return HD44780_ERROR;
	}
	*DDAdd = X - 1;
	if ( Y == 2 )
	{
		*DDAdd += HD44780_MIN_LINE2_ADD;
	}
	return HD44780_OK;
}


/*************************************************************************
 * Function Name: HD44780_CheckVisual
 * Parameters: LPC_INT8U DDRamAdd
 * Return: HD44780_ERROR_CODE_DEF
 *  	   HD44780_OK			  : Pass
 *  	   HD44780_ERROR		  : Out of address boundary
 *	   HD44780_OUT_OF_VISUAL  : Out of visual boundary
 * Description: Whether current DDRAM address is into visual area
 *
 *************************************************************************/
HD44780_ERROR_CODE_DEF HD44780_CheckVisual( LPC_INT8U DDRamAdd )
{
	LPC_INT8U LastPos = 0;
	if ( DDRamAdd > HD44780_MAX_LINE2_ADD )
	{
		return HD44780_ERROR;
	}
	if ( ( DDRamAdd > HD44780_MAX_LINE1_ADD ) && ( DDRamAdd < HD44780_MIN_LINE2_ADD ) )
	{
		return HD44780_ERROR;
	}
	if ( DDRamAdd >= HD44780_MIN_LINE2_ADD )
	{
		/* Convert address to line 1 address */
		DDRamAdd -= 0x40;
	}
	LastPos = HD4478_Ctrl.DiplayPos + HD44780_HORIZONTAL_SIZE;
	if ( LastPos > HD44780_MAX_LINE1_ADD )
	{
		if ( ( DDRamAdd > HD44780_MAX_LINE1_ADD - HD4478_Ctrl.DiplayPos ) && ( DDRamAdd < HD4478_Ctrl.DiplayPos ) )
		{
			return HD44780_OUT_OF_VISUAL;
		}
		LastPos = HD44780_MAX_LINE1_ADD;
	}
	if ( ( DDRamAdd < HD4478_Ctrl.DiplayPos ) || ( DDRamAdd > LastPos ) )
	{
		return HD44780_OUT_OF_VISUAL;
	}
	return HD44780_OK;
}

/*************************************************************************
 * Function Name: HD44780_BusyCheck
 * Parameters: LPC_INT8U * AddCount
 * Return: HD44780_ERROR_CODE_DEF
 *  	   HD44780_OK	 0: Pass
 *	   HD44780_ERROR 1: Busy check Time Out
 * Description: Wait until busy flag is clear (Max waiting - 3ms)
 *
 *************************************************************************/
HD44780_ERROR_CODE_DEF HD44780_BusyCheck( LPC_INT8U* AddCount )
{
	LPC_INT8U AddHold;
	for ( int Count = 30; Count; --Count )
	{
		AddHold = HD44780RdStatus();
		if ( ( AddHold & HD44780_STATUS_BUSY_MASK ) == 0 )
		{
			/* Wait 1.5 * Tlcd */
			HD44780_BUS_DLY();
			HD44780_BUS_DLY();
			/* Get current AC */
			AddHold = HD44780RdStatus();
			AddHold &= HD44780_STATUS_AC_MASK;
			if ( AddCount != NULL )
			{
				*AddCount = AddHold;
			}
			return HD44780_OK;
		}
		Dly100us( ( void * ) 1 );
	}
	return HD44780_ERROR;
}

/*************************************************************************
 * Function Name: HD44780_Init
 * Parameters: none
 * Return: HD44780_ERROR_CODE_DEF
 *  	   HD44780_OK	 0: Pass
 *	   HD44780_ERROR 1: Busy check Time Out
 * Description: Init HD44780 after power-up
 *
 *************************************************************************/
HD44780_ERROR_CODE_DEF HD44780_PowerUpInit( void )
{
	LPC_INT8U Command;

	char DataStr1[] =
	{
		"YL-LPC2148_V3.0"
	} ;
	char DataStr2[] =
	{
		"www.ucdragon.com"
	} ;

	/* Init MCU IO */
	PINSEL0 &= ~0x0FF00000;
	PINSEL1 &= ~0x0F003000;
	HD44780_IO_Set->R_W = HD44780_IO_Clr->RS = HD44780_IO_Clr->E = 1;
	IO0DIR |= HD44780_OUTPUT_SET_MASK;
	/* Power up init sequence */
	Dly100us( ( void * ) HD44780_POWER_UP_DLY );
	HD44780WrComm( HD44780_FUNCTION_SET + HD44780_FUNCTION_SET_8_BIT );
	Dly100us( ( void * ) HD44780_FIRST_COMM_DLY );
	HD44780WrComm( HD44780_FUNCTION_SET + HD44780_FUNCTION_SET_8_BIT );
	Dly100us( ( void * ) HD44780_SECOND_COMM_DLY );
	HD44780WrComm( HD44780_FUNCTION_SET + HD44780_FUNCTION_SET_8_BIT );
	if ( HD44780_BusyCheck( NULL ) != HD44780_OK )
	{
		return HD44780_ERROR;
	}

	/* Dispalay Function set   0x28*/
	Command = HD44780_FUNCTION_SET;
	if ( HD4478_Ctrl.Interface )
	{
		Command |= HD44780_FUNCTION_SET_8_BIT;
	}
	if ( HD4478_Ctrl.Line )
	{
		Command |= HD44780_FUNCTION_SET_2_LINE;
	}
	if ( HD4478_Ctrl.DotMode )
	{
		Command |= HD44780_FUNCTION_SET_DOT_5_10;
	}
	HD44780WrComm( Command );
	if ( HD44780_BusyCheck( NULL ) != HD44780_OK )
	{
		return HD44780_ERROR;

⌨️ 快捷键说明

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