diff --git a/lcd.c b/lcd.c index ccc9d52..2deb80c 100644 --- a/lcd.c +++ b/lcd.c @@ -1,7 +1,75 @@ #include +#include -int -main() -{ +// Define LCD control pin connections +#define LCD_RS_PIN PB0 +#define LCD_RW_PIN PB1 +#define LCD_E_PIN PB2 +// Define LCD data pin connections +#define LCD_DATA_PORT PORTD +#define LCD_DATA_DDR DDRD +// Function prototypes +void LCD_init(); +void LCD_command(uint8_t cmd); +void LCD_write(uint8_t data); +void LCD_send(char* str); + +int main() { + // Set control pins as outputs + DDRB |= (1 << LCD_RS_PIN) | (1 << LCD_RW_PIN) | (1 << LCD_E_PIN); + // Set data pins as outputs + LCD_DATA_DDR = 0xFF; + + // Initialize LCD + LCD_init(); + + // Display "Hello, World!" + LCD_send("Hello, World!"); + + while (1) { + // Your main code here + } + + return 0; } + +// Initialize LCD +void LCD_init() { + _delay_ms(15); // Delay for power-on + LCD_command(0x38); // Function Set: 8-bit data, 2-line display, 5x8 font + LCD_command(0x0C); // Display ON, Cursor OFF, Blink OFF + LCD_command(0x01); // Clear display + _delay_ms(2); // Delay for Clear Display command + LCD_command(0x06); // Entry Mode Set: Increment cursor, No display shift +} + +// Send command to LCD +void LCD_command(uint8_t cmd) { + LCD_RS_PORT &= ~(1 << LCD_RS_PIN); // Set RS low for command mode + LCD_RW_PORT &= ~(1 << LCD_RW_PIN); // Set RW low for write mode + LCD_DATA_PORT = cmd; // Send command to data port + LCD_E_PORT |= (1 << LCD_E_PIN); // Enable LCD + _delay_us(1); // Short delay + LCD_E_PORT &= ~(1 << LCD_E_PIN); // Disable LCD + _delay_us(100); // Delay for command execution +} + +// Write data to LCD +void LCD_write(uint8_t data) { + LCD_RS_PORT |= (1 << LCD_RS_PIN); // Set RS high for data mode + LCD_RW_PORT &= ~(1 << LCD_RW_PIN); // Set RW low for write mode + LCD_DATA_PORT = data; // Send data to data port + LCD_E_PORT |= (1 << LCD_E_PIN); // Enable LCD + _delay_us(1); // Short delay + LCD_E_PORT &= ~(1 << LCD_E_PIN); // Disable LCD + _delay_us(100); // Delay for data execution +} + +// Send string to LCD +void LCD_send(char* str) { + while (*str) { + LCD_write(*str++); + } +} +