📄 drv_hd44780.c
字号:
* 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 display mode: Display On/Off; Cursor On/Off
* Cursor blink On/Off
*************************************************************************/
HD44780_ERROR_CODE_DEF HD44780_SetMode (void)
{
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,HD44780_FIRST_COMM_DLY);
}
/*************************************************************************
* Function Name: HD44780_ClearDisplay
* Parameters: none
* Return: HD44780_ERROR_CODE_DEF
* HD44780_OK 0: Pass
* HD44780_ERROR 1: Busy check Time Out
* Description: Clear display and set position to home
*
*************************************************************************/
HD44780_ERROR_CODE_DEF HD44780_ClearDisplay (void)
{
#if HD4780_WR == 0
DataRamAddHold = 0;
#endif
HD4478_Ctrl.DisplayPos = 0;
HD44780WrComm(HD44780_CLEAR);
return HD44780_BusyCheck(NULL,HD44780_MAX_COMM_DLY);
}
/*************************************************************************
* 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)
{
#if HD4780_WR == 0
DataRamAddHold = 0;
#endif
HD4478_Ctrl.DisplayPos = 0;
HD44780WrComm(HD44780_RETURN);
return HD44780_BusyCheck(NULL,HD44780_MAX_COMM_DLY);
}
/*************************************************************************
* Function Name: HD44780_GetDisplayPosition
* Parameters: none
* Return: Int8U
*
* Description: Return X coordinate of visual part
*
*************************************************************************/
Int8U HD44780_GetDisplayPosition (void)
{
return HD4478_Ctrl.DisplayPos;
}
/*************************************************************************
* Function Name: HD44780_DisplayShift
* Parameters: Boolean DisplayOn, Int8S DisplayShift
* 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 (Boolean DisplayOn, Int8S DisplayShift)
{
Int8U ShiftDir;
if (DisplayShift >= 0)
{
if(DisplayShift > HD44780_MAX_LINE1_ADD)
{
return HD44780_ERROR;
}
ShiftDir = HD44780_DISPLAY_MOVE_RIGHT;
}
else
{
if(DisplayShift < -HD44780_MAX_LINE2_ADD)
{
return HD44780_ERROR;
}
ShiftDir = HD44780_DISPLAY_MOVE_LEFT;
DisplayShift = 0 - DisplayShift; /* DisplayShift = -DisplayShift */
}
for (int i = 0; i < DisplayShift; ++i)
{
HD44780WrComm(HD44780_DISPLAY_MOVE + HD44780_DISPLAY_MOVE_D + ShiftDir);
if (HD44780_BusyCheck(NULL,HD44780_SECOND_COMM_DLY) != HD44780_OK)
{
return HD44780_ERROR;
}
if (ShiftDir == HD44780_DISPLAY_MOVE_LEFT)
{
if(++HD4478_Ctrl.DisplayPos > HD44780_MAX_LINE1_ADD)
{
HD4478_Ctrl.DisplayPos = 0;
}
}
else
{
if(--HD4478_Ctrl.DisplayPos > HD44780_MAX_LINE1_ADD) /* --0 = 0xFF > 39 */
{
HD4478_Ctrl.DisplayPos = HD44780_MAX_LINE1_ADD;
}
}
}
return HD44780_OK;
}
/*************************************************************************
* Function Name: HD44780_CursorPosSet
* Parameters: Boolean CursorOn,Boolean CursorBlink,
* 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 (Boolean CursorOn,Boolean CursorBlink, HD44780_XY_DEF X, HD44780_XY_DEF Y)
{
Int8U CursorPos;
/* Find Address 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 HD4780_WR == 0
DataRamAddHold = CursorPos;
#endif
if (HD44780_BusyCheck(NULL,HD44780_SECOND_COMM_DLY) != HD44780_OK)
{
return HD44780_ERROR;
}
/* Set Cursor dependence of CursorOn */
HD4478_Ctrl.CursorOn = CursorOn;
HD4478_Ctrl.CursorBlink = CursorBlink;
return HD44780_SetMode();
}
#if HD4780_WR > 0
/*************************************************************************
* Function Name: HD44780_RdCGRAM
* Parameters: HD44780_STRING_DEF * CG_Data,
* Int8U CGRAM_Add
* Return: HD44780_ERROR_CODE_DEF
* HD44780_OK 0: Pass
* HD44780_ERROR 1: Busy check Time Out
* Description: Read Character pattern from CGRAM
*
*************************************************************************/
HD44780_ERROR_CODE_DEF HD44780_RdCGRAM (HD44780_STRING_DEF * CG_Data, Int8U CGRAM_Add)
{
Int8U Counter = 8;
Int8U DDRAM_AddHold;
if (CGRAM_Add > HD44780_MAX_CGRAM)
{
return HD44780_ERROR;
}
/* Get current DDRAM address */
if (HD44780_BusyCheck(&DDRAM_AddHold,HD44780_SECOND_COMM_DLY) != HD44780_OK)
{
return HD44780_ERROR;
}
if (HD4478_Ctrl.DotMode)
{
Counter = 10;
/* Address align to characters space */
CGRAM_Add &= 0xF;
}
else
{
Counter = 8;
/* Address align to characters space */
CGRAM_Add &= 0x7;
}
/* Set CGRAM Address */
HD44780WrComm(HD44780_SET_CGRAM_ADD + CGRAM_Add);
if (HD44780_BusyCheck(NULL,HD44780_SECOND_COMM_DLY) != HD44780_OK)
{
return HD44780_ERROR;
}
for ( ;Counter; --Counter)
{
*CG_Data = HD44780RdData();
if (HD44780_BusyCheck(NULL,HD44780_SECOND_COMM_DLY) != HD44780_OK)
{
break;
}
++CG_Data;
}
HD44780WrComm(HD44780_SET_DDRAM_ADD + DDRAM_AddHold);
return((HD44780_ERROR_CODE_DEF)(HD44780_BusyCheck(NULL,HD44780_SECOND_COMM_DLY) || (Counter?HD44780_ERROR:HD44780_OK)));
}
#endif
/*************************************************************************
* Function Name: HD44780_WrCGRAM
* Parameters: const HD44780_STRING_DEF * CG_Data,
* Int8U CGRAM_Add
* Return: HD44780_ERROR_CODE_DEF
* HD44780_OK 0: Pass
* HD44780_ERROR 1: Busy check Time Out
* Description: Write Character pattern into CGRAM
*
*************************************************************************/
HD44780_ERROR_CODE_DEF HD44780_WrCGRAM (const HD44780_STRING_DEF * CG_Data, Int8U CGRAM_Add)
{
Int8U Counter = 8;
Int8U DDRAM_AddHold;
/* Get current DDRAM address */
if (HD44780_BusyCheck(&DDRAM_AddHold,HD44780_SECOND_COMM_DLY) != HD44780_OK)
{
return HD44780_ERROR;
}
if (HD4478_Ctrl.DotMode)
{
Counter = 10;
/* Address align to characters space */
CGRAM_Add &= 0xF;
}
else
{
Counter = 8;
/* Address align to characters space */
CGRAM_Add &= 0x7;
}
CGRAM_Add *= Counter;
if (CGRAM_Add > HD44780_MAX_CGRAM)
{
return HD44780_ERROR;
}
/* Set CGRAM Address */
HD44780WrComm(HD44780_SET_CGRAM_ADD + CGRAM_Add);
if (HD44780_BusyCheck(NULL,HD44780_SECOND_COMM_DLY) != HD44780_OK)
{
return HD44780_ERROR;
}
for ( ;Counter; --Counter)
{
HD44780WrData(*CG_Data);
if (HD44780_BusyCheck(NULL,HD44780_SECOND_COMM_DLY) != HD44780_OK)
{
break;
}
++CG_Data;
}
HD44780WrComm(HD44780_SET_DDRAM_ADD + DDRAM_AddHold);
return((HD44780_ERROR_CODE_DEF)(HD44780_BusyCheck(NULL,HD44780_SECOND_COMM_DLY) || (Counter?HD44780_ERROR:HD44780_OK)));
}
/*************************************************************************
* Function Name: HD44780_StrShow
* 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)
{
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 HD4780_WR == 0
DataRamAddHold = DDRamAdd;
#endif
if (HD44780_BusyCheck(&DDRamAdd,HD44780_SECOND_COMM_DLY) != HD44780_OK)
{
return HD44780_ERROR;
}
/* Write zero terminate string int LCD */
while (*DataStr)
{
ErrorRes |= HD44780_CheckVisual(DDRamAdd);
HD44780WrData(*DataStr);
#if HD4780_WR == 0
if(HD4478_Ctrl.AC_Direction)
{
if((++DataRamAddHold > HD44780_MAX_LINE1_ADD) && (Y == 1))
{
DataRamAddHold = HD44780_MIN_LINE2_ADD;
}
else if ((Y == 2) && (DataRamAddHold > HD44780_MAX_LINE2_ADD))
{
DataRamAddHold = HD44780_MIN_LINE1_ADD;
}
}
else
{
if((--DataRamAddHold < 0) && (Y == 1))
{
DataRamAddHold = HD44780_MAX_LINE2_ADD;
}
else if ((Y == 2) && (DataRamAddHold < HD44780_MIN_LINE2_ADD))
{
DataRamAddHold = HD44780_MAX_LINE1_ADD;
}
}
#endif
if (HD44780_BusyCheck(&DDRamAdd,HD44780_SECOND_COMM_DLY) != HD44780_OK)
{
return HD44780_ERROR;
}
++DataStr;
if((Y == 1) && DDRamAdd > HD44780_MAX_LINE1_ADD)
{
HD44780WrComm(HD44780_SET_DDRAM_ADD+HD44780_MIN_LINE1_ADD);
#if HD4780_WR == 0
DataRamAddHold = HD44780_MIN_LINE1_ADD;
#endif
if (HD44780_BusyCheck(&DDRamAdd,HD44780_SECOND_COMM_DLY) != HD44780_OK)
{
return HD44780_ERROR;
}
}
else if ((Y == 2) && DDRamAdd < HD44780_MIN_LINE2_ADD)
{
HD44780WrComm(HD44780_SET_DDRAM_ADD+HD44780_MIN_LINE2_ADD);
#if HD4780_WR == 0
DataRamAddHold = HD44780_MIN_LINE2_ADD;
#endif
if (HD44780_BusyCheck(&DDRamAdd,HD44780_SECOND_COMM_DLY) != HD44780_OK)
{
return HD44780_ERROR;
}
}
}
return ErrorRes;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -