#include #include #include #include "lcd.h" #include "system.h" #include // Define two 8 character strings unsigned char line1[16]; unsigned char line2[16]; //////////////////////////////////////////////////////////////////////////////// // Erzeugt einen Enable-Puls static void lcd_enable( void ) { LCD_EN = 1; delay_us(LCD_ENABLE_US); // kurze Pause LCD_EN = 0; } //////////////////////////////////////////////////////////////////////////////// // Sends nibble to display static void lcd_nibble(unsigned char nibble) { LATGbits.LATG6 = (nibble>>3)&1; LATGbits.LATG7 = (nibble>>2)&1; LATGbits.LATG8 = (nibble>>1)&1; LATGbits.LATG9 = (nibble>>0)&1; lcd_enable(); delay_ms(2); // Enough time even for slowest command } //////////////////////////////////////////////////////////////////////////////// // Initialisierung: muss ganz am Anfang des Programms aufgerufen werden. void lcd_init( void ) { LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; // LCD Soft Reset delay_ms(LCD_BOOTUP_MS); lcd_nibble(LCD_SOFT_RESET); delay_ms(LCD_SOFT_RESET_MS1); lcd_nibble(LCD_SOFT_RESET); delay_ms(LCD_SOFT_RESET_MS2); lcd_nibble(LCD_SOFT_RESET); delay_ms(LCD_SOFT_RESET_MS3); lcd_nibble(0x02); // Display settings lcd_cmd(LCD_SET_FUNCTION | LCD_FUNCTION_4BIT | LCD_FUNCTION_2LINE | LCD_FUNCTION_5X7 ); lcd_cmd(LCD_SET_DISPLAY | LCD_DISPLAY_OFF); lcd_cmd(LCD_DISPLAY_CLEAR); lcd_cmd(LCD_SET_ENTRY | LCD_ENTRY_INCREASE | LCD_ENTRY_NOSHIFT); lcd_cmd(LCD_SET_DISPLAY | LCD_DISPLAY_ON | LCD_CURSOR_OFF | LCD_BLINKING_OFF); lcd_clear(); } //////////////////////////////////////////////////////////////////////////////// // Sendet ein Datenbyte an das LCD void lcd_data( unsigned int data ) { LCD_RS = 1; lcd_nibble(data >> 4); lcd_nibble(data & 0x0F); //LCD_PORT |= (1<> 4); lcd_nibble(data & 0x0F); delay_us( LCD_COMMAND_US ); } //////////////////////////////////////////////////////////////////////////////// // Sendet den Befehl zur Löschung des Displays void lcd_clear( void ) { lcd_cmd( LCD_DISPLAY_CLEAR ); delay_ms( LCD_DISPLAY_CLEAR_MS ); } //////////////////////////////////////////////////////////////////////////////// // Sendet den Befehl: Cursor Home void lcd_home( void ) { lcd_cmd( LCD_CURSOR_HOME ); delay_ms( LCD_CURSOR_HOME_MS ); } //////////////////////////////////////////////////////////////////////////////// // Setzt den Cursor in Spalte x (0..15) Zeile y (1..4) void lcd_setcursor( unsigned int x, unsigned int y ) { unsigned int 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; default: return; // für den Fall einer falschen Zeile } lcd_cmd( data ); } //////////////////////////////////////////////////////////////////////////////// // Beschreibt das Display mit gegebenen Daten void lcd_write(unsigned char* data, unsigned int value)//Display Data on the LCD { unsigned int i, n, temp; lcd_clear(); lcd_home(); while( *data != '\0' ) lcd_data( *data++ ); lcd_cmd(0xC0); // second line temp = value; for (i=0; i<16; i++) { line2[15 - i] = temp % 2 + 48; temp = temp / 2; } for (n=0 ; n<=16 ; ++n) lcd_data(line2[n]); } //////////////////////////////////////////////////////////////////////////////// // Schreibt einen String auf das LCD void lcd_string( const char *data ) { while( *data != '\0' ) lcd_data( *data++ ); } // Delay by specified number of milliseconds void delay_ms(unsigned int n) { while(n--) __delay32(14000); } ////////////////////////////////////////////////////////////////////////////// // Delay by specified number of mikroseconds void delay_us(unsigned int n) { while(n--) __delay32(100); }