/*
------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------- MODUL = Teil H ----------------------------------------------------
************************************************** lcd_2wire.h ** V1.2 *************************************************
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
 Version..............: 1.2
 Compiler.............: CodeVisionAVR
 Chip.................: ATmega88
 Datum................: Juni 2009
 Autor................: Alwin Lenck (ALE23) basierend auf dem Modul lcd_2wire von Udo Juerss
------------------------------------------------------------------------------------------------------------------------
*/

//----------------------------------------------------------------------------------------------------------------------
//Abfrage, ob diese Header-Datei bereits aufgerufen wurde. Wenn JA, dann alle Anweisungen ignorieren!
//----------------------------------------------------------------------------------------------------------------------
#ifndef __LCD_2WIRE_H
#define __LCD_2WIRE_H                            // Wenn NEIN, dann wird hier der Schalter gesetzt, dass zukuenftig
                                                 // diese Header-Datei nicht noch einmal hinzugefuegt wird.

//----------------------------------------------------------------------------------------------------------------------
//Header-Datei einfuegen:
//----------------------------------------------------------------------------------------------------------------------
#include "application.h"
#include "num_conversion.h"

//----------------------------------------------------------------------------------------------------------------------
//Anwendungsspezifische Definitionen fuer Display-Modi und -Funktionen:
//----------------------------------------------------------------------------------------------------------------------
#define LCD_CMD_MODE  0                          // Modus "LCD-Kommando-Uebertragung"
#define LCD_DATA_MODE 1                          // Modus "LCD-Daten-Uebertragung"
#define LCD_INIT_MODE 2                          // Modus "LCD-Kommando-Uebertragung fuer die LCD-Initialisierung"
#define LCD_CLR 1                                // 00000001 - Display (Textpuffer) loeschen
#define LCD_HOME 2                               // 00000010 - Cursor auf 1. Zeichen (Adresse 0)
#define LCD_DISP_ON 0x0C                         // 00001100 - Display ein, Cursor-Anzeige aus
#define LCD_FUNCTION_4BIT_1LINE 0x20             // 00100000 - 4-Bit-Mode, 1-zeilig und 5x7-Punkt-Darstellung
#define LCD_FUNCTION_4BIT_2LINES 0x28            // 00101000 - 4-Bit-Mode, 2-zeilig und 5x7-Punkt-Darstellung
#define LCD_FUNCTION_8BIT_1LINE 0x30             // 00110000 - LCD-Interface auf 8-Bit-Mode setzen, 1-zeilig
#define LCD_FUNCTION_8BIT_2LINES 0x38            // 00111000 - LCD-Interface auf 8-Bit-Mode setzen, 2-zeilig
#define LCD_SET_CGRAM_ADDR 0x40                  // Setze CGRAM-Adresse Bit6 fuer konstruierte Zeichen-Darstellung
#define LCD_SET_DDRAM_ADDR 0x80                  // Setze DDRAM-Adresse Bit7 fuer Position des konstruierten Zeichens

//----------------------------------------------------------------------------------------------------------------------
//Makros fuer die clock- und data-Signale:
//----------------------------------------------------------------------------------------------------------------------
#define LCD_SET_CLK() {LCD_CLOCK_PRT |= LCD_CLOCK_BIT;}
#define LCD_CLR_CLK() {LCD_CLOCK_PRT &= ~LCD_CLOCK_BIT;}
#define LCD_SET_DATA() {LCD_DATA_PRT |= LCD_DATA_BIT;}
#define LCD_CLR_DATA() {LCD_DATA_PRT &= ~LCD_DATA_BIT;}

//----------------------------------------------------------------------------------------------------------------------
//Funktions-Prototypen: FUNKTIONEN ZUR INITIALISIERUNG DES LCD UND AUSGABE VON KOMMANDOS UND ASCII-DATEN AN DAS LCD:
//----------------------------------------------------------------------------------------------------------------------
void lcd_init(void);                             // Initialisierung des LC-Displays                                  1.1
void lcd_delay(void);                            // Verzoegerung in Abhaengigkeit der System-Takt-Frequenz           1.2
void lcd_shift_byte(U08 data,U08 mode);          // Schreibe LED-Kommando oder Daten-Byte in das LC-Display          1.3
void lcd_init_shift_reg(U08 mode);               // Loesche Shift-Register, setze E- und ggf. RS-Bit                 1.4
void lcd_shift_nibble(U08 data);                 // Schiebe 4 Bits (ein Nibble) in das Shift-Register                1.5
void lcd_write_command(U08 command);             // Uebertrage ein vollstaendiges LCD-Kommando zum LCD               1.6
void lcd_write_data(U08 data);                   // Uebertrage ein vollstaendiges Daten-Byte zum LCD                 1.7

//----------------------------------------------------------------------------------------------------------------------
//Funktions-Prototypen: FUNKTIONEN ZUM ERZEUGEN VON DISPLAY-KOMMANDOS:
//----------------------------------------------------------------------------------------------------------------------
void lcd_clear(void);                            // CLEAR DISPLAY:                     Bit0 gesetzt                  2.1
void lcd_home(void);                             // RETURN HOME:                       Bit1 gesetzt                  2.2
void lcd_entry_mode(U08 entry_mode);             // SET ENTRY MODE:                    Bit2 gesetzt                  2.3
void lcd_display_mode(U08 display_mode);         // DISPLAY ON/OFF:                    Bit3 gesetzt                  2.4
void lcd_function_mode(U08 function_mode);       // SET FUNCTION:                      Bit5 gesetzt                  2.5
void lcd_download_char_from_rom(U08 char_index,fpU08 byte_ptr); // SET CGRAM ADDRESS:  Bit6 gesetzt                  2.6
void lcd_goto_xy(U08 xpos,U08 ypos);             // Setze Cursor-Koordinaten (x/y):    Bit7 gesetzt                  2.7

//----------------------------------------------------------------------------------------------------------------------
//Funktions-Prototypen: FUNKTIONEN ZUM ERZEUGEN VON ASCII-DATEN-STRINGS AUS VERSCHIEDENEN ZEICHEN UND ZEICHEN-GRUPPEN:
//----------------------------------------------------------------------------------------------------------------------
void lcd_write_char(U08 chr);                    // Schreibe einzelnes ASCII-Zeichen (unsigned char)                 3.1
void lcd_write_char_xy(U08 x,U08 y,U08 chr);     // Schreibe ASCII-Zeichen auf vorbestimmte Position im LCD          3.2
void lcd_write_str(pU08 sp);                     // Schreibe ASCII-String (Array mit ASCCI-Zeichen)                  3.3
void lcd_write_str_xy(U08 x,U08 y,pU08 sp);      // Schreibe ASCII-String auf vorbestimmte Position im LCD           3.4
void lcd_write_flash_str(fpU08 sp);              // Schreibe ASCII-String aus dem Array im FLASH-Speicher            3.5
void lcd_write_flash_str_xy(U08 x,U08 y,fpU08 sp); // Schreibe ASCII-String vom FLASH auf feste Cursor-Position      3.6
void lcd_write_U08(U08 value,U08 digits);        // Schreibe 8-Bit-Dual-Zahl als Dezimal-Zahl                        3.7
void lcd_write_S08(S08 value,U08 digits);        // Schreibe +/- 8-Bit-Dual-Zahl als Dezimal-Zahl                    3.8
void lcd_write_U08_hex(U08 value);               // Schreibe 8-Bit-Dual-Zahl als 2-ziffrige Hexadezimal-Zahl         3.9
void lcd_write_U08_bin(U08 value);               // Schreibe 8-bit-Dual-Zahl in binaerer Schreibweise               3.10
void lcd_write_U16(U16 value,U08 digits);        // Schreibe 16-Bit-Dual-Zahl als Dezimal-Zahl                      3.11
void lcd_write_S16(S16 value,U08 digits);        // Schreibe +/- 16-Bit-Dual-Zahl als Dezimal-Zahl                  3.12
void lcd_write_U16_hex(U16 value);               // Schreibe 16-Bit-Dual-Zahl als 4-ziffrige Hexadezimal-Zahl       3.13
void lcd_write_U32(U32 value,U08 digits);        // Schreibe 32-Bit-Dual-Zahl als Dezimal-Zahl                      3.14
void lcd_write_S32(S32 value,U08 digits);        // Schreibe +/- 32-Bit-Dual-Zahl als Dezimal-Zahl                  3.15
void lcd_write_float(float value,U08 decimals,U08 digits); // Schreibe +/- Gleitkomma-Zahl als Dezimalbruch-Zahl    3.16

//----------------------------------------------------------------------------------------------------------------------
//Mit #endif endet jede Header-Datei:
//----------------------------------------------------------------------------------------------------------------------
#endif

