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

📄 music-teaching.c

📁 音乐教学板
💻 C
📖 第 1 页 / 共 2 页
字号:
			}
		}
		
		DELAY();
		DELAY();
		DELAY();
		DELAY();
		}
		else
		{
	//-------------------------------------------------------------------------//
    p=dispo1;
	RST=0;  				     	//液晶模块复位 
	DELAY();
	RST=1;
	DISP_white();				 	//全白屏显示
	 DELAY();
	 DELAY();
 	 DELAY();
	 DELAY();
		
		//显示一行字符(disp数组)自左向右128列(16个字符)
		CSA=1;					     	
		BF();	 
		x=1;  //设定显示行起始位置(0-7)
		z=0;  //显示的列位置(0-15)
		
		for(i=z;i<sizeof(disp);i++)  	//for循环,循环次数由disp的元素决定
		{
			if(i<8) 
			{						    //如果是前8个字符则选择左半屏
				CSA=1;				    
				BF();
				WR_CODE=0x3f; 			//写入"开显示"命令
				BF();
				WR_CODE=0xc0;			//写入z地址()
				DISP_x(x,i,p[i]);
			}
			else 					    //第9个字符从右半屏开始显示
			{
				CSA=0;
				BF();
				WR_CODE=0x3f;
				BF();
				WR_CODE=0xc0;
				DISP_x(x,i-8,p[i]);
			}
		}
		
		DELAY();
		DELAY();
		DELAY();
		DELAY();
		//--------------------------------------------//
    p=dispo2;

		
		//显示一行字符(disp数组)自左向右128列(16个字符)
		CSA=1;					     	
		BF();	 
		x=3;  //设定显示行起始位置(0-7)
		z=0;  //显示的列位置(0-15)
		
		for(i=z;i<sizeof(disp);i++)  	//for循环,循环次数由disp的元素决定
		{
			if(i<8) 
			{						    //如果是前8个字符则选择左半屏
				CSA=1;				    
				BF();
				WR_CODE=0x3f; 			//写入"开显示"命令
				BF();
				WR_CODE=0xc0;			//写入z地址()
				DISP_x(x,i,p[i]);
			}
			else 					    //第9个字符从右半屏开始显示
			{
				CSA=0;
				BF();
				WR_CODE=0x3f;
				BF();
				WR_CODE=0xc0;
				DISP_x(x,i-8,p[i]);
			}
		}
		
		DELAY();
		DELAY();
		DELAY();
		DELAY();
		//---------------------------------------------//
	p=disps3;

		
		//显示一行字符(disp数组)自左向右128列(16个字符)
		CSA=1;					     	
		BF();	 
		x=5;  //设定显示行起始位置(0-7)
		z=0;  //显示的列位置(0-15)
		
		for(i=z;i<sizeof(disp);i++)  	//for循环,循环次数由disp的元素决定
		{
			if(i<8) 
			{						    //如果是前8个字符则选择左半屏
				CSA=1;				    
				BF();
				WR_CODE=0x3f; 			//写入"开显示"命令
				BF();
				WR_CODE=0xc0;			//写入z地址()
				DISP_x(x,i,p[i]);
			}
			else 					    //第9个字符从右半屏开始显示
			{
				CSA=0;
				BF();
				WR_CODE=0x3f;
				BF();
				WR_CODE=0xc0;
				DISP_x(x,i-8,p[i]);
			}
		}
		
		DELAY();
		DELAY();
		DELAY();
		DELAY();
		//------------------------------------------------------------//
	p=disps4;

		
		//显示一行字符(disp数组)自左向右128列(16个字符)
		CSA=1;					     	
		BF();	 
		x=7;  //设定显示行起始位置(0-7)
		z=0;  //显示的列位置(0-15)
		
		for(i=z;i<sizeof(disp);i++)  	//for循环,循环次数由disp的元素决定
		{
			if(i<8) 
			{						    //如果是前8个字符则选择左半屏
				CSA=1;				    
				BF();
				WR_CODE=0x3f; 			//写入"开显示"命令
				BF();
				WR_CODE=0xc0;			//写入z地址()
				DISP_x(x,i,p[i]);
			}
			else 					    //第9个字符从右半屏开始显示
			{
				CSA=0;
				BF();
				WR_CODE=0x3f;
				BF();
				WR_CODE=0xc0;
				DISP_x(x,i-8,p[i]);
			}
		}
		
		DELAY();
		DELAY();
		DELAY();
		DELAY();
		}
}



