#ifndef LCD_H
#define LCD_H
#ifndef PIN
#define PIN(n,x,y) static volatile bit n @ (unsigned)&x*8+y
#endif
// Set exactly one of these screen types to TRUE so that code is generated properly.
// If no type is enabled, you will get errors!
//
// Format Status Notes All part numbers are Hantronix (www.hantronix.com)
// =============== ======= ===================== ==================================================>>
#define LCD_MODE_1x8 (FALSE) // HDM08111H-1
#define LCD_MODE_1x16_A (FALSE) // Row=1, Col=1..16 // HDM16116H-7, HDM16116H-L, HDM16116L*, HDM16116L-7, HDM16116L-L, HDM16116L-1, HDM16116H-2, HDM16116L-2
#define LCD_MODE_1x16_B (FALSE) // Row=1..2, Col=1..8 // HDM16116H, HDM16116L* note that this part number could be either A or B
#define LCD_MODE_1x40 (FALSE) // HDM40108H-2
#define LCD_MODE_2x8 (FALSE) // HDM08216H-1, HDM08216L, HDM16216H-2
#define LCD_MODE_2x12 (FALSE) // HDM12216H, HDM12216L
#define LCD_MODE_2x16 (TRUE) // HDM16216H-2, HDM16216H-4, HDM16216H-5, HDM16216H-B, HDM16216H-D, HDM16216L-2, HDM16216L-5, HDM16216L-7, HDM16216L-D, HDM16216L-B, HDM16216H-I
#define LCD_MODE_2x20 (FALSE) // HDM20216H-3, HDM20216L, HDM20216L-1, HDM20216L-L, HDM20216H-L
#define LCD_MODE_2x24 (FALSE) // HDM24216H-2 HDM24216L-2
#define LCD_MODE_2x40 (FALSE) // HDM40216H-4, HDM40216L, HDM40216L-1
#define LCD_MODE_4x16 (FALSE) // HDM16416H, HDM16416L
#define LCD_MODE_4x20 (FALSE) // HDM40216H-4, HDM40216L, HDM40216L-1
#define LCD_MODE_4x24 (FALSE) // UNSUPPORTED! // HDM24416H, HDM24416L
#define LCD_MODE_4x40 (FALSE) // UNSUPPORTED! // HDM40416H, HDM40416L-4, HDM40416H-5
#define LCD_CURSOR_BLINK (FALSE) // Blink/Noblink cursor mode
#define LCD_CURSOR_ON (TRUE) // Cursor visible
#define LCD_CURSOR_INCREMENT (TRUE) // Set left-to-right cursor movement
#define LCD_CURSOR_SHIFT (FALSE) // Shift display on entry
#define LCD_DISPLAY_5x10 (FALSE) // Select 5x7 or 5x10 character matrix
#define LCD_DISPLAY_ON (TRUE) // Turn display on/off
#define LCD_ALLOW_USER_CHARS (TRUE) // Controls whether display uses ASCII for control chars or uses user-defined chars in lcd_putc()
#define LCD_ENABLE_GETC (TRUE) // Save code space by setting to FALSE
#define LCD_ENABLE_GOTOXY (TRUE) // any functions which you will not
#define LCD_ENABLE_PRINTF (TRUE) // need in your application.
#define LCD_ENABLE_UNSCROLL (TRUE)
#define LCD_ENABLE_SCROLL (TRUE)
#define LCD_ENABLE_CLEAR (TRUE)
#if (LCD_ENABLE_SCROLL)
#define LCD_ENABLE_GOTOXY (TRUE) // Over-ride turning it off because these function
#endif
#if (LCD_ENABLE_UNSCROLL)
#define LCD_ENABLE_GOTOXY (TRUE) // need access to the gotoxy function.
#endif
#if (!LCD_ALLOW_USER_CHARS)
#define LCD_ENABLE_GOTOXY (TRUE) // need access to the gotoxy function.
#endif
#define LCD_DATA_PORT PORTB // Port on which LCD data lines are connected
#define LCD_TRIS_PORT TRISB // Need to specify the corresponding TRIS
#define LCD_4_BIT_MODE (FALSE) // 4-bit or 8-bit interface selection
#if LCD_4_BIT_MODE
#define LCD_D4_BIT 4 // Attachment of D0 to data port bus - note
#endif // that they MUST be contiguous and in order!
#if LCD_4_BIT_MODE
#define LCD_TRIS_DATAMASK ((byte)(0b11110000)) // Define the bitmask used to read/write the data bits
#else
#define LCD_TRIS_DATAMASK ((byte)(0b11111111)) // Define all bits used for 8-bit mode
#endif
#if LCD_ALLOW_USER_CHARS
#else
#define LCD_DESTRUCTIVE_BS (TRUE) // Backspace '\b' erases character
#endif
PIN (LCD_E, PORTA, 1); // Pin for LCD /E signal
PIN (LCD_RW, PORTA, 3); // Pin for LCD RW signal
PIN (LCD_RS, PORTA, 2); // Pin for LCD RS signal
PIN (LCD_TRIS_E, TRISA, 1); // Add definitions for direction control
PIN (LCD_TRIS_RW, TRISA, 3);
PIN (LCD_TRIS_RS, TRISA, 2);
/////////////////// DO NOT CHANGE ANYTHING BELOW THIS LINE! //////////////
#define LCD_8_BIT_MODE (!LCD_4_BIT_MODE)
#if LCD_MODE_1x8
#define LCD_MAXROWS ((byte)(1)) // Number of LCD rows
#define LCD_MAXCOLS ((byte)(8)) // Number of LCD columns
#define LCD_MULTI_LINE (FALSE) // Operate in 1-line or 2-line mode for controller
#endif
#if LCD_MODE_1x16_A
#define LCD_MAXROWS ((byte)(1))
#define LCD_MAXCOLS ((byte)(16))
#define LCD_MULTI_LINE (FALSE)
#endif
#if LCD_MODE_1x16_B
#define LCD_MAXROWS ((byte)(1))
#define LCD_MAXCOLS ((byte)(16))
#define LCD_MULTI_LINE (TRUE)
#endif
#if LCD_MODE_1x40
#define LCD_MAXROWS ((byte)(1))
#define LCD_MAXCOLS ((byte)(40))
#define LCD_MULTI_LINE (TRUE) // Not sure about this
#endif
#if LCD_MODE_2x8
#define LCD_MAXROWS ((byte)(2))
#define LCD_MAXCOLS ((byte)(8))
#define LCD_MULTI_LINE (TRUE)
#endif
#if LCD_MODE_2x12
#define LCD_MAXROWS ((byte)(2))
#define LCD_MAXCOLS ((byte)(12))
#define LCD_MULTI_LINE (TRUE)
#endif
#if LCD_MODE_2x16
#define LCD_MAXROWS ((byte)(2))
#define LCD_MAXCOLS ((byte)(16))
#define LCD_MULTI_LINE (TRUE)
#endif
#if LCD_MODE_2x20
#define LCD_MAXROWS ((byte)(2))
#define LCD_MAXCOLS ((byte)(20))
#define LCD_MULTI_LINE (TRUE)
#endif
#if LCD_MODE_2x24
#define LCD_MAXROWS ((byte)(2))
#define LCD_MAXCOLS ((byte)(24))
#define LCD_MULTI_LINE (TRUE)
#endif
#if LCD_MODE_2x40
#define LCD_MAXROWS ((byte)(2))
#define LCD_MAXCOLS ((byte)(40))
#define LCD_MULTI_LINE (TRUE)
#endif
#if LCD_MODE_4x16
#define LCD_MAXROWS ((byte)(4))
#define LCD_MAXCOLS ((byte)(16))
#define LCD_MULTI_LINE (TRUE)
#endif
#if LCD_MODE_4x20
#define LCD_MAXROWS ((byte)(4))
#define LCD_MAXCOLS ((byte)(20))
#define LCD_MULTI_LINE (TRUE)
#endif
#define LCD_COMMAND_CLEAR ((byte)(0x01)) // Clear screen, home cursor, unshift display
#define LCD_COMMAND_HOME ((byte)(0x02)) // Home cursor, unshift display
#define LCD_COMMAND_BACKSPACE ((byte)(0x10)) // Move cursor left one (destructive based on LCD_DESTRUCTIVE_BS)
#define LCD_COMMAND_FWDSPACE ((byte)(0x14)) // Move cursor right one
#define LCD_COMMAND_PANLEFT ((byte)(0x18)) // Move screen left one
#define LCD_COMMAND_PANRIGHT ((byte)(0x1C)) // Move screen right one
#ifndef LCD_MAXROWS
error ("NO LCD MODE SPECIFIED - You need to give a 1x8, 2x8 etc. format!");
#endif
// Mandatory functions:
void lcd_init (void); // Initialize LCD bus and Mode
void lcd_putc (byte c); // Write character to LCD
void lcd_command (byte c); // Write command to LCD controller
byte lcd_lineof (byte CursorAddress); // Calculate cursor row from it's address
byte lcd_cursorpos (void); // Return address of cursor position
// Optional functions:
#if LCD_ENABLE_GETC
byte lcd_getc (void); // Read character at cursor
#endif
#if LCD_ENABLE_GOTOXY
void lcd_gotoxy (byte row, byte col); // Position cursor
void lcd_getxy (byte *row, byte *col); // Return row and column of cursor position
#endif
#if LCD_ENABLE_PRINTF
void lcd_printf (const char* message); // Write message to LCD (C string type)
#endif
#if LCD_ENABLE_UNSCROLL
void lcd_unscroll (void); // Roll scroll backwards one line
#endif
#if LCD_ENABLE_SCROLL
void lcd_scroll (void); // Scroll up one line
#endif
#if LCD_ENABLE_CLEAR
void lcd_clear (void); // Clear LCD screen
#endif
#if LCD_ALLOW_USER_CHARS
void lcd_define_char (byte c, const byte *bitmap); // Define user-defined char
#endif
#endif
See:
Questions:
Code:
Comments: