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

📄 music-teaching.c

📁 音乐教学板
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "reg51.h"
#include "intrins.h"
#include "ABSACC.h"
#define  DELAY5US _nop_();
#define  WR_DATA XBYTE[0x2001]
#define  RD_DATA XBYTE[0x2003]
#define  WR_CODE XBYTE[0x2000]
#define  RD_CODE XBYTE[0x2002]
#define  WSLA1 0x70
#define  RSLA1 0x71
sbit     RST=P1^6;
sbit     CSA=P1^5;
sbit 	 SDA=P1^0;
sbit 	 SCL=P1^1;
sbit     BUTTON=P1^2;
sbit     P1_7=P1^7;
sbit     P3_3=P3^3;
void DO();
void RA();
void MI();
void FA();
void SO();
void LA();
void XI();
void HDO();
void PAUSE();
void START(void);
void OVER(void);
void MACK(void);
void NMACK(void);
void CACK(void);
void WRBYT(unsigned char *p);
void RDBYT(unsigned char *p);
void WRNBYT(unsigned char *R3,unsigned char *R2,unsigned char *R0,unsigned char n);
void RDNBYT(unsigned char *R3,unsigned char *R4,unsigned char *R2,unsigned char *R0,unsigned char n);
void DISP_x(unsigned char x, unsigned char y, unsigned char ctxt);
void DISP_shu(unsigned char x, unsigned char y, unsigned  char ctxt);
void DISP_white();
void DISP_0(unsigned char x, unsigned char y, unsigned char d);
void LCD_symbol(unsigned char temp);
void sound_note(unsigned char u,unsigned char v);
void LCD_lyric(unsigned char temp);
void sound_music(unsigned char *c);
void DELAY();
void BF();
unsigned char code a[8]={0xec,0xfc,0x00,0xb6,0xee,0x1c,0x9c,0x8e};
unsigned char showout[8];
unsigned char temp[1]={0};
unsigned char tem=0;
unsigned char i,j;

const unsigned char code TAB_1[8]={0x00,0x00,0x42,0x7F,0x40,0x00,0x00,0x00};	//1的字符码
const unsigned char code TAB_2[8]={0x00,0x42,0x61,0x51,0x49,0x46,0x00,0x00};	//2的字符码
const unsigned char code TAB_3[8]={0x00,0x21,0x41,0x45,0x4B,0x31,0x00,0x00};	//3的字符码
const unsigned char code TAB_4[8]={0x00,0x18,0x14,0x12,0x7F,0x10,0x00,0x00};	//4的字符码
const unsigned char code TAB_5[8]={0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00};	//5的字符码
const unsigned char code TAB_6[8]={0x00,0x3C,0x4A,0x49,0x49,0x30,0x00,0x00};	//6的字符码
const unsigned char code TAB_7[8]={0x00,0x00,0x01,0x79,0x05,0x03,0x00,0x00};	//7的字符码
const unsigned char code TAB_8[8]={0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00};	//8的字符码
const unsigned char code TAB_9[8]={0x00,0x06,0x49,0x49,0x29,0x1E,0x00,0x00};	//9的字符码
const unsigned char code TAB_a[8]={0x00,0x00,0x38,0x44,0x44,0x38,0x40,0x00};	//A的字符码
const unsigned char code TAB_b[8]={0x00,0x41,0x7F,0x49,0x49,0x36,0x00,0x00};	//B的字符码
const unsigned char code TAB_c[8]={0x00,0x3E,0x41,0x41,0x41,0x22,0x00,0x00};	//C的字符码
const unsigned char code TAB_d[8]={0x00,0x41,0x7F,0x41,0x41,0x3E,0x00,0x00};	//D的字符码
const unsigned char code TAB_e[8]={0x00,0x00,0x38,0x54,0x54,0x58,0x00,0x00};	//E的字符码
const unsigned char code TAB_f[8]={0x00,0x00,0x10,0xfc,0x12,0x14,0x00,0x00};	//F的字符码
const unsigned char code TAB_g[8]={0x00,0x00,0x4c,0x92,0x92,0x7c,0x00,0x00};	//G的字符码
const unsigned char code TAB_h[8]={0x00,0x00,0x7e,0x08,0x08,0x70,0x00,0x00};	//H的字符码
const unsigned char code TAB_i[8]={0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x00};	//I的字符码
const unsigned char code TAB_j[8]={0x00,0x20,0x40,0x41,0x3F,0x01,0x00,0x00};	//J的字符码
const unsigned char code TAB_k[8]={0x00,0x7F,0x08,0x14,0x22,0x41,0x00,0x00};	//K的字符码
const unsigned char code TAB_l[8]={0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00};	//L的字符码
const unsigned char code TAB_m[8]={0x00,0x00,0x78,0x04,0x78,0x04,0x78,0x00};	//M的字符码
const unsigned char code TAB_n[8]={0x00,0x00,0x78,0x04,0x04,0x78,0x00,0x00};	//N的字符码
const unsigned char code TAB_o[8]={0x00,0x00,0x38,0x44,0x44,0x38,0x00,0x00};	//O的字符码
const unsigned char code TAB_p[8]={0x00,0x7F,0x09,0x09,0x09,0x06,0x00,0x00};	//P的字符码
const unsigned char code TAB_q[8]={0x00,0x3E,0x41,0x51,0x21,0x5E,0x00,0x00};	//Q的字符码
const unsigned char code TAB_r[8]={0x00,0x00,0x78,0x08,0x04,0x08,0x00,0x00};	//R的字符码
const unsigned char code TAB_s[8]={0x00,0x00,0x18,0x54,0x54,0x20,0x00,0x00};	//S的字符码
const unsigned char code TAB_t[8]={0x00,0x00,0x08,0x7c,0x48,0x28,0x00,0x00};	//T的字符码
const unsigned char code TAB_u[8]={0x00,0x3F,0x40,0x40,0x40,0x3F,0x00,0x00};	//U的字符码
const unsigned char code TAB_v[8]={0x00,0x1F,0x20,0x40,0x20,0x1F,0x00,0x00};	//V的字符码
const unsigned char code TAB_w[8]={0x00,0x00,0x18,0x20,0x18,0x20,0x18,0x00};	//W的字符码
const unsigned char code TAB_x[8]={0x00,0x63,0x14,0x08,0x14,0x63,0x00,0x00};	//X的字符码
const unsigned char code TAB_y[8]={0x00,0x00,0x4e,0x50,0x50,0x3e,0x00,0x00};	//Y的字符码
const unsigned char code TAB_z[8]={0x00,0x61,0x51,0x49,0x45,0x43,0x00,0x00};	//Z的字符码
const unsigned char code TAB_SP[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};	//空格的字符码
const unsigned char code h[8]={0x21,0xe0,0x8b,0xd7,0x67,0xe8,0x5b,0x8e};
const unsigned char code l[8]={0xf9,0xf9,0xfa,0xfa,0xfb,0xfb,0xfc,0xfc};
const unsigned char code s[]={1,1,1,1,5,1,1,1,7,1,2,1,3,3,3,3,1,3,3,3,2,3,4,3,5,1,5,1};	
const unsigned char code o[]={1,2,3,2,1,5,6,5,6,6,1,2,3,2,1,5,6,7,1,1,2,3,2,1,5,6,5,6,6,1,2,3,2,1,5,6,7,1};
const unsigned char* code    pcharAddr[36]={ TAB_1,TAB_2,TAB_3,TAB_4,TAB_5, TAB_6,
TAB_7,TAB_8,TAB_9,TAB_a,TAB_b,TAB_c,TAB_d,TAB_e,TAB_f,TAB_g,TAB_h,TAB_i,TAB_j,TAB_k,TAB_l,TAB_m,TAB_n,TAB_o,TAB_p,TAB_q,TAB_r,TAB_s,TAB_t,TAB_u,TAB_v,TAB_w,TAB_x,TAB_y,TAB_z,TAB_SP};
const unsigned char code disps1[]={'s','i','n','g','s','i','n','g','t','o','g','e','t','h','e','r'};
const unsigned char code disps2[]={' ','m','e','r','r','i','l','y',' ','m','e','r','r','i','l','y'};
const unsigned char code disps3[]={' ',' ','s','i','n','g',' ',' ','s','i','n','g',' ',' ',' ',' '};
const unsigned char code disps4[]={' ','s','i','n','g',' ','s','i','n','g',' ','s','i','n','g',' '};
	
const unsigned char code dispo1[]={' ','s','h','a','l','l',' ','w','e',' ','g','o',' ','a',' ',' '};
const unsigned char code dispo2[]={' ','f','l','y','i','n','g',' ',' ','f','l','y','i','n','g',' '};
const unsigned char code dispo3[]={' ','s','h','a','l','l',' ','w','e',' ','g','o',' ','a',' ',' '};
const unsigned char code dispo4[]={' ','f','l','y',' ','t','o',' ','t','h','e',' ','m','o','o','n'};
const unsigned char code classon[8]={0x00,0x01,0x02,0x03,0x03,0x04,0x05,0x06};
const unsigned char code classoff[8]={0x07,0x07,0x01,0x03,0x03,0x04,0x05,0x06};

