/** * ---------------------------------------------------------------+ * @desc HD44780 LCD Driver * ---------------------------------------------------------------+ * Copyright (C) 2020 Marian Hrinko. * Written by Marian Hrinko (mato.hrinko@gmail.com) * * @author Marian Hrinko * @datum 18.11.2020 * @file hd44780.c * @tested AVR Atmega16a * * @depend * ---------------------------------------------------------------+ * @usage default set 16x2 LCD * 4-bit with 3 control wires (RW, RS, E) * */ #ifndef __HD44780_H__ #define __HD44780_H__ // Success #ifndef SUCCESS #define SUCCESS 0 #endif // Error #ifndef ERROR #define ERROR 1 #endif // define clock #if defined(__AVR_ATmega8__) #define _FCPU 8000000 #elif defined(__AVR_ATmega16__) #define _FCPU 16000000 #endif //#if defined(__AVR_ATmega16__) // E port // -------------------------------------- #ifndef HD44780_DDR_E #define HD44780_DDR_E TRISB #endif #ifndef HD44780_PORT_E #define HD44780_PORT_E PORTB #endif #ifndef HD44780_E #define HD44780_E 12 #endif // RW port // -------------------------------------- #ifndef HD44780_DDR_RW #define HD44780_DDR_RW TRISB #endif #ifndef HD44780_PORT_RW #define HD44780_PORT_RW PORTB #endif #ifndef HD44780_RW #define HD44780_RW 13 #endif // RS port // -------------------------------------- #ifndef HD44780_DDR_RS #define HD44780_DDR_RS TRISD #endif #ifndef HD44780_PORT_RS #define HD44780_PORT_RS PORTD #endif #ifndef HD44780_RS #define HD44780_RS 5 #endif // DATA port / pin // -------------------------------------- #ifndef HD44780_DDR_DATA #define HD44780_DDR_DATA TRISB #endif #ifndef HD44780_PORT_DATA #define HD44780_PORT_DATA PORTB #endif #ifndef HD44780_PIN_DATA #define HD44780_PIN_DATA PORTB #endif // pins #ifndef HD44780_DATA7 #define HD44780_DATA7 PORTBbits.RB11 // LCD PORT DB7 #endif #ifndef HD44780_DATA6 #define HD44780_DATA6 10 // LCD PORT DB6 #endif #ifndef HD44780_DATA5 #define HD44780_DATA5 9 // LCD PORT DB5 #endif #ifndef HD44780_DATA4 #define HD44780_DATA4 3 // LCD PORT DB4 #endif #ifndef HD44780_DATA3 #define HD44780_DATA3 0 // LCD PORT DB3 #endif #ifndef HD44780_DATA2 #define HD44780_DATA2 0 // LCD PORT DB2 #endif #ifndef HD44780_DATA1 #define HD44780_DATA1 0 // LCD PORT DB1 #endif #ifndef HD44780_DATA0 #define HD44780_DATA0 0 // LCD PORT DB0 #endif // #endif #define _delay_ms(x) Sleep(x) #define _delay_us(x) Sleep(1) #define BIT7 0x80 #define BIT6 0x40 #define BIT5 0x20 #define BIT4 0x10 #define BIT3 0x08 #define BIT2 0x04 #define BIT1 0x02 #define BIT0 0x01 #define HD44780_BUSY_FLAG HD44780_DATA7 #define HD44780_INIT_SEQ 0x30 #define HD44780_DISP_CLEAR 0x01 #define HD44780_DISP_OFF 0x08 #define HD44780_DISP_ON 0x0C #define HD44780_CURSOR_ON 0x0E #define HD44780_CURSOR_OFF 0x0C #define HD44780_CURSOR_BLINK 0x0F #define HD44780_RETURN_HOME 0x02 #define HD44780_ENTRY_MODE 0x06 #define HD44780_4BIT_MODE 0x20 #define HD44780_8BIT_MODE 0x30 #define HD44780_2_ROWS 0x08 #define HD44780_FONT_5x8 0x00 #define HD44780_FONT_5x10 0x04 #define HD44780_POSITION 0x80 #define HD44780_SHIFT 0x10 #define HD44780_CURSOR 0x00 #define HD44780_DISPLAY 0x08 #define HD44780_LEFT 0x00 #define HD44780_RIGHT 0x04 #define HD44780_ROWS 2 #define HD44780_COLS 16 #define HD44780_ROW1_START 0x00 #define HD44780_ROW1_END HD44780_COLS #define HD44780_ROW2_START 0x40 #define HD44780_ROW2_END HD44780_COLS // ********************************************** // !!! // MODE DEFINITION - CORRECTLY DEFINED // // ---------------------------------------------- // // HD44780_4BIT_MODE - 4 bit mode / 4 data wires // HD44780_8BIT_MODE - 8 bit mode / 8 data wires // // ********************************************** #define HD44780_MODE HD44780_4BIT_MODE // set bit #define SETBIT(REG, BIT) { REG |= (1 << BIT); } // clear bit #define CLRBIT(REG, BIT) { REG &= ~(1 << BIT); } // set port / pin if bit is set #define SET_IF_BIT_IS_SET(REG, PORT, DATA, BIT) { if((DATA & BIT) > 0) { SETBIT(REG, PORT); } } /** * @desc LCD init - initialisation routine * * @param void * * @return void */ void HD44780_Init (void); /** * @desc LCD display clear * * @param void * * @return void */ void HD44780_DisplayClear (void); /** * @desc LCD display on * * @param void * * @return void */ void HD44780_DisplayOn (void); /** * @desc LCD cursor on, display on * * @param void * * @return void */ void HD44780_CursorOn (void); /** * @desc LCD cursor off * * @param void * * @return void */ void HD44780_CursorOff (void); /** * @desc LCD cursor blink, cursor on, display on * * @param void * * @return void */ void HD44780_CursorBlink (void); /** * @desc LCD draw char * * @param char * @return void */ void HD44780_DrawChar (char character); /** * @desc LCD draw string * * @param char * * * @return void */ void HD44780_DrawString (char *str); /** * @desc Got to position x,y * * @param char * @param char * * @return char */ char HD44780_PositionXY (char x, char y); /** * @desc Shift cursor / display to left / right * * @param char item {HD44780_CURSOR; HD44780_DISPLAY} * @param char direction {HD44780_RIGHT; HD44780_LEFT} * * @return char */ char HD44780_Shift (char item, char direction); /** * @desc Check Busy Flag (BF) in 8 bit mode * * @param void * * @return void */ void HD44780_CheckBFin8bitMode (void); /** * @desc Check Busy Flag (BF) in 4 bit mode * * @param void * * @return void */ void HD44780_CheckBFin4bitMode (void); /** * @desc LCD send instruction * * @param unsigned short int * * @return void */ void HD44780_SendInstruction (unsigned short int); /** * @desc LCD send data * * @param unsigned short int * * @return void */ void HD44780_SendData (unsigned short int); /** * @desc LCD send 4bits instruction in 4 bit mode * * @param unsigned short int * * @return void */ void HD44780_Send4bitsIn4bitMode (unsigned short int); /** * @desc LCD send 8bits instruction in 4 bit mode * * @param unsigned short int * * @return void */ void HD44780_Send8bitsIn4bitMode (unsigned short int); /** * @desc LCD send 8bits instruction in 8 bit mode * * @param unsigned short int * * @return void */ void HD44780_Send8bitsIn8bitMode (unsigned short int); /** * @desc LCD send upper nibble * * @param unsigned short int * * @return void */ void HD44780_SetUppNibble (unsigned short int); /** * @desc LCD send lower nibble * * @param unsigned short int * * @return void */ void HD44780_SetLowNibble (unsigned short int); /** * @desc LCD pulse E * * @param void * * @return void */ void HD44780_PulseE (void); /** * @desc Set PORT DB4 to DB7 * * @param void * * @return void */ void HD44780_SetPORT_DATA4to7 (void); /** * @desc Set DDR DB4 to DB7 * * @param void * * @return void */ void HD44780_SetDDR_DATA4to7 (void); /** * @desc Clear DDR DB4 to DB7 * * @param void * * @return void */ void HD44780_ClearDDR_DATA4to7 (void); #endif