單片機(jī)課程設(shè)計(jì)報(bào)告電子琴

上傳人:j** 文檔編號(hào):59647173 上傳時(shí)間:2022-03-04 格式:DOC 頁(yè)數(shù):22 大?。?8KB
收藏 版權(quán)申訴 舉報(bào) 下載
單片機(jī)課程設(shè)計(jì)報(bào)告電子琴_第1頁(yè)
第1頁(yè) / 共22頁(yè)
單片機(jī)課程設(shè)計(jì)報(bào)告電子琴_第2頁(yè)
第2頁(yè) / 共22頁(yè)
單片機(jī)課程設(shè)計(jì)報(bào)告電子琴_第3頁(yè)
第3頁(yè) / 共22頁(yè)

下載文檔到電腦,查找使用更方便

20 積分

下載資源

還剩頁(yè)未讀,繼續(xù)閱讀

資源描述:

《單片機(jī)課程設(shè)計(jì)報(bào)告電子琴》由會(huì)員分享,可在線閱讀,更多相關(guān)《單片機(jī)課程設(shè)計(jì)報(bào)告電子琴(22頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、 電子音調(diào)發(fā)生器 一、實(shí)驗(yàn)?zāi)康? 1. 了解計(jì)算機(jī)發(fā)聲原理. 2。 熟悉定時(shí)器和鍵盤掃描電路的工作原理及編程方法。 二、實(shí)驗(yàn)完成的功能 1。 利用鍵盤1~7進(jìn)行音調(diào)選擇,即按下音符產(chǎn)生對(duì)應(yīng)音調(diào)。 2。 事先存儲(chǔ)三首歌曲,并可進(jìn)行選擇播放。 3。 譜曲功能:通過(guò)按鍵對(duì)LCD菜單選項(xiàng)進(jìn)行選擇,進(jìn)入譜曲界面,通過(guò)按鍵1~7分別輸入音高與幾分音符類型,由按鍵輸入若干數(shù)據(jù)完成譜曲。 4. 在播放存儲(chǔ)歌曲與譜曲播放時(shí),對(duì)應(yīng)音符及其節(jié)奏LCD顯示對(duì)應(yīng)頻譜。 5。 在播放音樂(lè)時(shí)按“返回”鍵出現(xiàn)返回界面,由鍵盤按“確認(rèn)”鍵選擇返回主菜單或循環(huán)播放。 三、實(shí)驗(yàn)原理 1。 音節(jié)由不同頻率的方

2、波產(chǎn)生,音節(jié)與頻率的關(guān)系如表(1)所示。要產(chǎn)生音頻方波,只要計(jì)算出某一音頻的周期(1 / 頻率),然后將此周期除以2,即為半周期的時(shí)間.利用計(jì)時(shí)器計(jì)時(shí)此半周期時(shí)間,每當(dāng)計(jì)時(shí)到后就將輸出方波的I/O(P1。7)反相,然后重復(fù)計(jì)時(shí)此半周期時(shí)間再對(duì)I/O反相,就可在P1。7腳得到此頻率的方波。將P1.7經(jīng)過(guò)驅(qū)動(dòng)電路與蜂鳴器相連,隨著P1。7口輸出不同頻率的方波,蜂鳴器便會(huì)發(fā)出不同的聲音。音樂(lè)的節(jié)拍是由延時(shí)實(shí)現(xiàn)的,如果1拍的時(shí)間為0.4秒,1/4拍是0.1秒。只要設(shè)定延時(shí)時(shí)間,就可得到節(jié)拍的時(shí)間。延時(shí)實(shí)現(xiàn)基本延時(shí)時(shí)間,節(jié)拍值只能是它的整數(shù)倍。 每個(gè)音節(jié)相應(yīng)的定時(shí)器初值計(jì)算公式如下: (1/2)*(

3、1/f)=(12/fose)*(216—x) 即 x=216-(fose/24f) 其中,f是音調(diào)頻率,當(dāng)晶振fosc=11。0592MHz時(shí),音節(jié)“1”相應(yīng)的定時(shí)器初值為x,則可得到x=63777D=F921H,其它的可同樣得到。 表(1) 音節(jié)與頻率的關(guān)系 音調(diào) 頻率(Hz) X(HEX) 1 262 F921 2 294 F9E1 3 330 FA8C 4 349 FAD8 5 392 FB68 6 440 FBE9 7 494 FC5B i 523 FC8F 在編寫(xiě)歌曲代碼過(guò)程中,音高由三位

