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 c2fe984ed4e6e0077747b1eb5ffa76e5a7c2fe5f
parent 3f358c19e5fe1d48285c4a9b3930a942f2f866fe
Author: Joseph Bryant <jbryant0653@floridapoly.edu>
Date:   Sun, 21 Apr 2024 15:10:35 -0400

Full LCD setup with buttons A5 and A4 working!

Diffstat:
Mlcd.c | 210+++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------
1 file changed, 146 insertions(+), 64 deletions(-)

diff --git a/lcd.c b/lcd.c @@ -1,49 +1,60 @@ -#include <avr/io.h> //standard AVR header - -#define F_CPU 16000000UL // THE CPU FREQUENCY +#include <avr/io.h> //standard AVR header +#define F_CPU 16000000UL // THE CPU FREQUENCY #include <util/delay.h> //delay header - -#define LCD_DPRT PORTD //LCD DATA PORT -#define LCD_DDDR DDRD //LCD DATA DDR -#define LCD_DPIN PIND //LCD DATA PIN -#define LCD_CPRT PORTB //LCD COMMANDS PORT -#define LCD_CDDR DDRB //LCD COMMANDS DDR -#define LCD_CPIN PINB //LCD COMMANDS PIN -#define LCD_RS 0 //LCD RS -#define LCD_EN 1 //LCD EN - -void lcd_putValue(unsigned char val){ +#include <avr/interrupt.h> //interrupt header + +#define LCD_DPRT PORTD //LCD DATA PORT +#define LCD_DDDR DDRD //LCD DATA DDR +#define LCD_DPIN PIND //LCD DATA PIN +#define LCD_CPRT PORTB //LCD COMMANDS PORT +#define LCD_CDDR DDRB //LCD COMMANDS DDR +#define LCD_CPIN PINB //LCD COMMANDS PIN +#define LCD_RS 0 //LCD RS +#define LCD_EN 1 //LCD EN + +// Define your buffer sizes +#define SERIAL_BUFFER_SIZE 20 +#define NOTES_BUFFER_SIZE 20 + +// Global variables +char serialBuffer[SERIAL_BUFFER_SIZE]; +char notesBuffer[NOTES_BUFFER_SIZE]; +int serialIndex = 0; +int notesIndex = 0; +volatile int buttonState = 0; // Holds the state of all buttons +void lcd_putValue(unsigned char val) +{ LCD_DPRT &= 0x0F; - LCD_DPRT |= (val&0xF0); //send cmnd to data port - LCD_CPRT |= (1<<LCD_EN); //EN = 1 for H-to-L pulse - _delay_us(1); //wait to make enable wide - LCD_CPRT &= ~ (1<<LCD_EN); //EN = 0 for H-to-L pulse - _delay_us(100); //wait to make enable wide - + LCD_DPRT |= (val & 0xF0); //send cmnd to data port + LCD_CPRT |= (1 << LCD_EN); //EN = 1 for H-to-L pulse + _delay_us(1); //wait to make enable wide + LCD_CPRT &= ~(1 << LCD_EN); //EN = 0 for H-to-L pulse + _delay_us(100); //wait to make enable wide LCD_DPRT &= 0x0F; - LCD_DPRT |= val<<4; //send cmnd to data port - LCD_CPRT |= (1<<LCD_EN); //EN = 1 for H-to-L pulse - _delay_us(1); //wait to make enable wide - LCD_CPRT &= ~ (1<<LCD_EN); //EN = 0 for H-to-L pulse - _delay_us(100); //wait to make enable wide + LCD_DPRT |= val << 4; //send cmnd to data port + LCD_CPRT |= (1 << LCD_EN); //EN = 1 for H-to-L pulse + _delay_us(1); //wait to make enable wide + LCD_CPRT &= ~(1 << LCD_EN); //EN = 0 for H-to-L pulse + _delay_us(100); //wait to make enable wide } //******************************************************* -void lcdCommand( unsigned char cmnd ){ - LCD_CPRT &= ~ (1<<LCD_RS); //RS = 0 for command +void lcdCommand(unsigned char cmnd) +{ + LCD_CPRT &= ~(1 << LCD_RS); //RS = 0 for command lcd_putValue(cmnd); } //******************************************************* -void lcdData( unsigned char data ) +void lcdData(unsigned char data) { - LCD_CPRT |= (1<<LCD_RS); //RS = 1 for data - lcd_putValue(data); + LCD_CPRT |= (1 << LCD_RS); //RS = 1 for data + lcd_putValue(data); } void lcd_clear() { - lcdCommand(0x01); + lcdCommand(0x01); _delay_us(1700); } @@ -63,65 +74,137 @@ void lcd_hideCursor() void lcd_init() { LCD_DDDR |= 0xF0; - LCD_CDDR |= (1<<LCD_RS)|(1<<LCD_EN); - - LCD_CPRT &=~(1<<LCD_EN); //LCD_EN = 0 + LCD_CDDR |= (1 << LCD_RS) | (1 << LCD_EN); + LCD_CPRT &= ~(1 << LCD_EN); //LCD_EN = 0 _delay_us(2000); //wait for init. - lcdCommand(0x33); //send $33 for init. lcdCommand(0x32); //send $32 for init lcdCommand(0x28); //init. LCD 2 line,5*7 matrix lcdCommand(0x0e); //display on, cursor on lcdCommand(0x06); //shift cursor right - - lcd_clear(); + lcd_clear(); } //******************************************************* void lcd_gotoxy(unsigned char x, unsigned char y) -{ - unsigned char firstCharAdr[]={0x80,0xC0,0x94,0xD4};//Table 12-4 - lcdCommand(firstCharAdr[y-1] + x - 1); - _delay_us(100); +{ + unsigned char firstCharAdr[] = { 0x80, 0xC0, 0x94, 0xD4 }; //Table 12-4 + lcdCommand(firstCharAdr[y - 1] + x - 1); + _delay_us(100); } //******************************************************* -void lcd_print( char * str ) +void lcd_print(char *str) { unsigned char i = 0; - - while(str[i] != 0) //while it is not end of string + while (str[i] != 0) //while it is not end of string { lcdData(str[i]); - i++ ; + i++; } } +char getSerialData() { + // Read serial data and return it + return ' '; +} + +char getNote() { + // Read notes data and return it + return ' '; +} + +void setup() { + // Initialize Serial communication + // Initialize LCD + // Initialize buttons as inputs + // Set pins A4 and A5 as inputs with pull-up resistors enabled + DDRC &= ~((1 << DDC4) | (1 << DDC5)); + PORTC |= (1 << PORTC4) | (1 << PORTC5); + + // Enable Pin Change Interrupt on pins PC4 and PC5 + PCMSK1 |= (1 << PCINT12) | (1 << PCINT13); // Enable PCINT for pins PC4 and PC5 + PCICR |= (1 << PCIE1); // Enable Pin Change Interrupt 1 + sei(); // Enable global interrupts +} + +ISR(PCINT1_vect) { + // Update button state when any pin changes state + for (unsigned char i = 0; i <= 5; i++) { + if (PINC & (1 << i)) { + buttonState = i; + break; + } + } +} + +void displaySerialData() { + lcd_clear(); + lcd_gotoxy(1, 1); + while (!(buttonState == 5)) { + char newData = getSerialData(); + if (newData != '\0') { + // Add new data to the left side of line 1 of the LCD + // Push existing data to the right + // Display on LCD + } + _delay_ms(100); // Adjust delay as needed + } +} + +void displayNotes() { + lcd_clear(); + lcd_gotoxy(1, 1); + while (buttonState == 4) { + char newNote = getNote(); + if (newNote != '\0') { + // Add new note to the right side of line 1 of the LCD + // Push existing notes to the left + // Display on LCD + } + _delay_ms(1000); // Adjust delay as needed + } +} + //******************************************************* -int main(void) -{ +int main(void) { + lcd_init(); lcd_init(); lcd_hideCursor(); - - while(1) - { + + setup(); + lcd_clear(); + while (1) { + // Check button state and perform actions accordingly + if (buttonState == 5) { + lcd_clear(); + lcd_gotoxy(1,1); + lcd_print("Button A5 Works"); + _delay_ms(100); + //displaySerialData(); + } else if (buttonState == 4) { + lcd_clear(); + lcd_gotoxy(1,2); + lcd_print("Button A4 Works"); + _delay_ms(100); + //displayNotes(); + } + } + return 0; + /*while (1) { lcd_clear(); - lcd_gotoxy(1,1); - lcd_print("The world is but"); - lcd_gotoxy(1,2); + lcd_gotoxy(1, 1); + lcd_print("Note 1:"); + lcd_gotoxy(1, 2); lcd_print("one country"); - lcd_showCursor(); _delay_ms(2500); - lcd_clear(); - - lcd_gotoxy(1,1); + lcd_gotoxy(1, 1); lcd_print("and mankind its"); - lcd_gotoxy(1,2); - lcd_print("citizens."); - _delay_ms(3500); + lcd_gotoxy(1, 2); + lcd_print("citizens."); + _delay_ms(3500); } - - return 0; -} -\ No newline at end of file + return 0;*/ +}