#include <mega16.h> //AVR单片机相关库
flash unsigned int t[9] = {0,956,865,759,716,638,568,506,470}; flash unsigned char d[9] = {0,105,116,132,140,157,176,198,209}; #define Max_note 32
flash unsigned char music[Max_note] =
{5,2,8,2,5,2,4,2,3,2,2,2,1,4,1,2,1,2,2,2,3,2,3,2,1,2,3,2,4,2,5,8}; unsigned char note_n;
unsigned int int_n;
bit play_on;
// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
if (!play_on)
{
TCCR1B = 0x09;
}
}
// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
if (!play_on)
{
note_n = 0;
int_n = 1;
play_on = 1;
}
else
{
if (--int_n == 0)
{
TCCR1B = 0x08;
if (note_n Max_note)
{
OCR1A = t[music[note_n]];
int_n = d[music[note_n]];
note_n++;
int_n = int_n * music[note_n];
note_n++;
TCCR1B = 0x09;
}
else
play_on = 0;
}