void DISP_x(unsigned char x, unsigned char y, unsigned  char ctxt)
{    
	//一行字符显示函数:将disp[]数组提供的ASCII码的字符串显示在所需要的行上(0-7行)
	// 形参说明:x:页数据(0-7)、y:列位置(0-15)、ctxt:字符表首地址
	unsigned char i,z;  		
	BF();
	x=x+0xb8;         			//将行位置转换为页地址(0-7行转换为B8H-BFH)
	WR_CODE=x; 		  		//写入页地址
	BF();
	if(y>7)                    //如果列位置超过7则转换为右半屏并转换为0-7
		y=y-8;                     			//将列位置大于7的数据转换为0-7
	z=y*8+0x40;       						//列位置转换为列地址(一个字符要占8列位置) 
	WR_CODE=z;		  						//写入列地址
	BF();							
	if(ctxt<='9' && ctxt>='0') 			//将DISP[]数组中的ASCII码转换为可查表的数据
	{						   				//如果是0-9的ASCII码
		for(i=0;i<8;i++)	
			WR_DATA=pcharAddr[ctxt-48][i];		//将此数据-30H得数字本身(30H-39H转换为0-9)
	}
	else if(ctxt<='z' && ctxt>='a') 		//如果是大写的字母A-Z,则-41H,再加10
	{
		for(i=0;i<8;i++)	
			WR_DATA=pcharAddr[ctxt-97+10][i];
	}
	else if(ctxt==' ')
	{
		for(i=0;i<8;i++)	
			WR_DATA=pcharAddr[36][i];
	}
	  	      
}

void DISP_shu(unsigned char x, unsigned char z, unsigned  char ctxt) //显示3位BCD数据
{                           //x显示的行位置,z列位置,ctxt要显示的char型数据
	if(z<8)					//	如果列位置小于8则从左半屏开始
		CSA=1;
	else CSA=0;				//如果列位置大于等于8则从右半屏开始显示
	DISP_x(x,z,ctxt/100+48);	//将一个char型数据数据的百位进行拆分并转换为ASCII码	
	
	z=z+1;					//列位置加一
	BF();
	WR_CODE=0x3f;
	BF();
	WR_CODE=0xc0;
	if(z<8)
		CSA=1;
	else CSA=0;
	DISP_x(x,z,(ctxt-ctxt/100*100)/10+48); //将char型数据的十位进行拆分并转换为ASCII码
	
	z=z+1;  
	BF();
	WR_CODE=0x3f;
	BF();
	WR_CODE=0xc0;
	if(z<8)
		CSA=1;
	else CSA=0;
	DISP_x(x,z,ctxt%10+48);   //将一个char型数据数据的个位进行拆分并转换为ASCII码
}
void DISP_white()				//全白屏显示函数
{   unsigned char x=0xb8,y=0x40,d;
	d=0x00;
	CSA=1;
	BF();
	WR_CODE=0x3f;
	BF();
	WR_CODE=0xc0;
    DISP_0(x,y,d);

	CSA=0;
	BF();
	WR_CODE=0x3f;
	BF();
	DISP_0(x,y,d);
}

void    BF()
{     
	while((RD_CODE&0x80)==0x08);
}

void sound_music(unsigned char *c)
{
unsigned char i,j;
TMOD=0x11;
TR1=1;
TL0=0xc6;
TH0=0xff;
for(i=0;i<64;i++)
		{ 
		 TL1=h[c[i]];
		 TH1=l[c[i]];
		 //i++;
         for(j=0;j<5;j++)
	     {
		  do{
		     while(TF1!=1);
		     TF1=0;
		     TL1=h[c[i-1]];
		     TH1=l[c[i-1]];
			 if(c[i-1]==0)
				   P3_3=P3_3;
			 else
		           P3_3=~P3_3;
			 TR0=1;
		     }
		  while(TF0!=1);
		  TF0=0;
		  //TL0=0xc6;
          //TH0=0xff;
		  //TR0=0;
		  }		 
		 }
TR0=0;
TR1=0;
}

