hoverboard-firmware-hack-fo.../Inc/hd44780.h

295 lines
8.8 KiB
C

/*
* hd44780.h
*
* Created on: Feb 20, 2014
* Author: Peter
*/
#ifndef HD44780_H_
#define HD44780_H_
#include <stdio.h>
#include <stdint.h>
#include "stm32f1xx_hal.h"
#include "pcf8574.h"
/**
* @file hd44780.h
* @brief Header file for communication with the HD44780 LCD driver.
* To use it you will have to create a variable of type LCD_PCF8574_HandleTypeDef (e.g. "lcd") and then
* set the I2C address based on the address pins on your PCF8574 (0-7) (lcd.pcf8574.PCF_I2C_ADDRESS),
* set the I2C timeout (in milliseconds) (lcd.pcf8574.PCF_I2C_TIMEOUT),
* set the I2C instance (e.g. I2C1 or I2C2) (lcd.pcf8574.i2c.Instance),
* set the I2C clock speed (in Hertz) (lcd.pcf8574.i2c.Init.ClockSpeed),
* set the number of lines (has to be type of LCD_NUMBER_OF_LINES) (lcd.NUMBER_OF_LINES),
* set the interface type (has to be type of LCD_TYPE) (lcd.type).
*
* Example:
* example.c
* example_msp.c
*/
/** LCD Interface possibilities
*/
typedef enum{
PCF8574, /*!< Use PCF8574 I2C IO expander as the interface */
GPIO /*!< Use GPIO pins directly */
} LCD_INTERFACE;
/** Possible return values for the functions
*/
typedef enum{
LCD_OK, /*!< Everything went OK */
LCD_ERROR /*!< An error occured */
} LCD_RESULT;
/** Type of hardware to use
*/
typedef enum{
TYPE0,
TYPE1,
TYPE2
} LCD_TYPE;
/** Number of lines on your LCD
*/
typedef enum{
NUMBER_OF_LINES_1=0,
NUMBER_OF_LINES_4=3,
NUMBER_OF_LINES_2=1
} LCD_NUMBER_OF_LINES;
/**
* Structure that hold all the required variables in
* order to simplify the communication process
*/
typedef struct{
LCD_NUMBER_OF_LINES NUMBER_OF_LINES; /**< Number of lines on your LCD */
uint8_t D;
uint8_t C;
uint8_t B;
char lcdbuf[2][16]; /**< Buffer for the LCD */
int x, oldx, y, oldy;
uint8_t state; /**< Holds current state of the PCF8574 expander */
uint32_t* pins; /**< Array of pins based on your hardware (wiring) */
LCD_TYPE type; /**< Type of hardware you want to use */
PCF8574_HandleTypeDef pcf8574; /**< PCF8574_HandleTypeDef for communication with PCF8574 */
void (*errorCallback)(LCD_RESULT);
} LCD_PCF8574_HandleTypeDef;
/** @def INTERFACE - Selector for the type of interface you want to use (has to be a type of LCD_INTERFACE) */
#define LCD_INTERFACE_SELECTOR PCF8574
/** Enumeration of the LCD pins */
typedef enum{
LCD_PIN_D4=0,
LCD_PIN_D5=1,
LCD_PIN_D6=2,
LCD_PIN_D7=3,
LCD_PIN_RS=4,
LCD_PIN_RW=5,
LCD_PIN_E=6,
LCD_PIN_LED=7
} LCD_PIN;
/** Used to specify the direction in certain LCD operations */
typedef enum{
DIRECTION_LEFT=0,
DIRECTION_RIGHT=1
} LCD_DIRECTION;
/** */
typedef enum{
DIRECTION_INCREMENT=1,
DIRECTION_DECREMENT=2
} LCD_DIRECTION_INC_DEC;
/** */
typedef enum{
SHIFT_YES=1,
SHIFT_NO=0
} LCD_SHIFT;
#if LCD_INTERFACE_SELECTOR==PCF8574
/**
* LCD initialization function
* @param handle - a pointer to the LCD handle
* @return whether the function was successful or not
*/
LCD_RESULT LCD_Init(LCD_PCF8574_HandleTypeDef* handle);
/**
* LCD deinitialization function
* @param handle - a pointer to the LCD handle
* @return whether the function was successful or not
*/
LCD_RESULT LCD_DeInit(LCD_PCF8574_HandleTypeDef* handle);
/**
* Sends a command to the HD44780 controller
* @param handle - a pointer to the LCD handle
* @param cmd - a command you want to send
* @return whether the function was successful or not
*/
LCD_RESULT LCD_WriteCMD(LCD_PCF8574_HandleTypeDef* handle, uint8_t cmd);
/**
* Sends data to the HD44780 controller
* @param handle - a pointer to the LCD handle
* @param data - data you want to send
* @return whether the function was successful or not
*/
LCD_RESULT LCD_WriteDATA(LCD_PCF8574_HandleTypeDef* handle, uint8_t data);
/**
* Gets the state of the busy flag
* @param handle - a pointer to the LCD handle
* @param flag - a pointer to a variable that will contain the state of the flag
* @return whether the function was successful or not
*/
LCD_RESULT LCD_GetBusyFlag(LCD_PCF8574_HandleTypeDef* handle,uint8_t* flag);
/**
* Writes lower 4bits of data to the data bus of the controller
* @param handle - a pointer to the LCD handle
* @param data - data you want to put on the data bus (lower 4bits)
* @return whether the function was successful or not
*/
LCD_RESULT LCD_WriteToDataBus(LCD_PCF8574_HandleTypeDef* handle, uint8_t data);
/**
* Clears the LCD
* @param handle - a pointer to the LCD handle
* @return whether the function was successful or not
*/
LCD_RESULT LCD_ClearDisplay(LCD_PCF8574_HandleTypeDef* handle);
/**
* Writes a string to the LCD
* @param handle - a pointer to the LCD handle
* @param s - string you want to write to the LCD
* @return whether the function was successful or not
*/
LCD_RESULT LCD_WriteString(LCD_PCF8574_HandleTypeDef* handle, char *s);
/**
* Sets the location of the memory pointer in the controller (used to control other operations (for example where to write a string))
* @param handle - a pointer to the LCD handle
* @param x - x-coordinate of the location
* @param y - y-coordinate of the location
* @return whether the function was successful or not
*/
LCD_RESULT LCD_SetLocation(LCD_PCF8574_HandleTypeDef* handle, uint8_t x, uint8_t y);
/**
* Turns ON the display
* @param handle - a pointer to the LCD handle
* @return whether the function was successful or not
*/
LCD_RESULT LCD_DisplayON(LCD_PCF8574_HandleTypeDef* handle);
/**
* Turns OFF the display
* @param handle - a pointer to the LCD handle
* @return whether the function was successful or not
*/
LCD_RESULT LCD_DisplayOFF(LCD_PCF8574_HandleTypeDef* handle);
/**
* Turns ON the cursor
* @param handle - a pointer to the LCD handle
* @param blink - if you want the cursor to blink set this to 1, else 0
* @return whether the function was successful or not
*/
LCD_RESULT LCD_CursorON(LCD_PCF8574_HandleTypeDef* handle, uint8_t blink);
/**
* Turns OFF the cursor
* @param handle - a pointer to the LCD handle
* @return whether the function was successful or not
*/
LCD_RESULT LCD_CursorOFF(LCD_PCF8574_HandleTypeDef* handle);
/**
* Shifts the cursor in the specified direction certain number of steps
* @param handle - a pointer to the LCD handle
* @param direction - specifies the direction
* @param steps - specifies how many positions to shift the cursor by
* @return whether the function was successful or not
*/
LCD_RESULT LCD_ShiftCursor(LCD_PCF8574_HandleTypeDef* handle, LCD_DIRECTION direction,uint8_t steps);
/**
* Shifts the contents of the LCD
* @param handle - a pointer to the LCD handle
* @param direction - directions of the shift
* @param steps - how many positions to shift the contents by
* @return whether the function was successful or not
*/
LCD_RESULT LCD_ShiftDisplay(LCD_PCF8574_HandleTypeDef* handle, uint8_t direction, uint8_t steps);
/**
* Writes a number to the LCD
* @param handle - a pointer to the LCD handle
* @param n - a number you want to write to the LCD
* @return whether the function was successful or not
*/
LCD_RESULT LCD_WriteNumber(LCD_PCF8574_HandleTypeDef* handle, unsigned long n, uint8_t base);
LCD_RESULT LCD_WriteFloat(LCD_PCF8574_HandleTypeDef* handle, double number, uint8_t digits);
/**
* Sets the mode by which data is written to the LCD
* @param handle - a pointer to the LCD handle
* @param direction
* @param shift
* @return whether the function was successful or not
*/
LCD_RESULT LCD_EntryModeSet(LCD_PCF8574_HandleTypeDef* handle, LCD_DIRECTION_INC_DEC direction,LCD_SHIFT shift);
/**
* Creates a custom character at the given address
* @param handle - a pointer to the LCD handle
* @param pattern - pointer to the bit pattern of the character
* @param address - an address to which the character will be written
* @return whether the function was successful or not
*/
LCD_RESULT LCD_CustomChar(LCD_PCF8574_HandleTypeDef* handle, uint8_t *pattern,uint8_t address);
/**
* Writes the current state to the PCF8574 expander
* @param handle - a pointer to the LCD handle
* @return whether the function was successful or not
*/
LCD_RESULT LCD_I2C_WriteOut(LCD_PCF8574_HandleTypeDef* handle);
/**
* Controls the state of the LCD backlight
* @param handle - a pointer to the LCD handle
* @param on - set it to 1 if you want to turn the backlight on, else 0
* @return whether the function was successful or not
*/
LCD_RESULT LCD_StateLEDControl(LCD_PCF8574_HandleTypeDef* handle, uint8_t on);
/**
* Rewrites a bit in the state variable with the value specified
* @param handle - a pointer to the LCD handle
* @param value - value of the bit (0 or 1)
* @param pin - pin which you want to write to
* @return whether the function was successful or not
*/
LCD_RESULT LCD_StateWriteBit(LCD_PCF8574_HandleTypeDef* handle, uint8_t value, LCD_PIN pin);
/**
* Waits until the busy flag is reset
* @param handle - a pointer to the LCD handle
*/
void LCD_WaitForBusyFlag(LCD_PCF8574_HandleTypeDef* handle);
#endif
#endif /* HD44780_H_ */