用單片機制作的簡易DIY電子琴,矩陣鍵盤圖片見附件,代碼附下:
W1C[V0AD%D_P~$U@3JSHR0E.png (266.76 KB, 下載次數: 51)
下載附件
矩陣鍵盤
2018-3-5 09:45 上傳
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit K1=P3^2;
- sbit beep=P3^7;
- sbit beep2=P2^7;
- sbit p20=P2^0;//切換音樂
- sbit p21=P2^1;//播放模式/鍵盤模式
- sbit p22=P2^2;//(錄音)
- uchar i,ri;
- uchar song_Index=0,Tone_Index=0;
- uchar *song_Tone,*song_Time;
- const LED_tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,
- 0x82,0xF8,0x80,0x90,0xFF};
- uint code Tone_tab[]={
- 63773,63965,64137,64215,64360,64488,64603,
- 64654,64751,64836,63036,63148,63212,10,65535,64892,64952};
- uint recordi[]={0,1,2,3,4,5,6,7};
- unsigned keymode[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- //矩陣式鍵盤
- uchar buff;
- void delay1ms(void){
- uchar i;
- for(i=200;i>0;i--);
- }
- void key_scan(void){
- uchar hang,lie;
- P1=0xf0;
- if((P1&0xf0)!=0xf0) //行碼為0,列碼為1
- {delay1ms(); //消抖動
- if((P1&0xf0)!=0xf0){//有鍵按下,列碼為0
- hang=0xfe; //逐行掃描
- while((hang&0x08)!=0)//掃描完各行后跳出
- //while((hang&0x10)!=0)//4X4
- {
- P1=hang;
- if((P1&0xf0)!=0xf0)//本行有鍵按下
- {lie=(P1&0xf0)|0x0f;
- buff=((~hang)+(~lie));
- switch(buff){
- case 0x11:Tone_Index=0;break;
- case 0x21:Tone_Index=1;break;
- case 0x41:Tone_Index=2;break;
- case 0x81:Tone_Index=3;break;
- case 0x12:Tone_Index=4;break;
- case 0x22:Tone_Index=5;break;
- case 0x42:Tone_Index=6;break;
- case 0x82:Tone_Index=7;break;
- case 0x14:Tone_Index=8;break;
- case 0x24:Tone_Index=9;break;
- case 0x44:Tone_Index=15;break;
- case 0x84:Tone_Index=16;break;
- //case 0x18:Tone_Index=12;break;
- //case 0x28:Tone_Index=0;break;
- //case 0x48:Tone_Index=1;break;
- //case 0x88:Tone_Index=2;break;
- }
- }
- else hang=(hang<<1)|0x01;
- }
- }
- }
- }
- /*
- uint code Tone_tab[]={
- 62018,62401,62491,62895,63184,63441,63506,
- 63773,63965,64137,64215,64360,64488,64603,
- 64654,64751,64836,64876,64948,65012,65067,65535};
- uchar code song1_Tone[]={
- 11,9,11,14,12,14,12,11,11,7,8,9,8,7,8,
- 11,9,11,14,13,12,14,11,11,7,8,9,6,7,
- 12,14,14,13,12,13,14,12,13,14,12,12,11,10,7,8,
- 11,9,11,14,13,12,14,11,11,8,9,10,6,7,0xff};
- uchar code song1_Time[]={
- 4,2,2,8,4,2,2,8,4,2,2,4,2,2,12,
- 4,2,2,4,2,4,4,8,4,2,2,4,2,12,
- 4,4,8,4,2,2,8,2,2,2,2,2,2,2,2,16,
- 4,2,2,4,2,4,4,8,4,2,2,4,2,12,0xff};
- */
- uchar code song1_Tone[]={//兩只老虎
- 13,0,13,1,13,2,13,0,13,0,13,1,13,2,13,0,13,2,13,3,13,4,13,13,13,2,13,3,13,4,13,13,13,4,5,4,3,2,13,0,13,4,5,4,3,2,13,0,13,2,13,11,13,0,13,13,2,13,11,13,0,13,13,0xff};
- uchar code song1_Time[]={
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xff};
- uchar code song2_Tone[]={//小星星
- 13,0,0,4,4,5,5,4,13,3,3,2,2,1,1,0,13,4,4,3,3,2,2,1,13,4,4,3,3,2,2,1,0xff};
- uchar code song2_Time[]={
- 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0xff};
- uchar code song3_Tone[]={//歡樂頌
- 13,2,2,3,4,4,3,2,1,0,0,1,2,2,1,1,13,2,2,3,4,4,3,2,1,0,0,1,2,1,13,0,0,13,1,1,2,0,1,3,2,0,1,3,2,1,0,1,12,13,0xff};
- uchar code song3_Time[]={
- 3,3,3,3,3,3,3,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0xff};
- uchar code song4_Tone[]={//生日快樂
- 13,4,4,5,13,4,13,7,13,6,13,13,4,4,5,13,4,13,8,13,7,13,13,0xff};
- uchar code song4_Time[]={
- 2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xff};
- uchar code song5_Tone[]={//兩只老虎
- 13,0,13,1,13,2,13,0,13,0,13,1,13,2,13,0,13,2,13,3,13,4,13,13,13,2,13,3,13,4,13,13,13,4,5,4,3,2,13,0,13,4,5,4,3,2,13,0,13,2,13,11,13,0,13,13,2,13,11,13,0,13,13,0xff};
- uchar code song5_Time[]={
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xff};
- void delayms(uint ms)
- {uchar a;
- while(ms--)
- {
- for(a=2300;a>0;a--);
- }
- }
- void Timer0() interrupt 1 //中斷函數
- {
- TH0=Tone_tab[Tone_Index]/256;
- TL0=Tone_tab[Tone_Index]%256;
- beep=~beep;
- }
- void select(void)
- {
- if(song_Index==0)
- {
- song_Tone=song1_Tone;
- song_Time=song1_Time;
- }
- if(song_Index==1)
- {
- song_Tone=song2_Tone;
- song_Time=song2_Time;
- }
- if(song_Index==2)
- {
- song_Tone=song3_Tone;
- song_Time=song3_Time;
- }
- if(song_Index==3)
- {
- song_Tone=song4_Tone;
- song_Time=song4_Time;
- }
- if(song_Index==4)
- {
- song_Tone=song5_Tone;
- song_Time=song5_Time;
- }
- }
- void int_init(void){
- TMOD=0X01;
- ET0=1;
- EX0=1;
- IT0=1;
- EA=1;
- TR0=0;
- }
- void display(void){
- delay1ms();
- if(P1!=0xf0) TR0=1;
- else TR0=0;
- }
- void recordplay(void){
- uint i=0;
- while(i<8&&p22==0){
- Tone_Index=recordi[i];
- TR0=1;
- delayms(150);
- TR0=0;
- i++;
- }
- }
- void record(void){
- recordi[ri]=Tone_Index;
- delayms(10);
- ri++;
- }
- void main(void)
- {
- int_init();
- song_Tone=song1_Tone;
- song_Time=song1_Time;
- i=0;
- while(1)
- {
- if(p20==0){
- delayms(100);
- song_Index++;
- i=0;
- if(song_Index==5) song_Index=0;
- select();
- }
- if(p21==0){
- if(p22==0){
- if(p20==1&&P1!=0xf0) record();//錄音
- if(p20==0) {recordplay();ri=0;}//錄音播放
- }
- key_scan();
- display();
- }
- else{
- P0=LED_tab[song_Index];
- TR0=1;
- Tone_Index=song_Tone[i];
- if(Tone_Index==0xff){
- i=0;
- TR0=0;}
- TR0=1;
- delayms(song_Time[Tone_Index]*60);
- TR0=0;
- i++;
- }
- }
- }
復制代碼
|