4、數(shù)字組成:個(gè)位是表示1~7 這七個(gè)音符;十位是表示音符所在的音區(qū):1—低音,-中音,-高音;百位表示這個(gè)音符是否要升半音: 0—不升,—升半音。音長(zhǎng)最多由三位數(shù)字組成:個(gè)位表示音符的時(shí)值,其對(duì)應(yīng)關(guān)系是: |數(shù)值(n): |0 |1 |2 |3 | 4 | 5 | 6 |幾分音符: |1 |2 |4 |8 |16 |32 |64 音符=2^n 十位表示音符的演奏效果(0—2): 0-普通,—連音,—頓音,百位是符點(diǎn)位: 0-無(wú)符點(diǎn),1—有符點(diǎn)。 2.鍵盤掃描 將單片機(jī)P1.0~P1。7(引腳1~8)與鍵盤上對(duì)應(yīng)引腳相連,其中P1.0~P1。3控制鍵盤的行,P1

5、。4~P1。7控制鍵盤的列,這次使用的鍵盤是4行4列,鍵盤上的第一行到第四行由8位十六進(jìn)制代碼的低四位控制,即第一行若有鍵按下,則8位十六進(jìn)制代碼的后四位為0x8,第二行有按鍵按下,則后四位代碼為0x4,依此規(guī)律類推;鍵盤上的第一列到第四列由8位十六進(jìn)制代碼的高四位控制,即第一列若有鍵按下,則8位十六進(jìn)制代碼的前四位為0x8,第二列有按鍵按下,則前四位代碼為0x4,依此規(guī)律類推.綜上所述,可以根據(jù)8位十六進(jìn)制的高四位和低四位數(shù)據(jù),分別確定按下的鍵處于第幾行第幾列,從而確定按鍵的位置,實(shí)現(xiàn)鍵盤掃描的功能。 3.LCD顯示 根據(jù)寫(xiě)命令函數(shù)wrcomd和寫(xiě)數(shù)據(jù)函數(shù)wrdata分別控制LCD的命

6、令寫(xiě)入和數(shù)據(jù)寫(xiě)入。具體操作方法是由寫(xiě)命令函數(shù)wrcomd編程控制數(shù)據(jù)輸入的行列,再由寫(xiě)數(shù)據(jù)函數(shù)wrdata編程寫(xiě)入需要在LCD上顯示的數(shù)據(jù)或應(yīng)執(zhí)行的操作,結(jié)合兩個(gè)命令一起控制LCD顯示. 四.產(chǎn)品展示 五。實(shí)驗(yàn)程序 #ifndef _DRIVEFUTION_H_ #define _DRIVEFUTION_H_ /*********************EEPROM函數(shù)*******************/ /**************************************************/ /****************** 關(guān)閉 ISP,IAP

