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

📄 drv_hd44780.c

📁 深圳优龙公司LPC2148开发板(与iar公司开发板基本相同)的原理图和配套样例程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	}

	/* Display off  0x08*/
	HD44780WrComm( HD44780_DISPLAY_CTRL );
	if ( HD44780_BusyCheck( NULL ) != HD44780_OK )
	{
		return HD44780_ERROR;
	}

	/* Display clear  0x01*/
	if ( HD44780_ClearDisplay() != HD44780_OK )
	{
		return HD44780_ERROR;
	}

	/* Set entry mode  0x08*/
	Command = HD44780_ENTRY_MODE;
	if ( HD4478_Ctrl.AC_Direction )
	{
		Command |= HD44780_ENTRY_MODE_INC;
	}
	if ( HD4478_Ctrl.DisplayShift )
	{
		Command |= HD44780_ENTRY_MODE_BOTH_S;
	}
	HD44780WrComm( HD44780_DISPLAY_CTRL );
	if ( HD44780_BusyCheck( NULL ) != HD44780_OK )
	{
		return HD44780_ERROR;
	}

	/* Set Display and cursor mode */
	if ( HD44780_SetMode() != HD44780_OK )
	{
		return HD44780_ERROR;
	}

	HD44780_StrShow( 1 , 1 , ( LPC_INT8S const * ) DataStr1 );
	HD44780_StrShow( 1 , 2 , ( LPC_INT8S const * ) DataStr2 );

	LightCntr( 1 );

	return HD44780_OK;
}

/*************************************************************************
 * Function Name: HD44780_GetSetting
 * Parameters: none
 * Return: HD44780_CTRL_DEF *
 * Description: Return pointer to Driver settings structure
 *
 *************************************************************************/
HD44780_CTRL_DEF* HD44780_GetSetting( void )
{
	return &HD4478_Ctrl;
}

/*************************************************************************
 * Function Name: HD44780_SetMode
 * Parameters: none
 * Return: HD44780_ERROR_CODE_DEF
 *  	   HD44780_OK	 0: Pass
 *	   HD44780_ERROR 1: Busy check Time Out
 * Description: Set diplay mode: Display On/Off; Cursor On/Off
 *  Cursor blink On/Off
 *************************************************************************/
HD44780_ERROR_CODE_DEF HD44780_SetMode( void )
{
	LPC_INT8U Command = HD44780_DISPLAY_CTRL;
	if ( HD4478_Ctrl.DisplayOn )
	{
		Command |= HD44780_DISPLAY_CTRL_D_ON;
	}
	if ( HD4478_Ctrl.CursorOn )
	{
		Command |= HD44780_DISPLAY_CTRL_C_ON;
	}
	if ( HD4478_Ctrl.CursorBlink )
	{
		Command |= HD44780_DISPLAY_CTRL_C_BLINK;
	}
	HD44780WrComm( Command );
	return HD44780_BusyCheck( NULL );
}

/*************************************************************************
 * Function Name: HD44780_ClearDisplay
 * Parameters: none
 * Return: HD44780_ERROR_CODE_DEF
 *  	   HD44780_OK	 0: Pass
 *	   HD44780_ERROR 1: Busy check Time Out
 * Description: Clear dispaly and set position to home
 *
 *************************************************************************/
HD44780_ERROR_CODE_DEF HD44780_ClearDisplay( void )
{
	HD44780WrComm( HD44780_CLEAR );
	return HD44780_BusyCheck( NULL );
}

/*************************************************************************
 * Function Name: HD44780_ReturnToHome
 * Parameters: none
 * Return: HD44780_ERROR_CODE_DEF
 *  	   HD44780_OK	 0: Pass
 *	   HD44780_ERROR 1: Busy check Time Out
 * Description: Set display position to home
 *
 *************************************************************************/
HD44780_ERROR_CODE_DEF HD44780_ReturnToHome( void )
{
	HD44780WrComm( HD44780_RETURN );
	return HD44780_BusyCheck( NULL );
}

/*************************************************************************
 * Function Name: HD44780_DisplayShift
 * Parameters: LPC_BOOL DisplayOn, LPC_INT8S DiplayShift
 * Return: HD44780_ERROR_CODE_DEF
 *  	   HD44780_OK	 0: Pass
 *	   HD44780_ERROR 1: Busy check Time Out
 * Description: Shift display
 *
 *************************************************************************/
