689
// Initialize LCD for 4-bit mode void lcd_initialize(void) { lcd_command(0x02); // Return cursor to home position lcd_command(0x28); // Set 4-bit mode, 2-line display, 5x8 font lcd_command(0x06); // Set entry mode with auto-increment lcd_command(0x0C); // Display ON, cursor OFF lcd_command(0x01); // Clear display __delay_ms(2); // Short delay for clear screen command } // Send data to LCD void lcd_data(unsigned char data) { RS = 1; RW = 0; // Set to data mode and write PORTD = (data & 0xF0); // Send upper nibble EN = 1; __delay_ms(2); EN = 0; PORTD = ((data << 4) & 0xF0); // Send lower nibble EN = 1; __delay_ms(2); EN = 0; } // Send string to LCD void lcd_string(const char *str, unsigned char len) { for(unsigned char i = 0; i < len; i++) { lcd_data(str[i]); } } // Send command to LCD void lcd_command(unsigned char cmd) { RS = 0; RW = 0; // Set to command mode and write PORTD = (cmd & 0xF0); // Send upper nibble EN = 1; __delay_ms(2); EN = 0; PORTD = ((cmd << 4) & 0xF0); // Send lower nibble EN = 1; __delay_ms(2); EN = 0; }