7、功能 **************/ void ISP_IAP_disable(void) { ISP_CONTR = 0X00; ISP_CMD = 0X00; ISP_TRIG = 0x00; } /*******************字節(jié)讀***************************/ uchar Byte_read(uint byte_addr) { EA = 0; //關(guān)中斷

8、 ISP_CONTR = En_Wait_TIME; //開(kāi)啟ISP/IAP;并送等待時(shí)間 ISP_CMD = Read_COM; //送字節(jié)讀命令字 ISP_ADDRH = (uchar)(byte_addr 〉> 8); //送地址高字節(jié) ISP_ADDRL = (uchar)(byte_addr & 0X00FF); //送地址低字節(jié) ISP_TRIG = 0X46;

9、 //送觸發(fā)命令字 0X46、0XB9 ISP_TRIG = 0XB9; _nop_(); ISP_IAP_disable(); //關(guān)閉ISP/IAP功能 EA = 1; //開(kāi)中斷 return (ISP_DATA); } /********************字節(jié)編程***********************/ voi

10、d Byte_program(uint byte_addr, uchar isp_iap_data) { EA = 0; //關(guān)中斷 ISP_CONTR = En_Wait_TIME; //開(kāi)啟ISP/IAP;并送等待時(shí)間 ISP_CMD = Prog_COM; //送字節(jié)編程命令字 ISP_ADDRH = (uchar)(byte_addr >〉 8)

11、; //送地址高字節(jié) ISP_ADDRL = (uchar)(byte_addr & 0X00FF); //送地址低字節(jié) ISP_DATA = isp_iap_data; //送數(shù)據(jù)進(jìn)ISP_DATA ISP_TRIG = 0X46; //送觸發(fā)命令字 0X46、0XB9 ISP_TRIG = 0XB9; _nop_(); ISP_IAP_disable();

12、 //關(guān)閉ISP/IAP功能 EA = 1; //開(kāi)中斷 } /********************* 扇區(qū)擦除*********************/ void Sector_erase(uint sector_addr) { EA = 0; //關(guān)中斷 ISP_CONTR = En_Wait_TIME;

13、 //開(kāi)啟ISP/IAP;并送等待時(shí)間 ISP_CMD = Dele_COM; //送扇區(qū)擦除命令字 ISP_ADDRH = (uchar)(sector_addr >〉 8); //送地址高字節(jié) ISP_ADDRL = (uchar)(sector_addr & 0X00FF); //送地址低字節(jié) ISP_TRIG = 0X46; //送觸發(fā)命令字 0X46、0XB9

14、 ISP_TRIG = 0XB9; _nop_(); ISP_IAP_disable(); //關(guān)閉ISP/IAP功能 EA = 1; } /*********************寫(xiě)入函數(shù)**********************/ void EEPROM_write(uint addr, uchar in_data) { Sector_erase(addr); Byte_program(addr,in_data); } /***

15、******************EEPROM函數(shù)*******************/ /**************************************************/ /***************音樂(lè)播放相關(guān)子函數(shù)*******************/ /****************************************************/ void InitialSound(void) //初始化定時(shí)器 { BeepIO = 0; Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_

16、OSC)/256; // 計(jì)算TL1應(yīng)裝入的初值 (10ms的初裝值) Sound_Temp_TL1 = (65535—(1/1200)*SYSTEM_OSC)%256; // 計(jì)算TH1應(yīng)裝入的初值 TH1 = Sound_Temp_TH1; TL1 = Sound_Temp_TL1; TMOD |= 0x11; ET0 = 1; ET1 = 0; TR0 = 0; TR1 = 0; EA = 1; } void BeepTimer0(void) interrupt 1 //音符發(fā)生中斷函數(shù) { Bee

17、pIO = !BeepIO; TH0 = Sound_Temp_TH0; TL0 = Sound_Temp_TL0; } /*********************END****************************/ /****************************************************/ /*****************LCD操作子函數(shù)**********************/ /****************************************************/ void wr

18、comd(char comd) //寫(xiě)入命令 { cs = 0; _nop_(); rs = 0; _nop_(); e = 1; _nop_(); rw = 0; _nop_(); P0 = comd; _nop_(); rw = 0; _nop_(); _nop_(); rw = 1; _nop_(); _nop_(); _nop_(); _nop_(); } void wrdata(char data_wri) //往液晶中寫(xiě)入數(shù)據(jù) { cs = 0; _nop_(); rs = 1; _nop_()

19、; e = 1; _nop_(); rw = 0; _nop_(); P0 = data_wri; _nop_(); rw = 0; _nop_(); _nop_(); rw = 1; _nop_(); _nop_(); _nop_(); _nop_(); } void bmp(char data_write,int row_start,int row_end,uchar column_start,uchar column_end) //刷屏子函數(shù)

20、//初始化設(shè)置,對(duì)屏幕清零,默認(rèn)值,為0,0,8,2,132 { unsigned char i,j; int num_3; char num_0=0xb0; //uchar column_h,column_l; num_0+=row_start; for(i=row_start;i

21、(0xf0&column_start)>〉4); //設(shè)置列,先寫(xiě)入高4位再寫(xiě)入低四位 wrcomd(0x00|(0x0f&column_start)); for(j=column_start;j

22、_nop_(); } void write_word(char *p_word,int num,int pos_x,int pos_y,int width,int height) //寫(xiě)漢字/字符子函數(shù) //對(duì)應(yīng)參數(shù) 數(shù)據(jù)數(shù)組名,數(shù)組中位置,行位置,列位置,寬,高 { char page; // 頁(yè)號(hào) unsigned int i,j,k,p; p = (unsigned int)num*2*width; //p確定漢字字模數(shù)據(jù)初始位置 i = height%8; k = (i)?(height/8+1

23、):(height/8); page = 0xb0 + pos_y; for(i=0;i<2;i++) { wrcomd(page); wrcomd(0x10|(0xf0&pos_x)〉>4); wrcomd(0x00|(0x0f&pos_x)); for(j=0;j〈width;j++) { wrdata(p_word[j+p]); } p=p+width; page++; if(page-(unsigned char)0xb0>7||

24、page-(unsigned char)0xb0〈0) return; } } /**************************END***********************/ /****************************************************/ /****************** 鍵盤掃描函數(shù)*********************/ /****************************************************/ /****************判斷是否有鍵盤輸入

25、*********************/ bit CheckState(void) //鍵盤狀態(tài)判斷子函數(shù) { bit state=0; P1=0x0F; //鍵盤掃描 if(P1!=0x0F)state=1; //檢測(cè)是否有按鍵輸入 else state=0; return(state); } /******************獲取鍵盤輸入值*****************/ uchar GetKeys(void) //鍵盤值獲取子函數(shù) { uchar column,line;

26、 scan=0xFE; while((scan&0x10)!=0) { P1=scan; if((P1&0xF0)!=0xF0) //line 1 have key pressed { column=~(P1|0x0F); line=~(scan|0xF0); key=column+line; return(key); } else scan=(scan<<1)|0x01; } return(0); } /******************

27、應(yīng)用子函數(shù)*****************/ /*********************************************/ void csh(void) //初始化,清屏 { int i; res = 0; delay(time_def); delay(time_def); res = 1; delay(time_def); cs = 0; //片選一直有效 delay(time_def); delay(time_def); for(i=0;i〈12;i++) //初始命令

28、寫(xiě)入 { wrcomd(tab1[i]); delay(time_def); } bmp(0,0,8,0,132); } void start_print(void) //開(kāi)機(jī)顯示畫(huà)面子函數(shù) { int i,j; for(i=0;i<4;i++) { write_word(star_welcome,i,36+i*16,2,16,16); if((i+4)〈7) { write_word(star_welcome,i+

29、4,44+i*16,4,16,16); if((i+7)〈10) { write_word(star_welcome,i+7,36+i*16,6,16,16); } } } write_word(number,10,4+5*16,6,8,16); for(j=5;j>=0;j--) { write_word(number,j,12+5*16,6,8,16); delay(5000); } } void menu_first_symbol(int cho

30、ose) //菜單選擇符刷新子函數(shù),即“打鉤項(xiàng)” { bmp(0,0,8,4,18); write_word(menu_one,20,4,choose*2,16,16); } /*********************音樂(lè)播放顯示函數(shù)******************/ /*******************************************************/ void music_display_one(unsigned char s,unsigned int x) //顯示最底層子函數(shù) { int i; bmp

31、(0,2,8,18+x*16,34+x*16); for(i=3;i>0;i--) { if(s!=0) { write_word(display,1,20+16*x,2*i,16,16); s=s—1; } else { write_word(display,0,20+16*x,2*i,16,16); //delay(200); } } } void music_display_two(unsigned int p_x) //顯示次底層子函數(shù) {

32、 int sign; sign=mc_size[p_x][0]; if(sign) { if(!size[p_x]) { sign=0; mc_size[p_x][0]=sign; mc_size[p_x][1]=0; } else { music_display_one(size[p_x],p_x); mc_size[p_x][1]+=1; if(mc_size[p_x][1]>3) size[p_x]-=1; else

33、 size[p_x]+=1; } } /*************************************/ else { bmp(0,2,8,18+p_x*16,34+p_x*16); write_word(display,2,20+16*p_x,6,16,16); //delay(500); } /************************************/ } void music_display_three(unsigned int mc) //音符狀態(tài)置位函數(shù)

34、{ mc_size[mc—1][0]=1; mc_size[mc—1][1]=1; size[mc—1]=1; } void music_display_four(void) //顯示次頂層子函數(shù) { int i; for(i=0;i<7;i++) { music_display_two(i); } } void music_display_five() //顯示頂層子函數(shù) { int i; allsize=0; for(i=0;i<7;i++) allsize+=mc_size[i][0

35、]; music_display_four(); } /* void music_display(void) //顯示主函數(shù) { int i; for(i=0;i<10;i++) { music_display_three(music_code[i]); music_display_five(); } while(allsize) music_display_five(); }*/ void display_between_musicplay(unsigned int tone) //

36、播放音樂(lè)同時(shí)顯示音符顯示界面 { music_display_three(tone); music_display_five(); } /****************************************************/ /*********************播放子程序*********************/ void music_play_one(uint *NewFreTab,uchar Tone,uchar Length,uint LDiv0,uint LDiv1) //頻率表,

37、音符,音長(zhǎng),12000/Speed,((12000/Speed)/4)-((12000/Speed)/4)*SOUND_SPACE { unsigned char SL,SH,SM,SLen,XG,F(xiàn)D; uint i,Temp_T,CurrentFre,LDiv,LDiv2,LDiv3; SL=Tone%10; //計(jì)算出音符 SM=Tone/10%10; //計(jì)算出高低音 SH=Tone/100; //計(jì)算出是否升半 CurrentFre = NewFreTab[SignT

38、ab[SL—1]+SH]; //查出對(duì)應(yīng)音符的頻率 if(SL!=0) { if (SM==1) CurrentFre 〉>= 2; //低音 if (SM==3) CurrentFre 〈<= 2; //高音 Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);//計(jì)算計(jì)數(shù)器初值 Sound_Temp_TH0 = Temp_T/256; Sound_Temp_TL0 = Temp_T%256; TH0 = Sound_Temp_TH0;

39、 TL0 = Sound_Temp_TL0 + 12; //加12是對(duì)中斷延時(shí)的補(bǔ)償 } SLen=LengthTab[Length%10]; //算出是幾分音符 XG=Length/10%10; //算出音符類型(0普通1連音2頓音) FD=Length/100; LDiv=LDiv0/SLen; //算出連音音符演奏的長(zhǎng)度(多少個(gè)10ms) if (FD==1) LDiv=LDiv+LDiv/2; if(XG!=1) if(XG==0) //算出普通音符的演奏長(zhǎng)度 if (SLen〈=4)

40、 LDiv2=LDiv—LDiv1; else LDiv2=LDiv*SOUND_SPACE; else LDiv2=LDiv/2; //算出頓音的演奏長(zhǎng)度 else LDiv2=LDiv; if(SL==0) LDiv2=0; LDiv3=LDiv-LDiv2; //算出不發(fā)音的長(zhǎng)度 if (SL!=0) { TR0=1; for(i=LDiv2;i〉0;i-—) //發(fā)規(guī)定長(zhǎng)度的音 { while(TF1==0); TH1 = Soun

41、d_Temp_TH1; TL1 = Sound_Temp_TL1; TF1=0; } } display_between_musicplay(SL); //???要結(jié)合音長(zhǎng)來(lái)控制其顯示時(shí)間,弄清音長(zhǎng)問(wèn)題??? if(LDiv3!=0) { TR0=0; BeepIO=0; for(i=LDiv3;i>0;i-—) //音符間的間隔 { while(TF1==0); TH1 = Sound_Temp_TH1; TL1 = Sound_Temp_TL1; TF1=0; }

42、 } } /**************************************************************************/ /**************************************************************/ void music_play_two_1(uchar *Sound,uint *NewFreTab,uint SoundLength,uint LDiv0,uint LDiv1)

43、 //播放原存儲(chǔ)的音樂(lè) { uint xdata Point; uchar xdata Tone,Length,i; Point = 0; TR0 = 0; TR1 = 1; for(i=0;i〈4;i++) write_word(menu_one,i+1,4+(i+2)*16,0,16,16); while(Point 〈 SoundLength) { Tone = Sound[Point]; Length = Sound[Point+1]; /

44、/ 讀出第一個(gè)音符和它時(shí)時(shí)值 music_play_one(NewFreTab,Tone,Length,LDiv0,LDiv1); Point+=2; } BeepIO = 0; while(allsize) music_display_five(); } void music_play_two_2(uint *NewFreTab,uint SoundLength,uint LDiv0,uint LDiv1)

