avr-lcd-lib/lcdLib.h

329 lines
9.7 KiB
C
Raw Permalink Normal View History

/**
* (C) Copyright Collin J. Doering 2015
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file lcdLib.h
* @author Collin J. Doering <collin.doering@rekahsoft.ca>
* @date Sep 29, 2015
* @brief Functions to initialize, and operate a character LCD.
*/
#ifndef LCD_LIB_H
#define LCD_LIB_H
// Includes -----------------------------------------------------------------------------------
#include "lcd_instr.h"
#include "lcdLibConfig.h"
//---------------------------------------------------------------------------------------------
// Library function declarations
/**
Initialize the LCD display via software initialization as specified by the datasheet.
*/
void initLCD(void);
/**
Writes a character to the LCD display at the current cursor position after the LCD display is
ready for new data. Allows the following ASCII escapes: '\n', '\r', '\f' and '\b'; ignores
ASCII escape '\a'.
*/
void writeCharToLCD(char);
/**
Writes a string to the LCD starting from the current cursor position.
*/
void writeStringToLCD(char*);
//---------------------------------------------------------------------------------------------
// LCD command functions (all have associated ANSI escape)
/**
Clears the display and positions the cursor in the top left of the LCD screen.
*/
void clearDisplay(void);
/**
Brings the cursor the the top left of the LCD screen.
*/
void returnHome(void);
/**
Gets the current row and column of the LCD cursor and sets given pointers row and column to
their respective values. Note indexes start at 1.
*/
void getCursorPosition(uint8_t* row, uint8_t* column);
/**
Using the given parameters row and column, sets the current row and column occupied by the LCD
cursor. Note indexes start at 1.
*/
void setCursorPosition(uint8_t row, uint8_t column);
/**
Moves the cursor n positions up. If the cursor is at the edge of the screen this has no effect.
*/
void moveCursorUp(uint8_t n);
/**
Moves the cursor n positions down. If the cursor is at the edge of the screen this has no effect.
*/
void moveCursorDown(uint8_t n);
/**
Moves the cursor n positions forward. If the cursor is at the edge of the screen this has no effect.
*/
void moveCursorForward(uint8_t n);
/**
Moves the cursor n positions backwards. If the cursor is at the edge of the screen this has no effect.
*/
void moveCursorBackward(uint8_t n);
/**
Moves the cursor to the beginning of the line n lines down.
*/
void moveCursorNextLine(uint8_t n);
/**
Moves the cursor to the beginning of the line n lines up.
*/
void moveCursorPreviousLine(uint8_t n);
/**
Moves the cursor to column n. If n is off screen go to the last line.
*/
void moveCursorToColumn(uint8_t n);
Add boiler plate code for remaining ANSI escapes Added function declarations and empty/implementation incomplete definitions in lcdLib.h and lcdLib.c respectively for remaining ANSI escape sequences; namely: - scrollUp - scrollDown - eraseDisplay - eraseInline Prematurely edited the parsing of any ASCII escape which causes the screen to be cleared (Eg. '\n' on the last line), to use the new (but yet to be implemented) scrolling functions; thus after these functions have been filled in and tested, the ANSI escape support will be complete. Additionally, escapes that are not supported are passed over without printing any characters. The two cases that are handled in this commit are DSR and SGR. The parsing for DSR which when received, normally prints the current location of the cursor to standard output in the form "\e[n;mR", where n is the row and m is the column, is left unsupported but may be supported in the future (thus comments have been left indicating condition where a valid parse occurs). The SGR ANSI escape sequence can vary in length and thus needs to be completely consumed from the input before processing the next character. This is taken care of correctly in this commit, and has been tested. In a previous commit, forgot to add the declarations of the following utility functions to the lcdLib.h header file: - blinkCursorOff - blinkCursorOn - displayOff - displayOn There are still a few functions that will be needed for reading data from the LCD that have not been declared/defined. These functions are required for efficiently scrolling the screen up and down. They also will be needed to finish the last remaining piece of this library which, after completion of ANSI escapes and associated functions, leaves support for custom characters. Namely writing characters to CGRAM and displaying custom characters (from CGRAM) using ASCII codes 0-7 (or 0-3 if 5x10 font is used). Signed-off-by: Collin J. Doering <collin.doering@rekahsoft.ca>
2015-10-25 04:27:51 +00:00
/**
Scroll whole page up by n lines. New lines are added at the bottom.
*/
void scrollUp(uint8_t n);
/**
Scroll whole page down by n lines. New lines are added at the top.
*/
void scrollDown(uint8_t n);
/**
Saves the cursors current position.
*/
void saveCursorPosition(void);
/**
Restores the last saved cursor position.
*/
void restoreCursorPosition(void);
Add boiler plate code for remaining ANSI escapes Added function declarations and empty/implementation incomplete definitions in lcdLib.h and lcdLib.c respectively for remaining ANSI escape sequences; namely: - scrollUp - scrollDown - eraseDisplay - eraseInline Prematurely edited the parsing of any ASCII escape which causes the screen to be cleared (Eg. '\n' on the last line), to use the new (but yet to be implemented) scrolling functions; thus after these functions have been filled in and tested, the ANSI escape support will be complete. Additionally, escapes that are not supported are passed over without printing any characters. The two cases that are handled in this commit are DSR and SGR. The parsing for DSR which when received, normally prints the current location of the cursor to standard output in the form "\e[n;mR", where n is the row and m is the column, is left unsupported but may be supported in the future (thus comments have been left indicating condition where a valid parse occurs). The SGR ANSI escape sequence can vary in length and thus needs to be completely consumed from the input before processing the next character. This is taken care of correctly in this commit, and has been tested. In a previous commit, forgot to add the declarations of the following utility functions to the lcdLib.h header file: - blinkCursorOff - blinkCursorOn - displayOff - displayOn There are still a few functions that will be needed for reading data from the LCD that have not been declared/defined. These functions are required for efficiently scrolling the screen up and down. They also will be needed to finish the last remaining piece of this library which, after completion of ANSI escapes and associated functions, leaves support for custom characters. Namely writing characters to CGRAM and displaying custom characters (from CGRAM) using ASCII codes 0-7 (or 0-3 if 5x10 font is used). Signed-off-by: Collin J. Doering <collin.doering@rekahsoft.ca>
2015-10-25 04:27:51 +00:00
/**
Clears part or all of screen dependent on the value of n:
0 or missing: clear from cursor to end of screen
1: clear from cursor to end of screen
2: clear entire screen
*/
void eraseDisplay(uint8_t n);
/**
Erases part of a line dependent on the value of n:
0 or missing: clear from cursor to end of the line
1: clear from cursor to beginning of the line
2: clear entire line
*/
void eraseInline(uint8_t n);
Add Show/Hide cursor function and ANSI escapes Adds ANSI escape parsing for DECTCEM escapes (hide/show cursor) as well as utility functions hideCursor and showCursor. To do this correctly, the state of the LCD needs to be remembered by sofware. Keep track of the state of the LCD using the 3 LSB of lcdState as follows: 0: Cursor blink 1: Cursor off/on 2: Display off/on In the future, the 5 MSB's may be used to store other data used for the remembering the state of the LCD. For example, the instruction INSTR_MOV_SHIFT and INSTR_ENTRY_SET; specifically: INSTR_MOV_SHIFT 3+1=4: Move cursor/shift display 3+2=5: Shift left/right INSTR_ENTRY_SET 3+3=6: decrement/increment cursor position 3+4=7: display shift off/on The LCD state information could then be read for the correct instruction using bit shifting. Note that this would require modifying the functions defined in this commit to do the appropriate bit shifting. Additionally, utility functions (that don't have associated ANSI escapes) have been defined: - blinkCursorOff - blinkCursorOn - displayOff - displayOn Note: care needs to be taken to check whether the display is actually on before sending data to it, as during testing the data will not show up after the display has been sent the display off instruction, and it will not write any incoming data to DDRAM. Whether it will accept other instructions besides writing to DDRAM is unknown but suspected to also not work. This issue still needs to be rectified after further testing. Signed-off-by: Collin J. Doering <collin.doering@rekahsoft.ca>
2015-10-24 07:45:32 +00:00
/**
Hides the cursor
*/
void hideCursor(void);
/**
Shows the cursor
*/
void showCursor(void);
//---------------------------------------------------------------------------------------------
// Utility functions (with no associated ASCII or ANSI escape)
Add boiler plate code for remaining ANSI escapes Added function declarations and empty/implementation incomplete definitions in lcdLib.h and lcdLib.c respectively for remaining ANSI escape sequences; namely: - scrollUp - scrollDown - eraseDisplay - eraseInline Prematurely edited the parsing of any ASCII escape which causes the screen to be cleared (Eg. '\n' on the last line), to use the new (but yet to be implemented) scrolling functions; thus after these functions have been filled in and tested, the ANSI escape support will be complete. Additionally, escapes that are not supported are passed over without printing any characters. The two cases that are handled in this commit are DSR and SGR. The parsing for DSR which when received, normally prints the current location of the cursor to standard output in the form "\e[n;mR", where n is the row and m is the column, is left unsupported but may be supported in the future (thus comments have been left indicating condition where a valid parse occurs). The SGR ANSI escape sequence can vary in length and thus needs to be completely consumed from the input before processing the next character. This is taken care of correctly in this commit, and has been tested. In a previous commit, forgot to add the declarations of the following utility functions to the lcdLib.h header file: - blinkCursorOff - blinkCursorOn - displayOff - displayOn There are still a few functions that will be needed for reading data from the LCD that have not been declared/defined. These functions are required for efficiently scrolling the screen up and down. They also will be needed to finish the last remaining piece of this library which, after completion of ANSI escapes and associated functions, leaves support for custom characters. Namely writing characters to CGRAM and displaying custom characters (from CGRAM) using ASCII codes 0-7 (or 0-3 if 5x10 font is used). Signed-off-by: Collin J. Doering <collin.doering@rekahsoft.ca>
2015-10-25 04:27:51 +00:00
/**
Turns the cursor blink off.
*/
void blinkCursorOff(void);
/**
Turns the cursor blink on.
*/
void blinkCursorOn(void);
/**
Turns the display off.
*/
void displayOff(void);
/**
Turns the display on.
*/
void displayOn(void);
//---------------------------------------------------------------------------------------------
Add boiler plate code for remaining ANSI escapes Added function declarations and empty/implementation incomplete definitions in lcdLib.h and lcdLib.c respectively for remaining ANSI escape sequences; namely: - scrollUp - scrollDown - eraseDisplay - eraseInline Prematurely edited the parsing of any ASCII escape which causes the screen to be cleared (Eg. '\n' on the last line), to use the new (but yet to be implemented) scrolling functions; thus after these functions have been filled in and tested, the ANSI escape support will be complete. Additionally, escapes that are not supported are passed over without printing any characters. The two cases that are handled in this commit are DSR and SGR. The parsing for DSR which when received, normally prints the current location of the cursor to standard output in the form "\e[n;mR", where n is the row and m is the column, is left unsupported but may be supported in the future (thus comments have been left indicating condition where a valid parse occurs). The SGR ANSI escape sequence can vary in length and thus needs to be completely consumed from the input before processing the next character. This is taken care of correctly in this commit, and has been tested. In a previous commit, forgot to add the declarations of the following utility functions to the lcdLib.h header file: - blinkCursorOff - blinkCursorOn - displayOff - displayOn There are still a few functions that will be needed for reading data from the LCD that have not been declared/defined. These functions are required for efficiently scrolling the screen up and down. They also will be needed to finish the last remaining piece of this library which, after completion of ANSI escapes and associated functions, leaves support for custom characters. Namely writing characters to CGRAM and displaying custom characters (from CGRAM) using ASCII codes 0-7 (or 0-3 if 5x10 font is used). Signed-off-by: Collin J. Doering <collin.doering@rekahsoft.ca>
2015-10-25 04:27:51 +00:00
/**
Read a single character from the row and column given (1 based) returning the cursor to
its previous original position.
*/
char readCharFromLCD(uint8_t row, uint8_t column);
/**
Read a line i (ones based) into str.
*/
void readLCDLine(uint8_t i, char* str);
//---------------------------------------------------------------------------------------------
// Advanced functions for special cases
/**
Read len characters from (from_row, from_column) to (to_row, to_column) returning the cursor
to its original position after the read. Upon success (not overflowing the screen), 0 is
returned; otherwise non zero will be returned. The str pointer will be updated with the
characters read from the screen. Even in the case of failure, str may be partially populated.
*/
void readCharsFromLCD(uint8_t from_row, uint8_t from_column, uint8_t to_row, uint8_t to_column, char* str, uint8_t len);
/**
Initialize the LCD display via its internal reset circuit.
Note: this is not the recommended way to initialize the LCD as it is unreliable and depends
on the power supply. Preferably the software initialization method should be used (via
the initLCD function).
*/
void initLCDByInternalReset(void);
//---------------------------------------------------------------------------------------------
// Mode and settings sanity check (preprocessor tests of lcdLibConfig.h)
//---------------------------------------------------------------------------------------------
#if !defined(LCD_CHARACTERS_PER_LINE)
#error "All modes require LCD_CHARACTERS_PER_LINE to be defined."
#elif !defined(LCD_NUMBER_OF_LINES)
#error "All modes require LCD_NUMBER_OF_LINES to be defined."
#elif !defined(LCD_LINE_BEGINNINGS)
#error "All modes require LCD_LINE_BEGINNINGS to be defined."
#else
#if LCD_NUMBER_OF_LINES == 1
#define LCD_LINES 0
#else
#define LCD_LINES (1 << INSTR_FUNC_SET_N)
#endif
#define LCD_CHARACTERS_PER_SCREEN (LCD_CHARACTERS_PER_LINE * LCD_NUMBER_OF_LINES)
#endif
#if !defined(LCD_FONT_5x8) &&\
!defined(LCD_FONT_5x10)
#error "All modes require LCD_FONT_5x8 or LCD_FONT_5x10 to be defined."
#elif defined(LCD_FONT_5x8) && \
defined(LCD_FONT_5x10)
#error "LCD_FONT_5x8 and LCD_FONT_5x10 are mutually exclusive. Choose one."
#elif defined(LCD_FONT_5x8)
#define LCD_FONT 0
#elif defined(LCD_FONT_5x10)
#define LCD_FONT (1 << INSTR_FUNC_SET_F)
#endif
#if !defined (LCD_RS) || \
!defined (LCD_RS_PORT) || \
!defined (LCD_RS_DDR) || \
!defined (LCD_RW) || \
!defined (LCD_RW_PORT) || \
!defined (LCD_RW_DDR) || \
!defined (LCD_ENABLE) || \
!defined (LCD_ENABLE_PORT) || \
!defined (LCD_ENABLE_DDR)
#error "All modes require LCD_RS[,_PORT,_DDR], LCD_RW[,_PORT,_DDR], and LCD_ENABLE[,_PORT,_DDR] be defined."
#endif
#if defined (EIGHT_BIT_ARBITRARY_PIN_MODE) && \
defined (FOUR_BIT_MODE)
#error "EIGHT_BIT_ARBITRARY_PIN_MODE and FOUR_BIT_MODE are mutually exclusive. Choose one."
#elif defined (EIGHT_BIT_ARBITRARY_PIN_MODE) || \
defined (FOUR_BIT_MODE)
// EIGHT_BIT_ARBITRARY_PIN_MODE specific requirements
#ifdef EIGHT_BIT_ARBITRARY_PIN_MODE
#if !defined (LCD_DBUS0) || \
!defined (LCD_DBUS0_PORT) || \
!defined (LCD_DBUS0_DDR) || \
!defined (LCD_DBUS0_PIN) || \
!defined (LCD_DBUS1) || \
!defined (LCD_DBUS1_PORT) || \
!defined (LCD_DBUS1_DDR) || \
!defined (LCD_DBUS1_PIN) || \
!defined (LCD_DBUS2) || \
!defined (LCD_DBUS2_PORT) || \
!defined (LCD_DBUS2_DDR) || \
!defined (LCD_DBUS2_PIN) || \
!defined (LCD_DBUS3) || \
!defined (LCD_DBUS3_PORT) || \
!defined (LCD_DBUS3_DDR) || \
!defined (LCD_DBUS3_PIN)
#error "EIGHT_BIT_ARBITRARY_PIN_MODE require that LCD_DBUS*[,_PORT,_DDR,_PIN] be defined."
#endif
#endif
// Requirements for EIGHT_BIT_ARBITRARY_PIN_MODE and FOUR_BIT_MODE
#if !defined (LCD_DBUS4) || \
!defined (LCD_DBUS4_PORT) || \
!defined (LCD_DBUS4_DDR) || \
!defined (LCD_DBUS4_PIN) || \
!defined (LCD_DBUS5) || \
!defined (LCD_DBUS5_PORT) || \
!defined (LCD_DBUS5_DDR) || \
!defined (LCD_DBUS5_PIN) || \
!defined (LCD_DBUS6) || \
!defined (LCD_DBUS6_PORT) || \
!defined (LCD_DBUS6_DDR) || \
!defined (LCD_DBUS6_PIN) || \
!defined (LCD_DBUS7) || \
!defined (LCD_DBUS7_PORT) || \
!defined (LCD_DBUS7_DDR) || \
!defined (LCD_DBUS7_PIN)
#error "Both EIGHT_BIT_ARBITRARY_PIN_MODE and FOUR_BIT_MODE require that LCD_DBUS*[,_PORT,_DDR,_PIN] be defined."
#endif
// Set LCD_BF automatically for both EIGHT_BIT_ARBITRARY_PIN_MODE and FOUR_BIT_MODE
#undef LCD_BF
#define LCD_BF LCD_DBUS7
#else
#if !defined (LCD_DBUS_PORT) || \
!defined (LCD_DBUS_DDR) || \
!defined (LCD_DBUS_PIN) || \
!defined (LCD_BF)
#error "Default mode requires that LCD_DBUS_[PORT,DDR,PIN] and LCD_BF be defined."
#endif
#undef LCD_DBUS7_PORT
#define LCD_DBUS7_PORT LCD_DBUS_PORT
#undef LCD_DBUS7_DDR
#define LCD_DBUS7_DDR LCD_DBUS_DDR
#undef LCD_DBUS7_PIN
#define LCD_DBUS7_PIN LCD_DBUS_PIN
#endif
#endif /* LCD_LIB_H */