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 3f358c19e5fe1d48285c4a9b3930a942f2f866fe
parent ae4f92b170a05c4c62c335aa17d64f5f95860010
Author: Vineet K <git@vineetk.net>
Date:   Sat, 20 Apr 2024 15:42:35 -0400

import lcd.c from lab 10

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

diff --git a/lcd.c b/lcd.c @@ -1,89 +1,127 @@ -#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; +#include <avr/io.h> //standard AVR header - // Initialize LCD - LCD_init(); +#define F_CPU 16000000UL // THE CPU FREQUENCY +#include <util/delay.h> //delay header - // Display "Hello, World!" - LCD_send("Hello, World!"); +#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 - for (;;) { - // Your main code here - } +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 - return 0; + 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 } -// Initialize LCD -void -LCD_init() +//******************************************************* +void lcdCommand( unsigned char cmnd ){ + LCD_CPRT &= ~ (1<<LCD_RS); //RS = 0 for command + lcd_putValue(cmnd); +} + +//******************************************************* +void lcdData( unsigned char data ) { - _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 + LCD_CPRT |= (1<<LCD_RS); //RS = 1 for data + lcd_putValue(data); } -// Send command to LCD -void -LCD_command(uint8_t cmd) +void lcd_clear() { - 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 + lcdCommand(0x01); + _delay_us(1700); } -// Write data to LCD -void -LCD_write(uint8_t data) +void lcd_showCursor() { - 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 + lcdCommand(0x0E); + _delay_us(50); } -// Send string to LCD -void -LCD_send(char *str) +void lcd_hideCursor() { - while (*str) - LCD_write(*str++); + lcdCommand(0x0C); + _delay_us(50); } +//******************************************************* +void lcd_init() +{ + LCD_DDDR |= 0xF0; + 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(); +} + +//******************************************************* +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); +} + +//******************************************************* +void lcd_print( char * str ) +{ + unsigned char i = 0; + + while(str[i] != 0) //while it is not end of string + { + lcdData(str[i]); + i++ ; + } +} + +//******************************************************* +int main(void) +{ + lcd_init(); + lcd_hideCursor(); + + while(1) + { + lcd_clear(); + lcd_gotoxy(1,1); + lcd_print("The world is but"); + lcd_gotoxy(1,2); + lcd_print("one country"); + + lcd_showCursor(); + _delay_ms(2500); + + lcd_clear(); + + lcd_gotoxy(1,1); + lcd_print("and mankind its"); + lcd_gotoxy(1,2); + lcd_print("citizens."); + _delay_ms(3500); + } + + return 0; +} +\ No newline at end of file