HD44780_ERROR_CODE_DEF HD44780_DisplayShift( LPC_BOOL DisplayOn , LPC_INT8S DiplayShift )
{
	LPC_INT8U ShiftDir;
	if ( DiplayShift >= 0 )
	{
		if ( DiplayShift > HD44780_MAX_LINE1_ADD )
		{
			return HD44780_ERROR;
		}
		ShiftDir = HD44780_DISPLAY_MOVE_RIGHT;
	}
	else
	{
		if ( DiplayShift < -HD44780_MAX_LINE2_ADD )
		{
			return HD44780_ERROR;
		}
		ShiftDir = HD44780_DISPLAY_MOVE_LEFT;
		DiplayShift = 0 - DiplayShift;  /* DiplayShift = -DiplayShift */
	}
	for ( int i = 0; i < DiplayShift; ++i )
	{
		HD44780WrComm( HD44780_DISPLAY_MOVE + HD44780_DISPLAY_MOVE_D + ShiftDir );
		if ( HD44780_BusyCheck( NULL ) != HD44780_OK )
		{
			return HD44780_ERROR;
		}
		if ( ShiftDir == HD44780_DISPLAY_MOVE_LEFT )
		{
			if ( ++HD4478_Ctrl.DiplayPos > 39 )
			{
				HD4478_Ctrl.DiplayPos = 0;
			}
		}
		else
		{
			if ( --HD4478_Ctrl.DiplayPos > 39 ) /* --0 = 0xFF > 39 */
			{
				HD4478_Ctrl.DiplayPos = 39;
			}
		}
	}
	return HD44780_OK;
}

/*************************************************************************
 * Function Name: HD44780_CursorPosSet
 * Parameters: LPC_BOOL CursorOn,
 *  		   HD44780_XY_DEF X,
 *  		   HD44780_XY_DEF Y
 * Return: HD44780_ERROR_CODE_DEF
 *  	   HD44780_OK	 0: Pass
 *	   HD44780_ERROR 1: Busy check Time Out
 * Description: Set position of cursor
 *
 *************************************************************************/
HD44780_ERROR_CODE_DEF HD44780_CursorPosSet( LPC_BOOL CursorOn , LPC_BOOL CursorBlink , HD44780_XY_DEF X ,
	HD44780_XY_DEF Y )
{
	LPC_INT8U CursorPos;
	/* Find Addres by coordinate */
	if ( HD44780_GetDDRamAdd( X , Y , &CursorPos ) != HD44780_OK )
	{
		return HD44780_ERROR;
	}
	/* Cursor off */
	HD4478_Ctrl.CursorOn = HD44780_CURSOR_OFF;
	if ( HD44780_SetMode() != HD44780_OK )
	{
		return HD44780_ERROR;
	}
	/* Set Address to DDRAM */
	HD44780WrComm( HD44780_SET_DDRAM_ADD + CursorPos );
	if ( HD44780_BusyCheck( NULL ) != HD44780_OK )
	{
		return HD44780_ERROR;
	}
	/* Set Cursor dependence of CursorOn */
	HD4478_Ctrl.CursorOn = CursorOn;
	HD4478_Ctrl.CursorBlink = CursorBlink;
	return HD44780_SetMode();
}

/*************************************************************************
 * Function Name: HD44780_RdCGRAM
 * Parameters: HD44780_STRING_DEF * CG_Data,
 *  		   LPC_INT8U CGRAM_Add
 * Return: HD44780_ERROR_CODE_DEF
 *  	  HD44780_OK	 0: Pass
 *	  HD44780_ERROR  1: Busy check Time Out
 * Description: Read Character patern from CGRAM
 *
 *************************************************************************/
HD44780_ERROR_CODE_DEF HD44780_RdCGRAM( HD44780_STRING_DEF* CG_Data , LPC_INT8U CGRAM_Add )
{
	LPC_INT8U Counter = 8;
	LPC_INT8U DDRAM_AddHold;
	if ( CGRAM_Add > HD44780_MAX_CGRAM )
	{
		return HD44780_ERROR;
	}
	/* Get current DDRAM address */
	if ( HD44780_BusyCheck( &DDRAM_AddHold ) != HD44780_OK )
	{
		return HD44780_ERROR;
	}
	if ( HD4478_Ctrl.DotMode )
	{
		Counter = 10;
		/* Address aling to chracter space */
		CGRAM_Add &= 0xF;
	}
	else
	{
		Counter = 8;
		/* Address aling to chracter space */
		CGRAM_Add &= 0x7;
	}
	/* Set CGRAM Address */
	HD44780WrComm( HD44780_SET_CGRAM_ADD + Counter );
	if ( HD44780_BusyCheck( NULL ) != HD44780_OK )
	{
		return HD44780_ERROR;
	}
	for ( ; Counter; --Counter )
	{
		*CG_Data = HD44780RdData();
		if ( HD44780_BusyCheck( NULL ) != HD44780_OK )
		{
			break;
		}
		++CG_Data;
	}
	HD44780WrComm( HD44780_SET_DDRAM_ADD + Counter );
	return( ( HD44780_ERROR_CODE_DEF ) ( HD44780_BusyCheck( NULL ) || ( Counter ? HD44780_ERROR : HD44780_OK ) ) );
}

/*************************************************************************
 * Function Name: HD44780_WrCGRAM
 * Parameters: const HD44780_STRING_DEF * CG_Data,
 *  		   LPC_INT8U CGRAM_Add
 * Return: HD44780_ERROR_CODE_DEF
 *  	  HD44780_OK	 0: Pass
 *	  HD44780_ERROR  1: Busy check Time Out
 * Description: Write Charcter patern into CGRAM
 *
 *************************************************************************/