45、 //播放譜曲存儲(chǔ)的音樂(lè) { uint xdata Point; uchar xdata Tone,Length,i; Point = 0; TR0 = 0; TR1 = 1; for(i=0;i〈4;i++) write_word(menu_one,i+1,4+(i+2)*16,0,16,16); while(Point 〈 SoundLength) { Tone = Byte_read(start_add+Point); Length = Byte_read(start_add

46、+Point+1); // 讀出第一個(gè)音符和它時(shí)時(shí)值 music_play_one(NewFreTab,Tone,Length,LDiv0,LDiv1); Point+=2; } BeepIO = 0; while(allsize) //顯示末尾結(jié)束的狀態(tài) music_display_five(); } //************************************************************************** void Play_Two(unsigned char *S

47、ound,unsigned char Signature,unsigned char Octachord) { unsigned int xdata NewFreTab[12]; //新的頻率表 unsigned char xdata i,j; unsigned int xdata LDiv0,LDiv1,SoundLength; menu_state=1; for(i=0;i<12;i++) // 根據(jù)調(diào)號(hào)及升降八度來(lái)生成新的頻率表 { j = i + Signature;

48、 if(j > 11) { j = j-12; NewFreTab[i] = FreTab[j]*2; } else NewFreTab[i] = FreTab[j]; if(Octachord == 1) NewFreTab[i]>〉=2; else if(Octachord == 3) NewFreTab[i]<<=2; } LDiv0=12000/Speed; // 算出1分音符的長(zhǎng)度(幾個(gè)10ms) LDiv1= LDiv0/4; // LDiv為算出4分音符的長(zhǎng)度

49、 LDiv1= LDiv1—LDiv1*SOUND_SPACE; // LDiv最后為普通音最長(zhǎng)間隔標(biāo)準(zhǔn) SoundLength = 0; if(Sound!=Music_Memory) // { while(Sound[SoundLength] != 0x00) //計(jì)算歌曲長(zhǎng)度 SoundLength+=2; for(i=0;i〈4;i++) write_word(menu_one,i+1,4+(i+2)*16,0,16,16); whi

50、le(menu_state) // { music_play_two_1(Sound,NewFreTab,SoundLength,LDiv0,LDiv1); bmp(0,0,8,2,132); for(i=0;i<5;i++) write_word(restar,i,4+(i+2)*16,2,16,16); while(!CheckState()); if(GetKeys()==0x11) //確認(rèn)鍵返回,F鍵 menu_state=0; delay(1000); bmp

51、(0,0,8,2,132); } } else { while(Byte_read(start_add+SoundLength)!=0x00) //計(jì)算歌曲長(zhǎng)度 SoundLength+=2; for(i=0;i<4;i++) write_word(menu_one,i+1,4+(i+2)*16,0,16,16); while(menu_state) { music_play_two_2(NewFreTab,SoundLength,LDi

52、v0,LDiv1); bmp(0,0,8,2,132); for(i=0;i〈5;i++) write_word(restar,i,4+(i+2)*16,2,16,16); while(!CheckState()); if(GetKeys()==0x11) //確認(rèn)鍵返回,F(xiàn)鍵 menu_state=0; delay(1000); bmp(0,0,8,2,132); } } } /*************音符轉(zhuǎn)換函數(shù)***************************

53、*******/ void ChangeKey(uchar Gkey) //把輸入的音符轉(zhuǎn)換成相應(yīng)的數(shù)據(jù)形式,存儲(chǔ)到EEPROM中 { // int i; if(Gkey!=0) { delay(5000); if((music_counter%48)==0) bmp(0,2,8,0,132); switch(Gkey) { case 0x11: if(music_counter〉2) {bmp(0,0,8,0,132);mus

54、ic_state=1;}break; case 0x42: Byte_program((start_add+music_counter),0); write_word(number,0,4+((music_counter%48)%16)*8,2+((music_counter%48)/16)*2,8,16); ++music_counter;break; case 0x88: Byte_program((start_add+music_counter),1);

55、 write_word(number,1,4+((music_counter%48)%16)*8,2+((music_counter%48)/16)*2,8,16); ++music_counter;break; case 0x48: Byte_program((start_add+music_counter),2); write_word(number,2,4+((music_counter%48)%16)*8,2+((music_counter%48)/16)*2,8,16); ++mus

