drv_hd44780_l.c

来自「最新版IAR FOR ARM(EWARM)5.11中的代码例子」· C语言 代码 · 共 151 行

C
151
字号
/*************************************************************************
 *
 *    Used with ICCARM and AARM.
 *
 *    (c) Copyright IAR Systems 2006
 *
 *    File name   : drv_hd44780_l.c
 *    Description : I/O function
 *
 *    History :
 *    1. Data        :
 *       Author      : Stanimir Bonev
 *       Description : 27, April 2006
 *
 *    $Revision: 6827 $
**************************************************************************/

void HD44780_IO_Init (void);
void HD44780SetRS (Boolean Data);
void HD44780SetE (Boolean Data);
void HD44780WrIO (Int8U);

// PORTB Bit-banding Base address
#define PORTB_DATA_BIT0 ( 0x42000000 + 0x53FC * 0x20 )
#define PORTB_DATA_RS   ( PORTB_DATA_BIT0 + LCD_RS_BIT * 4 )
#define PORTB_DATA_E    ( PORTB_DATA_BIT0 + LCD_E_BIT *  4 )

#if HD4780_WR > 0
void HD44780SetRW (Boolean Data);
Int8U HD44780RdIO (void);

#define PORTB_DATA_WR   (PORTB_DATA_BIT0 + LCD_RW_BIT*4)
#endif

/*************************************************************************
 * Function Name: HD44780_IO_Init
 * Parameters: none
 * Return: none
 * Description: Init IO ports directions and level
 *
 *************************************************************************/
void HD44780_IO_Init (void)
{
  // enable clock
  RCGC2 |= 3;

  // Init DATA IO PORTA
  GPIOAODR  &= ~LCD_DATA;
  GPIOAAFSEL&= ~LCD_DATA;
  GPIOADIR  &= ~LCD_DATA;
  GPIOADEN  |=  LCD_DATA;

  // Init LCD Ctrl PORTB
  GPIOBODR  &= ~(LCD_RS | LCD_RW | LCD_E | LCD_LIGHT);
  GPIOBAFSEL&= ~(LCD_RS | LCD_RW | LCD_E | LCD_LIGHT);
  GPIOBDIR  |=  (LCD_RS | LCD_RW | LCD_E | LCD_LIGHT);
  GPIOBDEN  |=  (LCD_RS | LCD_RW | LCD_E | LCD_LIGHT);

  // RS Ouput - Low
  HD44780SetRS(0);
  // E  Ouput - Low
  HD44780SetE(0);
#if HD4780_WR > 0
  // WR Ouput - Low
  HD44780SetRW(0);
#endif
}

/*************************************************************************
 * Function Name: HD44780SetRS
 * Parameters: Boolean Data
 * Return: none
 * Description: Set RS signal
 *
 *************************************************************************/
void HD44780SetRS (Boolean Data)
{
  *(Int32U *)PORTB_DATA_RS = Data;
}

/*************************************************************************
 * Function Name: HD44780SetE
 * Parameters: Boolean Data
 * Return: none
 * Description: Set E signal
 *
 *************************************************************************/
void HD44780SetE (Boolean Data)
{
  *(Int32U *)PORTB_DATA_E = Data;
}

/*************************************************************************
 * Function Name: HD44780WrIO
 * Parameters: Int8U Data
 * Return: none
 * Description: Write to HD44780 I/O
 *
 *************************************************************************/
void HD44780WrIO (Int8U Data)
{
  // Set Direction
  GPIOADIR  |= LCD_DATA;
#if HD4780_WR > 0
  HD44780SetRW(0);
#endif
  // Write Data
  // Clock E
  HD44780SetE(1);

  GPIOADATA = (Data << LCD_DATA_BIT) & LCD_DATA;
  HD44780_BUS_DLY();
  HD44780SetE(0);
}

#if HD4780_WR > 0
/*************************************************************************
 * Function Name: HD44780SetRW
 * Parameters: Boolean Data
 * Return: none
 * Description: Set R/W signal
 *
 *************************************************************************/
void HD44780SetRW (Boolean Data)
{
  *(Int32U *)PORTB_DATA_WR = Data;
}

/*************************************************************************
 * Function Name: HD44780RdIO
 * Parameters: none
 * Return: Int8U
 * Description: Read from HD44780 I/O
 *
 *************************************************************************/
Int8U HD44780RdIO (void)
{
Int8U Data;
  // Set Direction
  GPIOADIR  &= ~LCD_DATA;
  HD44780SetRW(1);
  // Read Data
  HD44780SetE(1);
  HD44780_BUS_DLY();
  Data = (GPIOADATA &  LCD_DATA) >> LCD_DATA_BIT;
  HD44780SetE(0);
  // Clock E
  return Data;
}
#endif

⌨️ 快捷键说明

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