void DISP_0(unsigned char x, unsigned char y, unsigned char d)	//半屏显示函数
{ unsigned char i;                                              //x:起始页地址
  do                                                            //y:起始列地址
  {                                                             //d:要写入的数据
     BF();
	 WR_CODE=x;
	 BF();
	 WR_CODE=y;
	 for(i=0;i<64;i++)                       //for循环64次(某行64列的操作)
	  {  BF();
		 WR_DATA=d;                          //写入数据
	   }
	 x++;                                    //换页
   }while(x!=0xc0);
}


void sound_note(unsigned char u,unsigned char v)
{unsigned char m;
  for(m=0x00;m<=0x50;m++)
  {TL1=u;
  TH1=v;
  while(TF1!=1);
  TF1=0;
  TL1=u;
  TH1=v;
  P3_3=~P3_3;
  DELAY();
  DELAY();
  P3_3=1;}
  }
//#################################################################################
void STA(void) 						//启动信号子函数
{	 SDA=1;
     SCL=1;
     DELAY5US 	 
	 SDA=0;
	 DELAY5US 
     SCL=0;
}
//#################################################################################
void STOP(void) 					//停止信号子函数
{   SDA=0;
    SCL=1; 	
	DELAY5US 
	SDA=1;
	DELAY5US  	
}
//#################################################################################
void MACK(void) 					//应答信号子函数
{    SDA=0;
     SCL=1;
	 DELAY5US 	
	 SCL=0;
	 SDA=1;
}
//#################################################################################
void NMACK(void) 					//非应答信号子函数

{    SDA=1;
     SCL=1;
	 DELAY5US   	 
	 SCL=0;
	 SDA=0;
}
//#################################################################################
void CACK(void)         			//应答检测子程序
{   
     SDA=1;
     SCL=1;
	 DELAY5US    	 
	 F0=0;
	 if(SDA==1)
	 F0=1;
	 SCL=0;
}
//#################################################################################
//                             发送一字节子数据程序     WRBYT
//#################################################################################
void WRBYT(unsigned char  *p)
{    unsigned char  i=8,temp;
     temp=*p;
	 while(i--)
	 {   if((temp&0x80)==0x80)
	         {  SDA=1; 
			    SCL=1; 			
				DELAY5US 				
				SCL=0; 			 
			 }
			 else
			 {  SDA=0;
			    SCL=1; 				
				DELAY5US 				
				SCL=0;
			 }
			 temp=temp<<1;
	 }
}
//#################################################################################
//                            接收一字节子数据程序     RDBYT
//#################################################################################
void RDBYT(unsigned char  *p)
{    unsigned char i=8,temp=0;
     while(i--)
	 {    SDA=1;
	      SCL=1;
		  DELAY5US   		  
		  temp=temp<<1;
		  if(SDA==1)
		  	temp=temp|0x01;
		  else
		    temp=temp&0xfe;
          SCL=0;
	 }
     *p=temp;
}
//#################################################################################
//                           发送N个字节子数据程序     WRNBYT
//#################################################################################
void WRNBYT(unsigned char  *R3,unsigned char  *R2,unsigned char  *R0,unsigned char  n)
{                
 loop:    STA();
	      WRBYT(R3);
	      CACK();
	      if(F0)
	      goto loop;
		  WRBYT(R2);
		  CACK();
		  if(F0)
		  goto loop;
		  while(n--)
		  {  WRBYT(R0);
		     CACK();
			 if(F0)
			  goto loop;
			  R0++;
		  } 
          STOP();
}
//#################################################################################
//                            接收N个字节子数据程序     RDNBYT
//#################################################################################
//【子函数入口参数说明】:
//R3是外部器件地址写,R4是外部器件地址读,R2是从器件内部子地址,R0是目标数据块首地址,//n是要读的字节数
void RDNBYT(unsigned char  *R3,unsigned char  *R4,unsigned char  *R2,unsigned char  *R0,unsigned char  n)
{   
     loop1:  STA();
			 WRBYT(R3);
			 CACK();
			 if(F0)
			 goto loop1;
			 WRBYT(R2);
			 CACK();
			 if(F0)
			 goto loop1;
			 STA();
			 WRBYT(R4);
			 CACK();
			 if(F0)
			 goto loop1;
			 while(n--)
			 {    RDBYT(R0);
			    if(n>0)
  				    {
					  MACK();
				      R0++;
			        }
				 else  NMACK();
				 } 			  
			 STOP();
}
//#################################################################################

⌨️ 快捷键说明

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