/*!
* \file alcd.c
* \brief
* A target independent Alpharithmetic LCD driver
*
* Copyright (C) 2014 Christos Choutouridis (http://www.houtouridis.net)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see .
*
*/
#ifndef __alcd_h__
#define __alcd_h__
#ifdef __cplusplus
extern "C" {
#endif
#include "jiffies.h"
#include "driver_types.h"
#include
#include
#include
#include
/*
* General Defines
*/
#define ALCD_CLOCK (CLOCK)
/*!
* ----------------------------------------------------
* Hitachi HD44780 - Samsung KS0066U
* ----------------------------------------------------
*
*
* Entry Mode Set -----> 0 0 0 0 0 1 I/D S
* ----------------------------------------------------
* I/D = 1 -->Inciment Curs I/D = 0 Decriment
* S = 1 -->Display shift S = 0 Not
*
*
* DispOnOffControll --> 0 0 0 0 1 D C B
* -------------------------------------------------
* D = Display On
* C = Cursor On
* B = Blinking On
*
*
* Cursor/Display Shift --> 0 0 0 1 S/C R/L x x
* ---------------------------------------------------
* S/C = 1 -->Display Shift S/C = 0 -->Cursor Shift
* R/L = 1 -->Shift Right R/L = 0 -->Shift left
*
*
* FunctionSet ------> 0 0 1 DL N F x x
* ---------------------------------------------------
* DL = 1 -->8bit DL = 0 -->4bit
* N = 1 -->2 lines N = 0 -->1 line
* F = 1 -->5x10 dots F = 0 -->5x8 dots
*
*/
//#define LCD_LINES (4)
//#define LCD_ROWS (16)
#define LCD_CLRSCR (0x01) /*!< Clear Srean Command Number */
#define LCD_RETHOME (0x02) /*!< Cursor home Un-Shift display DDRam as is */
#define LCD_ENTRYMODE (0x06) /*!< Inc Cursor, Don't shift display */
#define LCD_DISP_ON (0x0C) /*!< No Cursos and Blink */
#define LCD_DISP_OFF (0x08)
#define LCD_CUR_DISP (0x14) /*!< Cursor shift right */
#define LCD_FUNSET_2L8 (0x28) /*!< 4bit, 2lines, 5x8 dots */
#define LCD_FUNSET_1L8 (0x20) /*!< 4bit, 1lines, 5x8 dots */
#define LCD_FUNSET_1L10 (0x24) /*!< 4bit, 1lines, 5x10 dots */
#define LCD_SETCGRAMADDR (0x40)
#define LCD_DDRAMMask (0x80) /*!< DDRAM ------------> 1 ADD[7..0] */
#define LCD_BFMask (0x80) /*!< IR ------------> BF AC[6..0] */
#define LCD_ACMask (0x7f) /*!< ____________________________| */
#define LCD_SHIFT_RIGHT (0x1C)
#define LCD_SHIFT_LEFT (0x18)
typedef enum {
ALCD_1Line_5x8 = LCD_FUNSET_1L8,
ALCD_1Line_5x10 = LCD_FUNSET_1L10,
ALCD_2Lines_5x8 = LCD_FUNSET_2L8
} alcd_funset_en;
/*!
* Alpharithmetic LCD Cursor
*/
typedef volatile struct
{
uint8_t x;
uint8_t y;
}alcd_cursor_t;
/*!
* Alpharithmetic LCD Pin assignements.
* Each one can be called xx.DB4(1); or xx.DB4(0); in order to set
* or clear the corresponding pin.
*
* \note These pointers MUST to be assigned from main application.
*/
typedef volatile struct
{
//drv_pinout_ft db0;
//drv_pinout_ft db1;
//drv_pinout_ft db2;
//drv_pinout_ft db3;
drv_pinout_ft db4; /*!< Pointer for DB4 pin */
drv_pinout_ft db5; /*!< Pointer for DB5 pin */
drv_pinout_ft db6; /*!< Pointer for DB6 pin */
drv_pinout_ft db7; /*!< Pointer for DB7 pin */
drv_pinout_ft rs; /*!< Pointer for RS pin */
drv_pinout_ft en; /*!< Pointer for EN pin */
drv_pinout_ft bl; /*!< Pointer for Back Light pin*/
}alcd_io_t;
/*!
* Alpharithmetic LCD Public Data struct
*/
typedef volatile struct
{
alcd_io_t io; //!< Link to IO struct
alcd_cursor_t c; //!< Link to Cursor struct
uint8_t lines; //!< The lines of attached lcd
uint8_t columns; //!< The columns of attached lcd
//uint8_t bus; //!< Bus length, 4 or 8 bit
drv_status_en status; //!< alcd driver status
}alcd_t;
/*
* ============= PUBLIC ALCD API =============
*/
/*
* Link and Glue functions
*/
void alcd_link_db4 (alcd_t *alcd, drv_pinout_ft pfun);
void alcd_link_db5 (alcd_t *alcd, drv_pinout_ft pfun);
void alcd_link_db6 (alcd_t *alcd, drv_pinout_ft pfun);
void alcd_link_db7 (alcd_t *alcd, drv_pinout_ft pfun);
void alcd_link_rs (alcd_t *alcd, drv_pinout_ft pfun);
void alcd_link_en (alcd_t *alcd, drv_pinout_ft pfun);
void alcd_link_bl (alcd_t *alcd, drv_pinout_ft pfun);
int alcd_putchar (alcd_t *alcd, int ch);
/*
* Set functions
*/
void alcd_set_lines (alcd_t *alcd, int lines);
void alcd_set_columns (alcd_t *alcd, int columns);
/*
* User Functions
*/
void alcd_deinit (alcd_t *alcd); /*!< For compatibility */
drv_status_en alcd_init (alcd_t *alcd, alcd_funset_en fs); /*!< For compatibility */
void alcd_backlight (alcd_t *alcd, uint8_t on); /*!< For compatibility */
void alcd_enable (alcd_t *alcd, uint8_t on); /*!< For compatibility */
void alcd_cls (alcd_t *alcd); /*!< For compatibility */
void alcd_shift (alcd_t *alcd, int pos); /*!< For compatibility */
void alcd_createChar (alcd_t *alcd, uint8_t location, uint8_t charmap[]);
#ifdef __cplusplus
}
#endif
#endif //#ifndef __alcd_h__