📄 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"
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 + -