eel4746_avr_piano

For our Microprocessor's class final project, we chose to make a chiptune piano using AVR C on two Arduino UNOs.
Log | Files | Refs | README | LICENSE

commit 90d226a838a5c7f2d6ea86a529241b3f571f7130
parent 9f6c3500159cd828d633345d1fb39250b4e5669b
Author: Joseph Bryant <jbryant0653@floridapoly.edu>
Date:   Wed, 17 Apr 2024 15:33:18 -0400

Garbage LCD Code

Diffstat:
Mlcd.c | 74+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 71 insertions(+), 3 deletions(-)

diff --git a/lcd.c b/lcd.c @@ -1,7 +1,75 @@ #include <avr/io.h> +#include <util/delay.h> -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++); + } +} +