56、ic_counter;break; case 0x28: Byte_program((start_add+music_counter),3); write_word(number,3,4+((music_counter%48)%16)*8,2+((music_counter%48)/16)*2,8,16); ++music_counter;break; case 0x18: Byte_program((start_add+music_counter),4);

57、write_word(number,4,4+((music_counter%48)%16)*8,2+((music_counter%64)/16)*2,8,16); ++music_counter;break; case 0x84: Byte_program((start_add+music_counter),5); write_word(number,5,4+((music_counter%48)%16)*8,2+((music_counter%48)/16)*2,8,16); ++music_

58、counter;break; case 0x44: Byte_program((start_add+music_counter),6); write_word(number,6,4+((music_counter%48)%16)*8,2+((music_counter%48)/16)*2,8,16); ++music_counter;break; case 0x24: Byte_program((start_add+music_counter),7);

59、write_word(number,7,4+((music_counter%48)%16)*8,2+((music_counter%48)/16)*2,8,16); ++music_counter;break; default:break; } } } void Entry_Music(void) //輸入樂(lè)譜播放函數(shù) { uchar gkey,i; bmp(0,0,8,2,132); while(menu_state) { for(i=0;i〈4;i++) write_wor

60、d(Music_Mry,i,4+(i+2)*16,0,16,16); while(!music_state) { if(CheckState()) { if(music_state==0) ChangeKey(GetKeys()); } } bmp(0,2,8,2,132); InitialSound(); Play_Two(Music_Memory,Signature,Octa); bmp(0,2,8,2,132); for(i=0;i〈4;i+

61、+) write_word(restar,i+5,4+(i+2)*16,2,16,16); for(i=0;i〈5;i++) write_word(restar,i,4+(i+2)*16,4,16,16); while(!CheckState()); gkey=GetKeys(); delay(500); if(gkey==0x11) //確認(rèn)鍵返回,F(xiàn)鍵 menu_state=0; delay(1000); bmp(0,0,8,2,132); } } /****

62、********************************/ /***********菜單函數(shù)****************/ void menu_first(int choose) //主菜單 { int i,j; bmp(0,0,8,2,132); for(i=0;i<4;i++) { write_word(menu_one,i*10,20,i*2,8,16); write_word(menu_one,1+i*10,28,i*2,8,16); for(j=1;j<5;j++) write_word(me

63、nu_one,i*5+j,20+j*16,i*2,16,16); } menu_first_symbol(choose); } void menu_three1(void) { int i,gkey; while(!menu_state) { bmp(0,0,8,2,132); for(i=0;i<7;i++) { write_word(menu_thr,i,4+16*i,0,16,16); write_word(menu_thr,i+7,4+16*i,2,16,16); write_word(m

64、enu_thr,i+14,4+16*i,4,16,16); } delay(10000); while(!CheckState()); gkey=GetKeys(); bmp(0,0,8,2,132); InitialSound(); switch(gkey) { case 0x88:Play_Two(Music_1,Signature,Octa);break; case 0x48:Play_Two(Music_2,Signature,Octa);br

65、eak; case 0x28:Play_Two(Music_3,Signature,Octa);break; case 0x81:menu_state=1;break; //C鍵返回 default:break; } } } void menu_three2(void) { int i,gkey; bmp(0,0,8,2,132); for(i=0;i<4;i++) write_word(menu_one,i+11,4+(i+2)*16,0,16,16); while(!menu_st

66、ate) { while(!CheckState()) ; gkey=GetKeys(); InitialSound(); //定時(shí)器初始化 switch(gkey) { case 0x88:Music_take[0]=1; music_play_two_1(Music_take,FreTab1,2,(12000/Speed),((12000/Speed)/4)*(1-SOUND_SPACE)); delay(10);break; case 0x48:Music_take[0]=2; music_play_two_1(Music_take,FreTab1,2,(12000/Speed),((12000/Speed)/4)*(1—SOUND_SPACE)); delay(10);break; case 0x28:Music_take[0]=3; music_play_

展開(kāi)閱讀全文
溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!

五月丁香婷婷狠狠色,亚洲日韩欧美精品久久久不卡,欧美日韩国产黄片三级,手机在线观看成人国产亚洲