LCD-Library
Dependents: Projekt_Wecker_LCD Projekt_Wecker_LCD Projekt_Wecker_LCD
Diff: LCD.cpp
- Revision:
- 0:b25367985a15
diff -r 000000000000 -r b25367985a15 LCD.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LCD.cpp Thu Apr 30 10:35:52 2015 +0000 @@ -0,0 +1,124 @@ + + +#include "mbed.h" +#include "LCD.h" + +LCD::LCD(PinName RS, PinName EN, PinName DB4, PinName DB5, PinName DB6, PinName DB7){ + _rs = RS; + _en = EN; + _db4 = DB4; + _db5 = DB5; + _db6 = DB6; + _db7 = DB7; + DigitalOut rs(RS); + DigitalOut en(EN); + BusOut db(DB4, DB5, DB6, DB7); + + // warten auf die Bereitschaft des LCD + wait_ms( LCD_BOOTUP_MS ); + + // Soft-Reset muss 3mal hintereinander gesendet werden zur Initialisierung + out( LCD_SOFT_RESET ); + wait_ms( LCD_SOFT_RESET_MS1 ); + enable(); + wait_ms( LCD_SOFT_RESET_MS2 ); + enable(); + wait_ms( LCD_SOFT_RESET_MS3 ); + + // 4-bit Modus aktivieren + out( LCD_SET_FUNCTION | + LCD_FUNCTION_4BIT ); + wait_ms( LCD_SET_4BITMODE_MS ); + + // 4-bit Modus / 2 Zeilen / 5x7 + command( LCD_SET_FUNCTION | + LCD_FUNCTION_4BIT | + LCD_FUNCTION_2LINE | + LCD_FUNCTION_5X7 ); + + // Display ein / Cursor aus / Blinken aus + command( LCD_SET_DISPLAY | + LCD_DISPLAY_ON | + LCD_CURSOR_ON | + LCD_BLINKING_OFF); + + // Cursor inkrement / kein Scrollen + command( LCD_SET_ENTRY | + LCD_ENTRY_INCREASE | + LCD_ENTRY_NOSHIFT ); + + clear(); +}; + +void LCD::clear(void){ + command(LCD_CLEAR_DISPLAY ); + wait_ms( LCD_CLEAR_DISPLAY_MS ); +}; + +void LCD::home(void){ + command( LCD_CURSOR_HOME ); + wait_ms( LCD_CURSOR_HOME_MS ); +} + +void LCD::data(unsigned char data){ + DigitalOut rs(_rs); + rs = 1; // RS auf 1 setzen + out(data>>4); // zuerst die oberen, + out(data); // dann die unteren 4 Bit senden + wait_us( LCD_WRITEDATA_US ); +} + +// Schreibt einen String auf das LCD +void LCD::string(const char *data){ + while( *data != '\0' ) + LCD::data( *data++ ); +} + +// Setzt den Cursor in Spalte x (0..15) Zeile y (1..4) +void LCD::setcursor(unsigned char x, unsigned char y ) +{ + unsigned char data; + switch (y) + { + case 1: // 1. Zeile + data = LCD_SET_DDADR + LCD_DDADR_LINE1 + x; + break; + case 2: // 2. Zeile + data = LCD_SET_DDADR + LCD_DDADR_LINE2 + x; + break; + case 3: // 3. Zeile + data = LCD_SET_DDADR + LCD_DDADR_LINE3 + x; + break; + case 4: // 4. Zeile + data = LCD_SET_DDADR + LCD_DDADR_LINE4 + x; + break; + default: + return; // für den Fall einer falschen Zeile + } + command(data); +} + +void LCD::out(unsigned char data){ + BusOut db(_db4, _db5, _db6, _db7); + db = data; // Bits setzen + enable(); +}; + +void LCD::enable(){ + DigitalOut en(_en); + en = 1; + wait_us( LCD_ENABLE_US ); // kurze Pause + en = 0; +}; + +void LCD::command(unsigned char data){ + DigitalOut rs(_rs); + // RS auf 0 setzen + rs = 0; + out(data>>4); // zuerst die oberen, + out(data); // dann die unteren 4 Bit senden + wait_us( LCD_COMMAND_US ); +}; + + +