// musicbox1.c
// for NerdKits with ATtiny26L
// mrobbins@mit.edu
// ported by pbfy0 for ATmega168
#define F_CPU 14745600
#include "../includes.h"
void lcd_clline() {
lcd_write_string(PSTR(" "));
}
void lcd_qclear_h(){
lcd_home();
lcd_clline();
lcd_line_two();
lcd_clline();
lcd_home();
}
void play_tone(uint16_t delay, uint8_t duration){
uint16_t tmp = 100 * duration;
uint16_t delaysm = delay / 50;
uint16_t cycles = tmp / delaysm;
while (cycles > 0) {
PORTB |= (1<<5);
delay_us(delay);
PORTB &= ~(1<<5);
delay_us(delay);
cycles--;
}
}
void PlayAndWrite(char *strtoprint, uint16_t delay, uint8_t duration){
printf_P(PSTR("%s"), strtoprint);
play_tone(delay, duration);
}
#define D5 851
#define E5 758
#define Fsh5 675
#define G5 637
#define A5 568
#define B5 506
#define C6 477
#define D6 425
#define DUR 40
#define DUR2 80
int main(){
lcd_init();
lcd_home();
FILE lcd_stream = FDEV_SETUP_STREAM(lcd_putchar, 0, _FDEV_SETUP_WRITE);
stdin = stdout = &lcd_stream;
DDRB |= (1<<5);
DDRC &= ~(1<<5);
PORTC |= (1<<5);
while(1){
lcd_write_string(PSTR("Press to play a song..."));
while(PINC & (1<<5));
lcd_qclear_h();
PlayAndWrite("Happy ", D5, DUR);
PlayAndWrite("birth", E5, DUR);
PlayAndWrite("day ", D5, DUR);
PlayAndWrite("to ", G5, DUR);
PlayAndWrite("you ", Fsh5, DUR2);
lcd_line_two();
PlayAndWrite("Happy ", D5, DUR);
PlayAndWrite("birth", E5, DUR);
PlayAndWrite("day ", D5, DUR);
PlayAndWrite("to ", A5, DUR);
PlayAndWrite("you ", G5, DUR2);
lcd_qclear_h();
PlayAndWrite("Happy ", D5, DUR);
PlayAndWrite("birth", D6, DUR);
PlayAndWrite("day ", B5, DUR);
PlayAndWrite("dear ", G5, DUR);
PlayAndWrite("--", Fsh5, DUR);
PlayAndWrite("--", E5, DUR);
lcd_line_two();
PlayAndWrite("Happy ", C6, DUR);
PlayAndWrite("birth", B5, DUR);
PlayAndWrite("day ", G5, DUR);
PlayAndWrite("to ", A5, DUR);
PlayAndWrite("you! ", G5, DUR2);
delay_ms(500);
}
}