void main()
{
 unsigned char n,i,WSLA=WSLA1,in_add=0x10,*inside,*woutside,*target;
 if(BUTTON)
{for(i=0;i<8;i++)
showout[i]=a[classon[i]];}
else
{for(i=0;i<8;i++)
showout[i]=a[classoff[i]];}
P1_7=0;
DELAY();
P1_7=1;
EA=1;
EX0=1;
IT0=1;

while(1)
{
if(BUTTON)
{for(i=0;i<8;i++)
showout[i]=a[classon[i]];}
else
{for(i=0;i<8;i++)
showout[i]=a[classoff[i]];}
woutside=&WSLA;
inside=&in_add;
target=showout;
n=8;
WRNBYT(woutside,inside,target,n);
DELAY();
tem=temp[0];
while(tem!=0)
{switch(tem)
{     case 0x01 :DO();break;
	  case 0x02 :RA();break;
	  case 0x03 :MI();break;
	  case 0x04 :FA();break;
	  case 0x05 :SO();break;
	  case 0x06 :LA();break;
	  case 0x07 :XI();break;
	  case 0x08 :HDO();break;
	  case 0x09 :PAUSE();break;
	  case 0x0a :START();break;
	  case 0x0b :OVER();break;
}
}
}
}
void INT_7290()interrupt 0 using 0
{ unsigned char n=4,registe[4],*woutside,*routside,*inside,*target,in_add=0x00,WSLA=WSLA1,RSLA=RSLA1;
  target=registe;
  inside=&in_add;
  woutside=&WSLA;
  routside=&RSLA;
  RDNBYT(woutside,routside,inside,target,n);
  temp[0]=registe[1];
  if(BUTTON)
  {for(i=0;i<8;i++)
  showout[i]=a[classon[i]];}
  else
  {for(i=0;i<8;i++)
  showout[i]=a[classoff[i]];}
  target=showout;
  }
  void DELAY()
  {unsigned char i,j;
   for(i=0;i<255;i++)
   for(j=0;j<255;j++);
   }

 void DO()
 {i=0x21;
  j=0xf9;
  LCD_symbol(tem);
  sound_note(i,j);
 }
 void RA()
 {i=0xe0;
  j=0xf9;
  LCD_symbol(tem);
  sound_note(i,j);
 }
  void MI()
 {i=0x8b;
  j=0xfa;
  LCD_symbol(tem);
  sound_note(i,j);
 }
  void FA()
 {i=0xd7;
  j=0xfa;
  LCD_symbol(tem);
  sound_note(i,j);
 }
  void SO()
 {i=0x67;
  j=0xfb;
  LCD_symbol(tem);
  sound_note(i,j);
 }
  void LA()
 {i=0x8e;
  j=0xfb;
  LCD_symbol(tem);
  sound_note(i,j);
 }
  void XI()
 {i=0x5b;
  j=0xfc;
  LCD_symbol(tem);
  sound_note(i,j);
 }
  void HDO()
 {i=0x8e;
  j=0xfc;
  LCD_symbol(tem);
  sound_note(i,j);
 }
  void PAUSE()
  {i=0x8e;
   j=0xfc;
   sound_note(i,j);
   DELAY();
   DELAY();
   DELAY();
   sound_note(i,j);
  }
  void START()
  {LCD_lyric(tem);
   sound_music(s);
  }
  void OVER()
  {LCD_lyric(tem);
   sound_music(o);
  }

void LCD_symbol(unsigned char temp)
{
	unsigned char x; 				//x页地址(第一页)  
	unsigned char i,shu,z;     	//z:列位置(0-15)
	unsigned char disp[]={' ','t', 'h','e',' ','n','o','t','e',' ','i','s',' ', ' ',' ',
		' '};                    //待显示的(<=16个)ASCII码
	unsigned char cdata=temp;	    //待现显示的数据
	RST=0;  				     	//液晶模块复位
	DELAY();
	RST=1;
	 DISP_white();				 	//全白屏显示
	 DELAY();
	 DELAY();
 	 DELAY();
	 DELAY();
		//显示一行字符(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,disp[i]);
			}
			else 					    //第9个字符从右半屏开始显示
			{
				CSA=0;
				BF();
				WR_CODE=0x3f;
				BF();
				WR_CODE=0xc0;
				DISP_x(x,i-8,disp[i]);
			}
		}
		
		DELAY();
		DELAY();
		DELAY();
		DELAY();	
		// 显示数据(char型数据00-0xff转换成3位BCD码)
		BF();
		WR_CODE=0x3f;
		BF();
		WR_CODE=0xc0;
		x=5;                     //给定页(行)位置(0-7)
        z=11;                    //给定起始列位置(0-15)实际上为0-12(因为数据占3位)
		shu=cdata;				 //要显示的char型数据
		DISP_shu(x,z,shu);		 //调数字显示函数(具有自动换屏功能)
		
		DELAY();
		DELAY();
		DELAY();
		DELAY();	 
	 
}

void LCD_lyric(unsigned char temp)
{
	unsigned char x; 			//x页地址(第一页)  
	unsigned char i,z;     	//z:列位置(0-15)
	unsigned char disp[8];
	unsigned char *p;

	if(temp==0x0a)
	{
	//-------------------------------------------------------------------------//
    p=disps1;
	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=disps2;
		
		//显示一行字符(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]);

⌨️ 快捷键说明

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