HD44780_ERROR_CODE_DEF HD44780_WrCGRAM( const HD44780_STRING_DEF* CG_Data , LPC_INT8U CGRAM_Add )
{
	LPC_INT8U Counter = 8;
	LPC_INT8U DDRAM_AddHold;
	if ( CGRAM_Add > HD44780_MAX_CGRAM )
	{
		return HD44780_ERROR;
	}
	/* Get current DDRAM address */
	if ( HD44780_BusyCheck( &DDRAM_AddHold ) != HD44780_OK )
	{
		return HD44780_ERROR;
	}
	if ( HD4478_Ctrl.DotMode )
	{
		Counter = 10;
		/* Address aling to chracter space */
		CGRAM_Add &= 0xF;
	}
	else
	{
		Counter = 8;
		/* Address aling to chracter space */
		CGRAM_Add &= 0x7;
	}
	/* Set CGRAM Address */
	HD44780WrComm( HD44780_SET_CGRAM_ADD + Counter );
	if ( HD44780_BusyCheck( NULL ) != HD44780_OK )
	{
		return HD44780_ERROR;
	}
	for ( ; Counter; --Counter )
	{
		HD44780WrData( *CG_Data );
		if ( HD44780_BusyCheck( NULL ) != HD44780_OK )
		{
			break;
		}
		++CG_Data;
	}
	HD44780WrComm( HD44780_SET_DDRAM_ADD + Counter );
	return( ( HD44780_ERROR_CODE_DEF ) ( HD44780_BusyCheck( NULL ) || ( Counter ? HD44780_ERROR : HD44780_OK ) ) );
}

/*************************************************************************
 * Function Name: Menu
 * Parameters: none
 * Return: MENU_ERROR_CODE_DEF
 *  	  HD44780_OK	 0: Pass
 *	  HD44780_ERROR  1: Busy check TimeOut
 * Description: Show zero terminate string into LCD
 *
 *************************************************************************/
HD44780_ERROR_CODE_DEF HD44780_StrShow( HD44780_XY_DEF X , HD44780_XY_DEF Y , const HD44780_STRING_DEF* DataStr )
{
	LPC_INT8U DDRamAdd;

	HD44780_ERROR_CODE_DEF ErrorRes = HD44780_OK;
	if ( HD44780_GetDDRamAdd( X , Y , &DDRamAdd ) != HD44780_OK )
	{
		return HD44780_ERROR;
	}
	/* Set Address to DDRAM */
	HD44780WrComm( HD44780_SET_DDRAM_ADD + DDRamAdd );
	if ( HD44780_BusyCheck( &DDRamAdd ) != HD44780_OK )
	{
		return HD44780_ERROR;
	}

	/* Write zero terminate string int LCD */
	while ( *DataStr )
	{
		ErrorRes |= HD44780_CheckVisual( DDRamAdd );
		HD44780WrData( *DataStr );
		if ( HD44780_BusyCheck( &DDRamAdd ) != HD44780_OK )
		{
			return HD44780_ERROR;
		}
		++DataStr;
		if ( ( Y == 1 ) && DDRamAdd > HD44780_MAX_LINE1_ADD )
		{
			HD44780WrComm( HD44780_SET_DDRAM_ADD + HD44780_MIN_LINE1_ADD );
			if ( HD44780_BusyCheck( &DDRamAdd ) != HD44780_OK )
			{
				return HD44780_ERROR;
			}
		}
		else if ( ( Y == 2 ) && DDRamAdd < HD44780_MIN_LINE2_ADD )
		{
			HD44780WrComm( HD44780_SET_DDRAM_ADD + HD44780_MIN_LINE2_ADD );
			if ( HD44780_BusyCheck( &DDRamAdd ) != HD44780_OK )
			{
				return HD44780_ERROR;
			}
		}
	}
	return ErrorRes;
}

/********************************************************************************************************************
【函数名称】void LCD1602_Test( void )
【功能描述】LCD显示测试
【参数输入】无
【参数返回】无
********************************************************************************************************************/
void LCD1602_Test( void )
{
	char DataStr1[] =
	{
		"0123456789abcdef"
	} ;
	char DataStr2[] =
	{
		"ABCDEFG#@$%^(*)&"
	} ;

	UART_PutStringByPolling( UART0 , "\nLCD1602 Test\n" );

	HD44780_StrShow( 1 , 1 , ( LPC_INT8S const * ) DataStr1 );
	HD44780_StrShow( 1 , 2 , ( LPC_INT8S const * ) DataStr2 );

	HD44780_StrShow( 1 , 1 , ( LPC_INT8S const * ) DataStr1 );
	HD44780_StrShow( 1 , 2 , ( LPC_INT8S const * ) DataStr2 );
}

⌨️ 快捷键说明

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