?? 可存儲電子琴.c
字號:
/*////////////////////////////////////////
可存
*////////////////////////////////////////////
#include <REGX52.H>
#include <led1602.h>
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
unsigned char temp,flagplay;
unsigned char key=0,clr=0;
unsigned char i,j,t=0;
unsigned char STH0,replay=0;
unsigned char STL0;
unsigned int code tab[]={0,0,65110,65058,
65030,64968,64898,64820,
64777,64684,64580,64524,
64400,64260,64103,64021};
idata unsigned int tabekey[32]; ////鍵記憶
idata unsigned int tabetimer[32]; ///時間記憶
idata unsigned int stoptimer[32];
//xdata unsigned long xxxx[10000];
unsigned int tcont,toper=0,keycont=0;
////////////////////////////////////////
void initTimer(void)
{
TMOD=0x10;
TH0=0xfc;
TL0=0x18;
}
/////////////////////////////////////////
void main(void)
{
init();
delay(200);
writestring(0,0,"guo xiao chun");
initTimer();
ET0=1;
ET1=1;
TR0=0;
EA=1;
while(1)
{
//////////////////////////////////////////////////////////
P2=0xff;
P2_4=0;
temp=P2;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P2;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P2;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
key=0;
writestring(5,1,"clr ");
break;
case 0x0d:
key=1;
break;
case 0x0b:
key=2;
writestring(1,1,"si");
break;
case 0x07:
key=3;
writestring(1,1,"la");
break;
}
temp=P2;
if(key!=1)
{
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR1=1;
tabetimer[keycont]=tcont; ///開始按鍵時間
tabekey[keycont]=tab[key];
}
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P2;
temp=temp & 0x0f;
}
TR1=0; //////////按鍵放開音樂停止
if(key==0)
{
TR1=0;
tcont=0;
flagplay=0;
writestring(5,1," ");
for(clr=0;clr<15;clr++)
{
tabetimer[clr]=0;
tabekey[clr]=0; ///清除所存的曲子
keycont=0;
}
}
////////////////////////////
if(flagplay==0&&key!=1&&key!=0)
{
stoptimer[keycont]=tcont; //結(jié)束按鍵時間
writestring(1,1," ");
keycont++;
}
if(key==1&&flagplay==1) ////////////開始播放
{
writestring(5,1,"play");
TR0=1;
//replay=~replay;
}
if(key==1&&flagplay!=1) ///////////////////停止記錄按鍵
{
TR0=0;
TR1=0;
t=0;
// keycont=0;
tcont=0;
flagplay=1; ///用定時器播放音樂
writestring(5,1,"stop");
}
}
}
/////////////////////////////////////////////////////////
P2=0xff;
P2_5=0;
temp=P2;
temp=temp &0x0f;
if (temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P2;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P2;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
key=4;
writestring(1,1,"so");
break;
case 0x0d:
key=5;
writestring(1,1,"fa");
break;
case 0x0b:
key=6;
writestring(1,1,"me");
break;
case 0x07:
key=7;
writestring(1,1,"re");
break;
}
temp=P2;
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
tabetimer[keycont]=tcont; ///開始按鍵時間
TR1=1;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P2;
temp=temp & 0x0f;
}
TR1=0; writestring(1,1," ");
tabekey[keycont]=tab[key];
stoptimer[keycont]=tcont; //結(jié)束按鍵時間
keycont++;
}
}
///////////////////////////////////////////////////////
P2=0xff;
P2_6=0;
temp=P2;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P2;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P2;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
key=8;
writestring(1,1,"do");
break;
case 0x0d:
key=9;
writestring(1,1,"si");
break;
case 0x0b:
key=10;
writestring(1,1,"la");
break;
case 0x07:
key=11;
writestring(1,1,"so");
break;
}
temp=P2;
P0=table[key];
tabekey[keycont]=tab[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR1=1;
tabetimer[keycont]=tcont; ///開始按鍵時間
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P2;
temp=temp & 0x0f;
}
TR1=0; writestring(1,1," ");
stoptimer[keycont]=tcont; //結(jié)束按鍵時間
keycont++;
}
}
P2=0xff;
P2_7=0;
temp=P2;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P2;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P2;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
key=12;
writestring(1,1,"fa");
break;
case 0x0d:
key=13;
writestring(1,1,"me");
break;
case 0x0b:
key=14;
writestring(1,1,"re");
break;
case 0x07:
key=15;
writestring(1,1,"do");
break;
}
temp=P2;
P1_0=~P1_0;
P0=table[key];
tabekey[keycont]=tab[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
tabetimer[keycont]=tcont; ///開始按鍵時間
TR1=1;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P2;
temp=temp & 0x0f;
}
TR1=0; writestring(1,1," ");
stoptimer[keycont]=tcont; //結(jié)束按鍵時間
keycont++;
}
}
}
}
//////////////////////////////////////////////////
void timer0(void) interrupt 1
{
TH0=0xfc;
TL0=0x18;
toper++;
//if(tcont==1000) P0=0x00;
if(toper==5)
{
toper=0; P3_7=~P3_7;// flagplay=~flagplay;
tcont++;
if(tcont==65535)
{
writestring(5,1,"full");
}
}
if(flagplay==1)
{
if(tcont==tabetimer[t]) //用來判斷播放時間是否到了前面的按鍵時間
//for(t=0;t<=keycont;t++)
{
STH0=tabekey[t]/256;
STL0=tabekey[t]%256;
TR1=1;
//delay(255);
///TR1=0;
}
if(tcont==stoptimer[t])
{
t++; TR1=0; ///第t個按鍵時間到
if(t==keycont)
{
t=0; ////////播放完畢等待下次按鍵播放
tcont=0; TR0=0;
}
}
}
}
/////////////////////////////////////////////////
void timer1(void) interrupt 3
{
TH1=STH0;
TL1=STL0;
P3_4=~P3_4;
TR0=1; ///當(dāng)有鍵按下的時候定時器一開始記按鍵時間
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -