avr_piano/lcd.c
2024-04-17 19:25:54 -04:00

90 lines
2.0 KiB
C

#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
// Define LCD control pin connections
#define LCD_RS_PIN PB0
#define LCD_RW_PIN PB1
#define LCD_E_PIN PB2
#define LCD_RS_PORT PORTB
#define LCD_RW_PORT PORTB
#define LCD_E_PORT PORTB
// 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!");
for (;;) {
// 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++);
}