基于avr单片机的电子琴设计内容摘要:

00}, {0,0} }。 ////// abcdefg void music_data_sing(void) { sound(music_data[i][0])。 //输出音符 // PORTA=seg7_data(i%16)。 delay_ms(music_data[i][1])。 //节拍延时 TCCR1A = 0x00。 //奏完一个音符停止 PORTD|=15。 if(!music_data[++i][1]) //准备一下个音符 { i=0。 play=0。 pause=1。 input=0。 if((++list)5) {list=0。 }。 } } /************************************ * 端口初始化函数 * ************************************/ void port_init(void) { DDRD|=0xa0。 //D5 口配置为输出,驱动蜂鸣器 PORTD|=0x0f。 DDRB=0xf0。 PORTB=0X0F。 DDRA=0xff。 Seg7_Led_Init()。 MCUCR=0x00。 GICR = 0x40。 SEI()。 } /********************************* name: list_deal()。 function: deal with many songs of the machine **********************************/ extern void list_deal(void) { switch(list) { case 0: butterfly_lovers_sing()。 break。 case 1: moscow_night_sing()。 break。 case 2: Sdu_Song_sing()。 break。 case 3: super_mario_sing()。 break。 case 4: kaqiusha_sing()。 break。 case 5: music_data_sing()。 break。 } } /********************************* name: key_deal()。 function: deal with states of the machine **********************************/ extern void key_deal(void) { if(state==0)//播放状态 { while(playamp。 amp。 pause) { list_deal()。 /* sound(music_data[i][0])。 //输出音符 delay_ms(music_data[i][1])。 //节拍延时 TCCR1A = 0x00。 //奏完一个音符停止 PORTD|=15。 if(!music_data[i++][1]) { i=0。 } *///调试用 } //播放选择的音乐 } //播放 mode else { while(playamp。 amp。 pauseamp。 amp。 (~input)) { sound(Mode_Data[MUSIC_DATA[i][0]])。 //输出音符 PORTA=seg7_data(i%16)。 delay_ms(400)。 //节拍延时 TCCR1A = 0x00。 //奏完一个音符停止 PORTD|=15。 if(!MUSIC_DATA[++i][1]) //准备一下个音符 { i=0。 play=0。 pause=1。 input=0。 } }//播放选择的音乐 }//输入 mode } /************************************** handle keyin。 PROBLEMS: **************************************/ pragma interrupt_handler int0_isr:2 void int0_isr(void) { TCCR1A = 0x00。 //关计时器 减少干扰,只有再打开才会响 GICR amp。 = ~0x40。 //关中断 key=key_scan()。 //external interupt on INT0 if(key) { if(!state)//播放状态 { Seg7_Bit0_En()。 switch(key) { case PAUSE:{pause=0。 break。 }。 case PLAY:{play=1。 pause=1。 break。 }。 case STOP:{play=0。 i=0。 break。 }。 case RST:{if(~play) {state=1。 input=1。 break。 }。 i=0,play=0,pause=1。 break。 }。 case ADVANCE: if(play==1) {if((i+2)length) break。 else i+=2。 break。 }。 if(!play) {if(++list5)list=0。 break。 }。 case BACK: if(play==1) {if(i2){i=0。 break。 }else i=2。 break。 }。 if(!play) {if(list0)list=5。 break。 }。 default :break。 }。 Seg7_Data_Port=seg7_data(i)。 } else if(state) { if((key=8)amp。 amp。 input) { add(key)。 MUSIC_DATA[i++][0]=key。 MUSIC_DATA[i1][1]=400。 sound(Mode_Data[key])。 delay_ms(200)。 TCCR1A = 0。 //奏完一个音符停止 PORTD|=15。 }。 //音乐数据 if(key8) { switch(key) { case PAUSE:{pause=0。 break。 }。 case PLAY: if(~input) //不是输入模式 {play=1。 pause=1。 break。 } /* if(i!=0) //输入模式 {MUSIC_DATA[i][0]=0。 MUSIC_DATA[i][1]=0。 //clear i=0,play=1,pause=1。 }。 input=0。 break。 */ case DEL: if(input) {del(i4?MUSIC_DATA[i5][0]:16)。 if(i0) i。 }。 break。 case OVER: if(input)//输入模式 {MUSIC_DATA[i][0]=0。 MUSIC_DATA[i][1]=0。 //clear play=0。 i=0,input=0,pause=1。 break。 }。 case STOP: if(~input){play=0,pause=1,i=0。 }。 break。 //输入模式 case RST: if(input) {i=0,pause=1,play=0。 break。 }。 //如果正在输入, if(~inputamp。 amp。 ~playamp。 amp。 pause)////没有输入 {i=0,pause=1。 state=0。 break。 } if(~inputamp。 amp。 ~pause) //没有输入且暂停 切换模式 {input=1,i=0,play=0,pause=1。 break。 }//则 case STOP:{play=0。 i=0。 break。 }。 重新输入 case ADVANCE:if(inputamp。 ~pause) {MUSIC_DATA[i1][1]+=200。 show(MUSIC_DATA[i1][1])。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。