電子琴設(shè)計報告_第1頁
電子琴設(shè)計報告_第2頁
電子琴設(shè)計報告_第3頁
電子琴設(shè)計報告_第4頁
電子琴設(shè)計報告_第5頁
已閱讀5頁,還剩55頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

電子琴設(shè)計報告摘要功能:本作品是基于單片機控制系統(tǒng)的簡易電子琴,有各種友好的菜單界面和顯示界面,可實現(xiàn)通過按鍵控制,發(fā)出1、2、3、4、5、6、7、i……等二十一個音符。該電子琴亦能夠自動演奏三首樂曲,且其演奏方式(點播、順序播放和隨機播放)可以通過按鍵選擇(其中點播模式還可以點播之前的錄音,可以播放掉電之前保存的錄音)。操作者還可以在電子琴演奏時對電子琴進行音調(diào)(按鍵控制)、音量(電位器)的調(diào)節(jié),并能以發(fā)光二極管顯示播放音量的大小。同時在設(shè)置模式下能調(diào)節(jié)音階和拍長,音階和拍長在掉電后仍然保存。另外,它可以對手動編奏的樂曲進行錄音,在按下放音鍵時能演奏出來,同時貯存在eeprom里面,掉電不丟失。還有一鍵關(guān)機功能,一鍵按下關(guān)閉整個電路板的電源。方案的設(shè)計和論證電源控制控制模塊方案(1):采用繼電器來控制電源的關(guān)斷,其優(yōu)點是電路設(shè)計比較簡單,但是由于繼電器的體積偏大,如果以后要做出易于攜帶的產(chǎn)品的話,不是很方便;方案(2):運用晶體管的開關(guān)功能設(shè)計電源開關(guān)控制電路,通過向單片機輸入外部中斷來使得單片機自動控制電源的關(guān)斷。主控模塊這模塊主要實現(xiàn)的功能有:=1\*GB3①接收由鍵盤輸入的信號并輸出相應(yīng)的操作信號;=2\*GB3②控制菜單操作顯示器基于以上標(biāo)示,可考慮采用51系列單片機、AVR單片機,或者ARM等都可以實現(xiàn),但是從性價比考慮,AVR系列優(yōu)勢比較明顯,因此選用之作為主控芯片。至于菜單顯示部分可以采用以下兩種方案:(1)1602液晶:它能顯示16X2個數(shù)字或英文字符,信息量較大,用串行通訊可減少I/O口的占用量。1602的成本中等,是值得考慮的選擇。(2)12864是帶中文字庫的液晶顯示屏,可以顯示4X16個漢字,甚至可以顯示圖案,顯示功能較為強大。使用12864可以提供大量信息,但是其價格比較1602液晶要貴幾倍??紤]到成本因素,決定采用1602液晶來實現(xiàn)該顯示功能。掉電保護電路:(1)使用外部存儲器不過得加入外部電路,既加大成本又加大功耗。(2)使用AVR單片機自帶的EEPROM不用增加器件,操作簡單。綜上所述,我們采用第(2)種掉電保護方案。音量調(diào)節(jié)模塊方案(1):采用數(shù)字電位器對音量進行調(diào)節(jié),這樣做的好處是便于數(shù)字控制,可以選擇的音量大小不多。方案(2):采用可變電阻進行音量調(diào)節(jié),這樣可實現(xiàn)音量連續(xù)可調(diào)。另外,在如何顯示音量大小的問題上,我們采用的是以數(shù)字芯片TA6777來驅(qū)動發(fā)光二極管,當(dāng)音量比較大時,發(fā)光二極管亮的個數(shù)比較多。功放模塊方案(1):采用LM386芯片對對輸出的音樂信號進行放大,其優(yōu)點是電路簡單,穩(wěn)定性強;方案(2):采用TDA2822芯片放大音樂信號,但是TDA2822在單電源供電下,工作不是很穩(wěn)定??紤]到穩(wěn)定性因素,選用方案(1)。鍵盤輸入模塊方案(1):采用矩陣鍵盤(N×M),每個按鍵占據(jù)行列的一個交點,需要的I/O口數(shù)目是N+M,容許的最大鍵數(shù)是N×M。方案(2):新型鍵盤,用N個I/O口以及一個中斷口,可以實現(xiàn)N×N個按鍵,比較節(jié)省I/O資源,故采用之。系統(tǒng)框圖基于AtmelMega16L電子琴系統(tǒng)的硬件總體結(jié)構(gòu)圖如圖1所示,主要包括中央處理器MCU、單鍵開關(guān)機電路,1602顯示模塊、功放模塊、鍵盤模塊、電平燈頻譜顯示模塊等。各模塊的設(shè)計與論證中央處理器MCU中央處理器選用的是ATMega16l,ATmega16是基于增強的AVRRISC結(jié)構(gòu)的低功耗8位CMOS微控制器。具體的電路連接圖如圖2所示。PB0~PB7用于連接鍵盤輸入(INT2用于鍵盤的中斷輸入);PD0用于連接單鍵開關(guān)電路的續(xù)電;PD2(INT0)用于連接單鍵開關(guān)電路按鍵的檢測;PD5用于音律PWM的輸出;PC0~PC7用于連接LCD1602顯示輸出,其中PC0~PC2用于控制1602的選通、讀寫控制等的操作,PC3~PC7連接74HC595,實現(xiàn)串行數(shù)據(jù)轉(zhuǎn)并行數(shù)據(jù)。單片機輸出頻率CTC不同的信號來產(chǎn)生各種音符,將歌曲各個音符的轉(zhuǎn)化成相應(yīng)的數(shù)字信號,存放在單片機程序寄存器中,當(dāng)播放音樂時,程序從該寄存器里讀取數(shù)據(jù),然后以CTC信號的模式傳給功放電路,實現(xiàn)放音樂的功能。當(dāng)要向單片機錄入音樂時,通過鍵盤上的按鍵,輸入不同的音符,接下來單片機可以記錄下音符以及其持續(xù)的時間,然后存入程序寄存器中,當(dāng)錄音結(jié)束,按下“錄入確認(rèn)鍵”,按下來就可以從菜單里選擇播放剛才錄入的音樂。單鍵開關(guān)機模塊該電路的工作原理是:接通K1(總電源開關(guān),外電源接到P0)后,按動輕觸開關(guān)S2,三極管Q29012導(dǎo)通,VCC輸出高電平,單片機接通電源工作后,第一時間給P_OUT一個高電平,三極管Q19013導(dǎo)通,這樣,即使按鍵S2松開了,Q2也依然導(dǎo)通,電路依然接通。當(dāng)按鍵S2再次按下時,單片機檢測到P_IN為低電平,這是單片機可以延時一段時間后,將P_OUT置為低電平,Q1截止,Q2也同時截止,電路斷開。3、電平燈頻譜顯示模塊為了顯示的效果更炫,本硬件電路特意增加了一個電平燈頻譜顯示模塊,該模塊采用的是一塊TP7666芯片,該芯片在老式收音機上非常常見,現(xiàn)在已經(jīng)很難買到。該芯片具有雙路5點電平顯示,而且外圍電路原件很少。4、6×6鍵盤模塊該電路的工作原理是:待機時,PORT1~PORT6輸出高電平;當(dāng)某個鍵按下時,PORT7由高電平變?yōu)榈碗娖?,由此產(chǎn)生一個中斷;MCU啟動按鍵掃描,如按下的是K30時,置PORT1=H,掃描PORT2~6的輸入結(jié)果為LLLL,沒有掃描到所需的結(jié)果;繼續(xù)置PORT2=H,掃描PORT1、PORT3~6的輸入結(jié)果為HLLL,按鍵S30就被唯一確定了。5、LCD1602液晶顯示模塊該模塊的連接比較簡單,但是若直接使用并行數(shù)據(jù)傳送的話要用到11個IO口,這里為了節(jié)省IO口資源,使用也一片74HC595串行數(shù)據(jù)轉(zhuǎn)并行數(shù)據(jù)芯片,該芯片與單片機連接最多只需要5個IO口,這樣連接一片1602只需要8個IO口,節(jié)省了3個IO口。具體的硬件連接圖如下圖5所示。電位器RW1可用于調(diào)節(jié)背光的亮度,RW2可用于調(diào)節(jié)液晶的對比度。6、小功率功放模塊這里的功放模塊采用了傳統(tǒng)的LM386芯片,采用該芯片是因為LM386具有自身功耗低,電壓增益可調(diào)整,電源電壓范圍大,外接元件少和總諧波失真小等優(yōu)點,尤其是在增益為20DB時使用的外圍原件極少。具體的單路連接如下圖6所示。軟件程序流程圖測量與分析1(do)2(re)3(mi)4(fa)5(sol)6(la)7(si)降C131Hz147Hz165Hz174.5Hz196Hz220Hz音符音符音階中央C261.5Hz293.5Hz329.5Hz349Hz392Hz440Hz494Hz升C523Hz587Hz659Hz698Hz784Hz880Hz988Hz輸出音調(diào)對應(yīng)的頻率表按C調(diào)來說1=261.5HZ2=293.5HZ3=329.5HZ4=349HZ5=392HZ6=440HZ7=494HZ低7個音調(diào)后1=131Hz2=147Hz3=165Hz4=174.5Hz5=196Hz6=220Hz7=247Hz高7個音調(diào)后1=523Hz2=587Hz3=659Hz4=698Hz5=784Hz6=880Hz7=988Hz總結(jié) 經(jīng)過一翻辛苦努力,終于搞定了電子琴了。這個過程中團隊合作讓我們收獲很多。三個同學(xué)一起做,不可能每個同學(xué)對每項內(nèi)容都了解得很透徹,需要知識互補。另外,遇到困難的時候不能指望讓一個同學(xué)獨自解決,團隊合作不崇尚單打獨斗。源程序主文件go.c://主文件,包含主函數(shù)#include<iom16v.h>#include<macros.h>#include<eeprom.h>#defineucharunsignedchar#defineuintunsignedint#definevucharvolatileunsignedchar#definevuintvolatileunsignedint#definerecord_max160//變量定義vucharkey_int=0,mode_fr=0,counter_en_fr=0,pop_en_fr=0;vucharrow=0,scrollbar=1,volume,temp,delayMs,tonality,tone;vucharinttemp;ucharmusicLength,recordLength;uintbell_standard_time;vuintcounter_ms=0;vucharcounter_record;vucharsong_4[record_max][2];//包含頭文件//子函數(shù)清單#include"function_list.h"http://數(shù)據(jù)#include"data.h"http://延時#include"delay.h"http://鍵盤中斷#include"int2.h"http://液晶#include"ts1620.h"http://發(fā)聲部分#include"bell.h"http://功能函數(shù)1#include"fun.h"http://功能函數(shù)2#include"fun_need_check.h"voidmain(){ power_init();//一鍵關(guān)機初始化 while(1) { ts1620_init();//液晶初始化 welcome();//歡迎界面 all_init();//各類變量初始化 int2_init();//鍵盤中斷初始化 mode_fr=0;//極其的關(guān)鍵變量,記錄狀態(tài) while(key_int!=keyreset) { if(mode_fr==0)menu();//主菜單 if(mode_fr==1)manul();//模式1,手動彈奏初始化 if(mode_fr==1)manul_check();//模式1,手動彈奏 if(mode_fr==20)autoplay();//模式20,自動彈奏主菜單 if(mode_fr==210)demand_menu();//模式210,點播菜單 if(mode_fr==211)demand_play(key_int);//模式211,點播演奏初始化 if(mode_fr==211)demand_play_check(key_int,211);//模式211,點播演奏 if(mode_fr==212)demand_play(keyfun4);//模式212,點播演奏初始化(錄音部分) if(mode_fr==212)demand_play_check(keyfun4,212);//模式212,點播演奏(錄音部分) if(mode_fr==22)order_play();//模式22,順序彈奏 if(mode_fr==23)outorder_play();//模式23,亂序彈奏 if(mode_fr==31)record();//模式31,錄音初始化 if(mode_fr==31)record_check();//模式31,錄音 if(mode_fr==32)replay();//模式32,放音 if(mode_fr==50)settings();//模式50,設(shè)置菜單 if(mode_fr==51)settings1();//模式51,設(shè)置拍長 if(mode_fr==52)settings2();//模式52,設(shè)置音階 } }}以下是function_list.h//各子程序清單voiddelay_nop(void);voiddelay(uint/*_delay_ms*/);voidint2_init(void);ucharkey_line(uchar);ucharkey_search(uchar);ucharkey_find(void);voidkey_int2(void);voidwrite_com(uchar);voidwrite_data(uchar);voidclear(void);voidcursor_return(void);voidentry_mode_set(uchar,uchar);voiddisplay_on_off(uchar,uchar,uchar);voidshift(uchar,uchar);voidset_function(uchar,uchar,uchar);voidset_address(uchar,uchar);voidts1620_init(void);voidscreen_same(uchar,uchar,uchar);voidscreen_one(uchar,uchar);voidscreen_sleep(void);voidshow_menu(constuchar*,constuchar*);voidshow_vol(void);voidshow_screen(constuchar*,uchar,constuchar*,uchar);voidshow_saving(void);voidmenu_move(uchar);voidwelcome(void);voidall_init(void);voidmenu(void);voidmanul(void);voidmanul_check(void);voiddelay_check(uint);voidtonality_c(uchar);voidbell_init(void);voidautoplay(void);voiddemand_menu(void);voiddemand_play(uchar);voiddemand_play_check(uchar,uchar);voidbell_music(uchar,uchar);voidrecord(void);voidrecord_check(void);voidreplay(void);voidsettings(void);voidsettings1(void);voidsettings2(void);voidorder_play(void);voidoutorder_play(void);ucharout_order(void);voidpower_init(void);voidpower_off(void);以下是delay.h#define_nopdelay_nop()voiddelay_nop()//微妙級別延時函數(shù){asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");}voiddelay(uint_delay_ms)//毫秒級別延時函數(shù){uint_delay_i,_delay_j;for(_delay_i=0;_delay_i<_delay_ms;_delay_i++)for(_delay_j=0;_delay_j<1711;_delay_j++);}以下是data.h//此頭文件包含各類數(shù)據(jù),data(存放在程序存儲區(qū))#pragmainterrupt_handlerkey_int2:iv_INT2#pragmainterrupt_handlerpower_off:iv_INT0#defineINTPORT10#defineINTPORT21#defineINT_22#defineINTPORT33#defineINTPORT44#defineINTPORT55#defineINTPORT66#defineton10x16#defineton20x26#defineton30x36#defineton40x46#defineton50x56#defineton60x66#defineton70x13#defineton80x15#defineton90x25#defineton100x35#defineton110x45#defineton120x55#defineton130x65#defineton140x23#defineton150x14#defineton160x24#defineton170x34#defineton180x44#defineton190x54#defineton200x64#defineton210x33#definekeysleep0x61#definekeyreturn0x51#definekeymenu0x52#definekeyreset0x62#definekeyvolOn0x11#definekeyvolDn0x12#definekeymenuUp0x41#definekeymenuDn0x42#definekeyfun10x21#definekeyfun20x31#definekeyfun30x22#definekeyfun40x32#definekeyreplay0x63#definekeypause0x53#definekeyres0x43#pragmadata:codeconstucharwelcome_0[]="Welcome...";constucharpower_0[12]="GOODBYE";constucharpower_1[15]="poweroff:3s";constucharwelcome_1[]="madByBinFenLinYe";constucharmanul_0[14]="ManulModeton";constucharmanul_1[9]="Tonality:";constucharrecord_0[14]="Recordington";constucharreplay_0[14]="Replayington";constucharsaving[9]="Saving...";constucharIc_0[][15]={{"WhichmodedoU"}, {"wanttochoose?"}, {"1.Manualplay"}, {"2.Autoplay"}, {"3.Recordmode"}, {"4.Setting"}};constucharIc_20[][15]={{"1.Playmusicon"}, {"demand"}, {"2.Playinorder"}, {"3.Playoutof"}, {"order"}};constucharIc_210[][16]={{"1.Welcometo"}, {"Beijing"}, {"2.Legend"}, {"3.Myth"}, {"4.PlaybyMyself"}};constucharIc_50[][16]={{"1.Beatlength"}, {"2.Toneselection"}};constucharIc_51[][15]={{"1.1200ms/Beat"}, {"2.1100ms/Beat"}, {"3.1000ms/Beat"}, {"4.900ms/Beat"}, {"5.800ms/Beat"}, {"6.700ms/Beat"}, {"7.300ms/Beat"}};constucharIc_52[][15]={{"1.Ctone"}, {"2.Dtone"}, {"3.Etone"}, {"4.Ftone"}, {"5.Gtone"}};constucharbjhyn_title[]="WelcomeToBjt";constuchardemand_title[]="OnPlay";constucharlegend_title[]="Legendt";constucharmyth_title[]="Mytht";constucharplayBm_title[]="PlayByMet";constucharsongs[][2]={{10,0x84}, {16,0x84},{10,0x84},{9,0x84},{10,0x84},{9,0x84}, {10,0x88},{10,0x86},{9,0x82},{6,0x84},{8,0x84}, {10,0x84},{9,0x8c},{9,0x84},{8,0x84},{6,0x84}, {8,0x84},{9,0x84},{10,0x84},{12,0x84},{9,0x84}, {10,0x84},{13,0x84},{12,0x84},{5,0x84},{9,0x88}, {8,0x88},{9,0x84},{8,0x84},{6,0x84},{8,0x84}, {9,0x84},{10,0x84},{12,0x84},{9,0x84},{10,0x84}, {13,0x84},{12,0x84},{10,0x90},{9,0x84},{10,0x84}, {9,0x84},{8,0x84},{12,0x86},{13,0x82},{10,0x88}, {6,0x84},{10,0x84},{9,0x84},{9,0x84},{8,0x8c}, {0,0x84},{10,0x84},{12,0x84},{15,0x84},{12,0x84}, {13,0x8c},{12,0x84},{13,4},{12,0x84},{10,0x84}, {10,0x84},{12,0x84},{12,0x8c},{10,0x84},{12,0x84}, {13,0x84},{15,0x84},{16,0x84},{15,0x84},{12,0x84}, {10,0x84},{9,0x84},{12,8},{10,0x84},{10,0x90},//76 {10,0x84},{12,0x84},{15,0x84},{12,0x84},{13,0x8c}, {15,0x84},{16,0x86},{15,0x82},{12,0x84},{10,0x84}, {12,0x84},{15,0x84},{13,0x8c},{10,0x84},{9,0x84}, {10,0x84},{13,0x84},{17,0x84},{16,0x8c},{16,0x84}, {15,0xa0},{10,0x84},{12,0x84},{15,0x84},{12,0x84}, {13,0x8c},{15,0x84},{16,0x86},{15,0x82},{12,0x84}, {10,0x84},{12,0x84},{15,0x84},{13,0x8c},{10,0x84}, {9,0x84},{10,0x84},{13,0x84},{17,0x84},{17,0x84}, {17,0xb0},{15,0x84},{0,0x84},{15,0xc0},{0x8f,0x84},//121個音符,北京歡迎你 {8,0x82},{8,0x82},{8,0x84},{8,0x82},{10,0x82}, {9,0x86},{9,0x82},{9,0x82},{8,0x82},{8,0x84}, {8,0x82},{9,0x84},{9,0x82},{9,0x84},{9,0x82}, {8,0x82},{6,0x8f},{7,0x82},{7,0x82},{7,0x84}, {8,0x84},{9,0x84},{7,0x84},{6,0x82},{5,0x86}, {3,0x92},{10,0x82},{9,0x82},{10,0x82},{10,0x81}, {9,0x84},{9,0x84},{9,0x82},{8,0x82},{8,0x88}, {9,0x84},{6,0x84},{6,0x82},{6,0x82},{9,0x84}, {8,0x8f},{7,0x82},{7,0x82},{7,0x84},{8,0x82}, {9,0x82},{9,0x84},{9,0x84},{6,0x82},{5,0x86},//50 {3,0x92},{12,0x88},{9,0x84},{10,0x84},{12,0x88}, {9,0x86},{8,0x82},{6,0x92},{9,0x88},{0,0x82}, {6,0x84},{10,0x82},{9,0x88},{8,0x84},{8,0x84}, {5,0x92},{12,0x88},{9,0x84},{10,0x84},{12,0x88}, {9,0x84},{8,0x84},{6,0x92},{9,0x88},{6,0x84}, {10,0x84},{9,0x88},{8,0x84},{9,0x84},{9,0x92}, {8,0x82},{8,0x82},{8,0x84},{5,0x82},{8,0x82}, {8,0x84},{12,0x84},{11,0x84},{10,0x84},{9,0x88}, {8,0x8f},{0,0x82},{8,0x82},{10,0x82},{12,0x82}, {13,0x86},{12,0x82},{13,0x84},{12,0x84},{0,0x82},//100 {13,0x84},{12,0x82},{0,0x82},{10,0x82},{10,0x82}, {12,0x82},{10,0x92},{0,0x84},{8,0x82},{8,0x82}, {8,0x84},{5,0x82},{8,0x82},{8,0x84},{13,0x84}, {11,0x84},{10,0x84},{9,0x86},{8,0x82},{8,0x8f}, {0,0x82},{8,0x82},{10,0x82},{12,0x82},{13,0x86}, {12,0x82},{13,0x84},{12,0x84},{0,0x82},{13,0x84}, {12,0x82},{0,0x82},{10,0x82},{12,0x84},{12,0x92}, {0,0x84},{8,0x82},{8,0x82},{8,0x84},{8,0x82}, {10,0x82},{9,0x86},{9,0x82},{9,0x82},{8,0x82}, {8,0x84},{8,0x82},{9,0x84},{9,0x82},{9,0x84},//150 {9,0x82},{8,0x82},{6,0x8f},//153個音符,傳奇 {10,0x88},{9,0x84},{8,0x84},{9,0x88},{8,0x84},{7,0x84},{8,0x88},{7,0x84}, {6,0x84},{5,0x8f},{6,0x88},{8,0x88},{7,0x88},{5,0x88},{3,0x8f},{0,0x88}, {8,0x84},{9,0x84},{10,0x88},{9,0x84},{8,0x84},{9,0x88},{8,0x84},{7,0x84}, {8,0x88},{7,0x84},{6,0x84},{5,0x8f},{6,0x88},{10,0x88},{7,0x88},{8,0x84}, {9,0x84},{8,0x92},{0,0x88},{6,0x8b},{8,0x84},{7,0x88},{8,0x84},{9,0x84}, {10,0x8b},{12,0x84},{10,0x8f},{6,0x8b},{8,0x84},{7,0x88},{8,0x84},{9,0x84}, {8,0x92},{8,0x84},{9,0x84},{10,0x88},{9,0x84},{8,0x84},{9,0x88},{8,0x84}, {7,0x84},{8,0x88},{7,0x84},{6,0x84},{5,0x8f},{6,0x88},{8,0x88},{7,0x88}, {8,0x84},{9,0x84},{10,0x8f},{9,0x88},{8,0x84},{9,0x84},{10,0x88},{9,0x84}, {8,0x84},{9,0x88},{8,0x84},{7,0x84},{8,0x88},{7,0x84},{6,0x84},{5,0x88}, {7,0x84},{5,0x84},{6,0x88},{10,0x88},{7,0x88},{8,0x84},{9,0x84},{8,0x92}, {10,0x84},{12,0x84},{13,0x8b},{13,0x84},{12,0x84},{9,0x88},{12,0x88},{10,0x88}, {8,0x88},{6,0x88},{10,0x84},{9,0x84},{8,0x88},{10,0x84},{9,0x84},{9,0x88}, {10,0x84},{6,0x84},{6,0x8f},{10,0x84},{12,0x84},{13,0x8b},{13,0x84},{12,0x84}, {9,0x84},{9,0x84},{12,0x84},{10,0x88},{8,0x88},{6,0x88},{10,0x84},{9,0x84}, {8,0x88},{10,0x84},{9,0x84},{9,0x88},{12,0x84},{10,0x84},{10,0x8f},{10,0x84}, {12,0x84},{13,0x8b},{13,0x84},{12,0x84},{9,0x84},{9,0x84},{12,0x84},{10,0x88}, {8,0x88},{6,0x88},{10,0x84},{9,0x84},{8,0x88},{10,0x84},{9,0x84},{9,0x88}, {10,0x84},{6,0x84},{6,0x8f},{10,0x84},{12,0x84},{13,0x8b},{13,0x84},{12,0x84}, {9,0x84},{9,0x84},{12,0x84},{10,0x88},{8,0x88},{6,0x88},{6,0x84},{7,0x84}, {8,0x88},{9,0x84},{10,0x84},{9,0x88},{10,0x88},{6,0x92}//166個音符 }; #pragmadata:data以下是int2.h//鍵盤中斷voidint2_init(){//中斷初始化 DDRB=0x7b; PORTB=0x7b; MCUCSR&=~BIT(ISC2); SREG|=BIT(7); GIFR|=BIT(INTF2); GICR|=BIT(INT2);}ucharkey_line(ucharINTPORT){//檢測鍵盤按鍵的行值 ucharINT2TEMP=0; _nop; PORTB=0; DDRB=0; _nop; DDRB=(1<<INTPORT); PORTB=(1<<INTPORT); _nop; if((PINB&(1<<INT_2))==0) { switch(INTPORT) { case0:INT2TEMP=0x10;break; case1:INT2TEMP=0x20;break; case3:INT2TEMP=0x30;break; case4:INT2TEMP=0x40;break; case5:INT2TEMP=0x50;break; case6:INT2TEMP=0x60;break; } } returnINT2TEMP;}ucharkey_search(ucharport_sure){//檢測鍵盤按鍵的列值 ucharkey_temp,key_sure=0; port_sure-=(port_sure<3); PORTB=0; DDRB=(1<<port_sure); PORTB=(1<<port_sure); for(key_temp=1;key_temp<port_sure+(port_sure<3);key_temp++) { if(key_sure==0) { if(PINB&(1<<key_temp-(key_temp<3)))key_sure=key_temp; } } for(key_temp=port_sure+(port_sure<3)+1;key_temp<=6;key_temp++) { if(key_sure==0) { if(PINB&(1<<key_temp-(key_temp<3)))key_sure=key_temp; } } if(key_sure==0)key_sure=port_sure+(port_sure<3); returnkey_sure;}ucharkey_find(){//獲取按鍵值 ucharint2Temp=0; delay(10); if((PINB&BIT(2))==0) { if(int2Temp==0)int2Temp=key_line(INTPORT1); if(int2Temp==0)int2Temp=key_line(INTPORT2); if(int2Temp==0)int2Temp=key_line(INTPORT3); if(int2Temp==0)int2Temp=key_line(INTPORT4); if(int2Temp==0)int2Temp=key_line(INTPORT5); if(int2Temp==0)int2Temp=key_line(INTPORT6); if(int2Temp)int2Temp+=key_search(int2Temp/0x10); } returnint2Temp;}voidkey_int2(){//中斷函數(shù) GICR&=~BIT(INT2); key_int=key_find(); //mode_fr:0.menu1.manul20.autoMenu210.demandMenu //211.demandPlay31.record32.replay //4.volumeSet DDRB=0; PORTB=0x7b; DDRB=0x7b; pop_en_fr=0; if(mode_fr==0)//0.menu { pop_en_fr=1; switch(key_int) { casekeyfun1:mode_fr=1;break; casekeyfun2:mode_fr=20;break; casekeyfun3:mode_fr=31;break; casekeyfun4:mode_fr=50;break; //casekeysleep:GIFR|=BIT(INTF2);GICR|=BIT(INT2);MCUCR|=BIT(6);asm("SLEEP");break; casekeymenuUp:break; casekeymenuDn:break; casekeyreset:break; default:key_int=0; } } if(pop_en_fr==0)//1.manul { if(mode_fr==1) { pop_en_fr=1; switch(key_int) { //casekeysleep:GIFR|=BIT(INTF2);GICR|=BIT(INT2);MCUCR|=BIT(6);asm("SLEEP");break; caseton1: { screen_one(0x2a,''); write_data('1');delay(2); write_data('');delay(2); write_data(''); tonality_c(key_int); _nop; while(((PINB&BIT(2))==0))_nop; break; } caseton2: { screen_one(0x2a,''); write_data('2');delay(2); write_data('');delay(2); write_data(''); tonality_c(key_int); _nop; while(((PINB&BIT(2))==0))_nop; break; } caseton3: { screen_one(0x2a,''); write_data('3');delay(2); write_data('');delay(2); write_data(''); tonality_c(key_int); _nop; while(((PINB&BIT(2))==0))_nop; break; } caseton4: { screen_one(0x2a,''); write_data('4');delay(2); write_data('');delay(2); write_data(''); tonality_c(key_int); _nop; while(((PINB&BIT(2))==0))_nop; break; } caseton5: { screen_one(0x2a,''); write_data('5');delay(2); write_data('');delay(2); write_data(''); tonality_c(key_int); _nop; while(((PINB&BIT(2))==0))_nop; break; } caseton6: { screen_one(0x2a,''); write_data('6');delay(2); write_data('');delay(2); write_data(''); tonality_c(key_int); _nop; while(((PINB&BIT(2))==0))_nop; break; } caseton7: { screen_one(0x2a,''); write_data('7');delay(2); write_data('');delay(2); write_data(''); tonality_c(key_int); _nop; while(((PINB&BIT(2))==0))_nop; break; } caseton8: { screen_one(0x2a,''); write_data('');delay(2); write_data('1');delay(2); write_data(''); tonality_c(key_int); _nop; while(((PINB&BIT(2))==0))_nop; break; } caseton9: { screen_one(0x2a,''); write_data('');delay(2); write_data('2');delay(2); write_data(''); tonality_c(key_int); _nop; while(((PINB&BIT(2))==0))_nop; break; } caseton10: { screen_one(0x2a,''); write_data('');delay(2); write_data('3');delay(2); write_data(''); tonality_c(key_int); _nop; while(((PINB&BIT(2))==0))_nop; break; } caseton11: { screen_one(0x2a,''); write_data('');delay(2); write_data('4');delay(2); write_data(''); tonality_c(key_int); _nop; while(((PINB&BIT(2))==0))_nop; break; } caseton12: { screen_one(0x2a,''); write_data('');delay(2); write_data('5');delay(2); write_data(''); tonality_c(key_int); _nop; while(((PINB&BIT(2))==0))_nop; break; } caseton13: { screen_one(0x2a,''); write_data('');delay(2); write_data('6');delay(2); write_data(''); tonality_c(key_int); _nop; while(((PINB&BIT(2))==0))_nop; break; } caseton14: { screen_one(0x2a,''); write_data('');delay(2); write_data('7');delay(2); write_data(''); tonality_c(key_int); _nop; while(((PINB&BIT(2))==0))_nop; break; } caseton15: { screen_one(0x2a,''); write_data('');delay(2); write_data('');delay(2); write_data('1'); tonality_c(key_int); _nop; while(((PINB&BIT(2))==0))_nop; break; } caseton16: { screen_one(0x2a,''); write_data('');delay(2); write_data('');delay(2); write_data('2'); tonality_c(key_int); _nop; while(((PINB&BIT(2))==0))_nop; break; } caseton17: { screen_one(0x2a,''); write_data('');delay(2); write_data('');delay(2); write_data('3'); tonality_c(key_int); _nop; while(((PINB&BIT(2))==0))_nop; break; } caseton18: { screen_one(0x2a,''); write_data('');delay(2); write_data('');delay(2); write_data('4'); tonality_c(key_int); _nop; while(((PINB&BIT(2))==0))_nop; break; } caseton19: { screen_one(0x2a,''); write_data('');delay(2); write_data('');delay(2); write_data('5'); tonality_c(key_int); _nop; while(((PINB&BIT(2))==0))_nop; break; } caseton20: { screen_one(0x2a,''); write_data('');delay(2); write_data('');delay(2); write_data('6'); tonality_c(key_int); _nop; while(((PINB&BIT(2))==0))_nop; break; } caseton21: { screen_one(0x2a,''); write_data('');delay(2); write_data('');delay(2); write_data('7'); tonality_c(key_int); _nop; while(((PINB&BIT(2))==0))_nop; break; } casekeyvolOn: { tone++;if(tone>4)tone=4; screen_one(0x0f,0x43+tone); key_int=0;break; } casekeyvolDn: { tone--;if(tone>16)tone=0; screen_one(0x0f,0x43+tone); key_int=0;break; } casekeymenu:mode_fr=0;break; casekeyreturn:mode_fr=0;break; casekeyreset:mode_fr=9;break; default: key_int=0; } } } if(pop_en_fr==0)//20.autoMenu { if(mode_fr==20) { pop_en_fr++; switch(key_int) { casekeyreturn:mode_fr=0;break; casekeymenu:mode_fr=0;break; casekeyfun1:mode_fr=210;break; casekeyfun2:mode_fr=22;break; casekeyfun3:mode_fr=23;break; //casekeysleep:GIFR|=BIT(INTF2);GICR|=BIT(INT2);MCUCR|=BIT(6);asm("SLEEP");break; casekeymenuUp:break; casekeymenuDn:break; casekeyreset:mode_fr=9;break; default:key_int=0; } } } if(pop_en_fr==0)//210.demandMenu { if(mode_fr==210) { pop_en_fr++; switch(key_int) { casekeyreturn:mode_fr=20;break; casekeymenu:mode_fr=0;break; casekeyfun1:mode_fr=211;break; casekeyfun2:mode_fr=211;break; casekeyfun3:mode_fr=211;break; casekeyfun4:mode_fr=212;break; //casekeysleep:GIFR|=BIT(INTF2);GICR|=BIT(INT2);MCUCR|=BIT(6);asm("SLEEP");break; casekeymenuUp:break; casekeymenuDn:break; casekeyreset:mode_fr=9;break; default:key_int=0; } } } if(pop_en_fr==0)//211.demandPlay { if(mode_fr==211) { pop_en_fr++; switch(key_int) { //casekeypause:screen_sleep();GIFR|=BIT(INTF2);GICR|=BIT(INT2);MCUCR|=BIT(6);asm("SLEEP");break; //casekeysleep:GIFR|=BIT(INTF2);GICR|=BIT(INT2);MCUCR|=BIT(6);asm("SLEEP");break; //casekeyvolOn:pro1=vol_c;break; //casekeyvolDn:pro1=vol_c;break; casekeyvolOn: { tone++;if(tone>4)tone=4; screen_one(0x0f,0x43+tone); key_int=0;break; } casekeyvolDn: { tone--;if(tone>16)tone=0; screen_one(0x0f,0x43+tone); key_int=0;break; } casekeyfun3:break; casekeyfun4:break; casekeyreturn:mode_fr=210;break; casekeymenu:mode_fr=0;break; casekeyreset:mode_fr=9;break; //case:;break; default:key_int=0; } } } if(pop_en_fr==0)//212.demandPlay { if(mode_fr==212) { pop_en_fr++; switch(key_int) { //casekeypause:screen_sleep();GIFR|=BIT(INTF2);GICR|=BIT(INT2);MCUCR|=BIT(6);asm("SLEEP");break; //casekeysleep:GIFR|=BIT(INTF2);GICR|=BIT(INT2);MCUCR|=BIT(6);asm("SLEEP");break; //casekeyvolOn:pro1=vol_c;break; //casekeyvolDn:pro1=vol_c;break; casekeyvolOn: { tone++;if(tone>4)tone=4; screen_one(0x0f,0x43+tone); key_int=0;break; } casekeyvolDn: { tone--;if(tone>16)tone=0; screen_one(0x0f,0x43+tone); key_int=0;break; } casekeyfun3:break; casekeyfun4:break; casekeyreturn:mode_fr=210;break; casekeymenu:mode_fr=0;break; casekeyreset:mode_fr=9;break; //case:;break; default:key_int=0; } } } if(pop_en_fr==0)//22.orderPlay { if(mode_fr==22) { pop_en_fr++; switch(key_int) { //casekeypause:screen_sleep();GIFR|=BIT(INTF2);GICR|=BIT(INT2);MCUCR|=BIT(6);asm("SLEEP");break; //casekeysleep:GIFR|=BIT(INTF2);GICR|=BIT(INT2);MCUCR|=BIT(6);asm("SLEEP");break; //casekeyvolOn:pro1=vol_c;break; //casekeyvolDn:pro1=vol_c;break; casekeyvolOn: { tone++;if(tone>4)tone=4; screen_one(0x0f,0x43+tone); key_int=0;break; } casekeyvolDn: { tone--;if(tone>16)tone=0; screen_one(0x0f,0x43+tone); key_int=0;break; } casekeymenuUp:break; casekeymenuDn:break; casekeyfun3:break; casekeyfun4:break; casekeyreturn:mode_fr=20;break; casekeymenu:mode_fr=0;break; casekeyreset:mode_fr=9;break; //case:;break; default:key_int=0; } } } if(pop_en_fr==0)//23.outorderPlay { if(mode_fr==23) { pop_en_fr++; switch(key_int) { //casekeypause:screen_sleep();GIFR|=BIT(INTF2);GICR|=BIT(INT2);MCUCR|=BIT(6);asm("SLEEP");break; //casekeysleep:GIFR|=BIT(INTF2);GICR|=BIT(INT2);MCUCR|=BIT(6);asm("SLEEP");break; //casekeyvolOn:pro1=vol_c;break; //casekeyvolDn:pro1=vol_c;break; casekeyvolOn: { tone++;if(tone>4)tone=4; screen_one(0x0f,0x43+tone); key_int=0;break; } casekeyvolDn: { tone--;if(tone>16)tone=0; screen_one(0x0f,0x43+tone); key_int=0;break; } casekeymenuUp:break; casekeymenuDn:break; casekeyfun3:break; casekeyfun4:break; casekeyreturn:mode_fr=20;break; casekeymenu:mode_fr=0;break; casekeyreset:mode_fr=9;break; //case:;break; default:key_int=0; } } } if(pop_en_fr==0)//31.record { if(mode_fr==31) { if(counter_record>record_max-2) { mode_fr=32; return; } counter_ms=0; switch(key_int) { //casekeyvolOn:pro1=vol_c;break; //casekeyvolDn:pro1=vol_c;break; //casekeypause:GIFR|=BIT(INTF2);GICR|=BIT(INT2);MCUCR|=BIT(6);asm("SLEEP");break; casekeyvolOn: { tone++;if(tone>4)tone=4; screen_one(0x0f,0x43+tone); key_int=0;break; } casekeyvolDn: { tone--;if(tone>16)tone=0; screen_one(0x0f,0x43+tone); key_int=0;break; } casekeyreturn:mode_fr=0;break; casekeyreplay:mode_fr=32;break; casekeyreset:mode_fr=9;break; casekeymenu:mode_fr=0;break; caseton1: { screen_one(0x21,'1'); write_data('');delay(2); write_data(''); tonality_c(key_int); _nop; while(((PINB&BIT(2))==0)) { delay(1); counter_ms++; } break;} caseton2: { screen_one(0x21,'2'); write_data('');delay(2); write_data(''); tonality_c(key_int); _nop; while(((PINB&BIT(2))==0)) { delay(1); counter_ms++; } break;} caseton3: { screen_one(0x21,'3'); write_data('');delay(2); write_data(''); tonality_c(key_int); _nop; while(((PINB&BIT(2))==0)) { delay(1); counter_ms++; } break;} caseton4: { screen_one(0x21,'4'); write_data('');delay(2); write_data(''); tonality_c(key_int); _nop; while(((PINB&BIT(2))==0)) { delay(1); counter_ms++; } break;} caseton5: { screen_one(0x21,'5'); write_data('');delay(2); write_data(''); tonality_c(key_int); _nop; while(((PINB&BIT(2))==0)) { delay(1); counter_ms++; } break;} caseton6: { screen_one(0x21,'6'); write_data('');delay(2); write_data(''); tonality_c(key_int); _nop; while(((PINB&BIT(2))==0)) { delay(1); counter_ms++; } break;} caseton7: { screen_one(0x21,'7'); write_data('');delay(2); write_data(''); tonality_c(key_int); _nop; while(((PINB&BIT(2))==0)) { delay(1); counter_ms++; } break;} caseton8: { screen_one(0x21,''); write_data('1');delay(2); write_data(''); tonality_c(key_int); _nop; while(((PINB&BIT(2))==0)) { delay(1); counter_ms++; } break;} caseton9: { screen_one(0x21

溫馨提示

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

評論

0/150

提交評論