⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 可存储电子琴.c

📁 电子琴设计 其中包含乐普编辑
💻 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;	//结束按键时间
				   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;	//结束按键时间
			   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;	//结束按键时间
			  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;	//结束按键时间
			  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;       ///当有键按下的时候定时器一开始记按键时间
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -