📄 drv_hd44780.c
字号:
/*************************************************************************
*
* 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"
/* 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 0x84803C00
typedef struct
{
LPC_INT32U :10;
LPC_INT32U DataIO : 4;
LPC_INT32U : 9;
LPC_INT32U RS : 1;
LPC_INT32U : 2;
LPC_INT32U E : 1;
LPC_INT32U : 4;
LPC_INT32U R_W : 1;
} 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;
/* Init MCU IO */
PINSEL0 &= ~0x0FF00000;
PINSEL1 &= ~0xC030C000;
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 */
Command = HD44780_FUNCTION_SET;
if (HD4478_Ctrl.Interface)
{
Command |= HD44780_FUNCTION_SET_8_BIT;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -