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

📄 lcd.c

📁 基于51单片机的音乐播放机 程序中所引用的歌曲16进制数值,均从WAV歌曲文件中提取
💻 C
字号:
/*  版权所有,请勿用于商业目的,仅供学习参考,以下为程序说明:
	程序中所引用的歌曲16进制数值,均从WAV歌曲文件中提取,其中WAV文件以8000HZ采样8位编码,DAC0832同样
	以8000HZ采样8位编码恢复波形,通过示波器观察声音波形
	程序中3首歌曲均选取WAV文件中的192个采样点即24ms时间的波形
*/
#include<reg52.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table1[]="The 1th oneM:6.7 m:3.5 24ms";
uchar code table2[]="The 2th oneM:6.1 m:4.5 24ms";
uchar code table3[]="The 3th oneM:6.8 m:3.0 24ms";
uchar code tableFailure[]="Failure!Not Defined!";
uchar code Music1[]={   0x72,0x75,0x6C,0x78,0x78,0x7E,0x85,0x7E,0x86,0x77,0x7A,0x75,0x6A,0x76,0x6C,0x7B,
						0x7A,0x7B,0x83,0x75,0x7A,0x6F,0x71,0x6E,0x70,0x70,0x7B,0x7C,0x8F,0x8D,0x95,0x95,
						0x94,0x93,0x93,0x95,0x99,0x98,0xA0,0x9B,0x9E,0x9E,0x9A,0x9B,0x9A,0x97,0x96,0x8E,
						0x93,0x8A,0x90,0x89,0x8A,0x86,0x81,0x7F,0x77,0x79,0x74,0x7A,0x72,0x7A,0x70,0x75,
						0x67,0x6D,0x5A,0x65,0x59,0x62,0x61,0x60,0x69,0x60,0x70,0x65,0x71,0x68,0x6A,0x67,
						0x65,0x6A,0x6A,0x71,0x74,0x75,0x78,0x77,0x74,0x7F,0x6F,0x75,0x6D,0x69,0x73,0x6C,
						0x81,0x7A,0x89,0x8B,0x90,0x94,0x9E,0x98,0xAC,0x9E,0xAA,0x9E,0x98,0x97,0x8F,0x99,
						0x97,0x9E,0xA5,0xA0,0xAA,0xA0,0x9F,0x99,0x8A,0x8C,0x7F,0x80,0x86,0x82,0x8F,0x8A,
						0x89,0x87,0x7E,0x85,0x75,0x80,0x71,0x7D,0x73,0x80,0x75,0x7C,0x72,0x71,0x70,0x6C,
						0x75,0x6C,0x75,0x71,0x72,0x70,0x6D,0x6C,0x67,0x6C,0x6B,0x6F,0x70,0x74,0x74,0x77,
						0x72,0x76,0x6C,0x71,0x62,0x6C,0x62,0x6D,0x72,0x75,0x80,0x7D,0x88,0x88,0x88,0x8F,
						0x85,0x91,0x87,0x94,0x93,0x95,0x9D,0x9B,0xA0,0xA0,0x9E,0x9A,0x9A,0x93,0x94,0x8D,0x00};
uchar code Music2[]={   0x79,0x85,0x78,0x8F,0x75,0x8D,0x77,0x8D,0x75,0x94,0x74,0x90,0x77,0x91,0x76,0x94,
						0x76,0x92,0x78,0x94,0x7B,0x90,0x7E,0x8C,0x7F,0x8B,0x83,0x85,0x84,0x85,0x81,0x86,
						0x82,0x85,0x83,0x87,0x88,0x88,0x88,0x87,0x86,0x80,0x88,0x7E,0x86,0x81,0x82,0x7A,
						0x81,0x77,0x85,0x81,0x85,0x7E,0x81,0x7A,0x83,0x7E,0x84,0x7E,0x7F,0x80,0x7E,0x7B,
						0x7E,0x80,0x7E,0x84,0x81,0x7E,0x85,0x83,0x87,0x84,0x87,0x7C,0x86,0x7B,0x85,0x7C,
						0x87,0x7E,0x87,0x7D,0x85,0x7A,0x88,0x81,0x89,0x7A,0x89,0x78,0x86,0x7A,0x85,0x73,
						0x84,0x73,0x83,0x77,0x86,0x7B,0x84,0x7D,0x82,0x78,0x7F,0x76,0x80,0x77,0x7F,0x72,
						0x7D,0x75,0x7D,0x79,0x82,0x7D,0x80,0x7C,0x7C,0x77,0x81,0x79,0x7E,0x75,0x7B,0x74,
						0x7D,0x7C,0x80,0x82,0x7C,0x81,0x7A,0x84,0x7B,0x86,0x7B,0x81,0x77,0x7D,0x77,0x7F,
						0x7A,0x82,0x74,0x80,0x75,0x88,0x7B,0x8E,0x7A,0x8B,0x78,0x86,0x7C,0x88,0x7F,0x8F,
						0x78,0x90,0x79,0x96,0x7E,0x9B,0x7D,0x9C,0x7E,0x96,0x83,0x93,0x85,0x96,0x83,0x92,
						0x82,0x97,0x83,0x96,0x83,0x8F,0x80,0x8C,0x80,0x7E,0x81,0x76,0x82,0x78,0x80,0x75,0x00};
uchar code Music3[]={	0x75,0x6C,0x75,0x71,0x78,0x77,0x73,0x69,0x75,0x65,0x74,0x68,0x72,0x5D,0x76,0x60,
						0x73,0x6E,0x75,0x7A,0x74,0x84,0x7A,0x99,0x7B,0x93,0x7C,0x7C,0x7E,0x69,0x78,0x53,
						0x7B,0x4E,0x7B,0x4C,0x7A,0x5B,0x7E,0x64,0x82,0x75,0x83,0x8A,0x83,0x88,0x84,0x81,
						0x7F,0x7F,0x7B,0x76,0x7A,0x71,0x7A,0x79,0x7E,0x80,0x7E,0x83,0x80,0x88,0x7C,0x8E,
						0x77,0x8D,0x7C,0x86,0x78,0x7F,0x79,0x82,0x7A,0x82,0x7A,0x81,0x79,0x8C,0x7C,0x9C,
						0x80,0xA6,0x7D,0xB1,0x84,0xAE,0x85,0x97,0x84,0x82,0x81,0x76,0x82,0x6E,0x84,0x6D,
						0x7F,0x7C,0x7F,0x8C,0x7F,0x95,0x7E,0x9C,0x81,0x97,0x85,0x86,0x87,0x83,0x8A,0x87,
						0x8F,0x88,0x94,0x8C,0x97,0x96,0x9E,0xA8,0x9D,0xA6,0x9B,0x9B,0x9A,0x94,0x97,0x84,
						0x91,0x77,0x90,0x7F,0x98,0x88,0x95,0x83,0x95,0x88,0x95,0x97,0x8C,0x96,0x8A,0x98,
						0x8A,0x98,0x86,0x8B,0x88,0x81,0x8B,0x7F,0x85,0x80,0x84,0x7E,0x83,0x89,0x7F,0x92,
						0x7C,0x8B,0x79,0x85,0x76,0x79,0x72,0x67,0x71,0x60,0x71,0x65,0x6F,0x71,0x6B,0x80,
						0x6B,0x88,0x67,0x89,0x66,0x87,0x6C,0x74,0x6B,0x60,0x6E,0x5D,0x73,0x51,0x74,0x51,0x00};


#define pa  XBYTE[0x0000]             //定义8255口地址
#define pb  XBYTE[0x2000]
#define control8255  XBYTE[0x6000]
sbit lcdrs = P3^2;                    //LCD控制位
sbit lcden = P3^3;
sbit daccs=P3^1;                       //DAC控制位
sbit dacwr=P3^0;
uchar music123=1;  //当前播放歌曲代号
uchar musicnum=0;  //歌曲数据采样点

void DisplayFailure ()  ;
void delay(uint z)	  //延时子程序,单位约1ms
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}


void keyscan()			//********键盘扫描子程序************
{
	uchar temp;
	while(1)
	{
		P1=0xfe;              //扫描第一行
		temp=P1;
		temp=temp & 0xf0;
		if (temp!=0xf0)       //消抖动检查与延时
		{
			delay(5);
			temp=P1;
			temp=temp & 0xf0;
			if (temp!=0xf0)
			{
				uchar ChangeFlag=music123;//前进快退标志
				uchar ReplayFlag=0;       //重播标志
				switch(temp)
				{	
					case 0xe0:
					{	
						music123--;
						if(music123==0)music123=3;
						break;
					}
					case 0xd0:
					{	music123++;
						if(music123==4) music123=1;	
					    break;
					}
					case 0xb0:
					{
						ReplayFlag=1;
						break;
					}
					case 0x70:
					{
						//CircleFlag=1;
						break;
					}
				}
				
				while(temp!=0xf0)           //判断按键是否松开
				{
					temp=P1;
					temp=temp & 0xf0;
				}
				if(ChangeFlag!=music123||ReplayFlag==1)//前进后退标志或重播标志改变开始播放
					{
						TR0=1;	
					}
				else
					DisplayFailure ();
				
			}
		}
	    P1=0xfd;                   //扫描第二行
		temp=P1;
		temp=temp & 0xf0;
		if (temp!=0xf0)
		{
			delay(5);
			temp=P1;
			temp=temp & 0xf0;
			if (temp!=0xf0)
			{
				switch(temp)
				{
					case 0xe0:
					{	
				    //	key=5;
						break;
					}
					case 0xd0:
					//key=6;
					break;
					case 0xb0:
					//key=7;
					break;
					case 0x70:
				//	key=8;
					break;
				}
				while(temp!=0xf0)
				{
				temp=P1;
				temp=temp & 0xf0;
				}
				
				   DisplayFailure ();  //以下按键没定义显示提示
			}
		}
		P1=0xfb;				//扫描第三行
		temp=P1;
		temp=temp & 0xf0;
		if (temp!=0xf0)
		{
			delay(5);
			temp=P1;
			temp=temp & 0xf0;
			if (temp!=0xf0)
			{
				switch(temp)
				{
					case 0xe0:
				//	key=9;
					break;
					case 0xd0:
				//	key=10;
					break;
					case 0xb0:
				//	key=11;
					break;
					case 0x70:
				//	key=12;
					break;
				}
				while(temp!=0xf0)
				{
				temp=P1;
				temp=temp & 0xf0;
				}
				DisplayFailure ();
			}
		}
		P1=0xf7;					//扫描第四行
		temp=P1;
		temp=temp & 0xf0;
		if (temp!=0xf0)
		{
			delay(5);
			temp=P1;
			temp=temp & 0xf0;
			if (temp!=0xf0)
			{
				switch(temp)
				{
					case 0xe0:
				//	key=13;
					break;
					case 0xd0:
				//	key=14;
					break;
					case 0xb0:
				//	key=15;
					break;
					case 0x70:
				//	key=16;
					break;
				}
				while(temp!=0xf0)
				{
				temp=P1;
				temp=temp & 0xf0;
				}
				DisplayFailure ();
			}
		}
	}
}

void write_com(uchar com)       //向LCD写命令   
{
	lcdrs=0;
	pa=com;
	delay(5);
	lcden=1;
	delay(5);
	lcden=0;  
}

void write_data(uchar date)    //向LCD写数据
{
	lcdrs=1;
	pa=date;
	delay(5);
	lcden=1;
	delay(5);
	lcden=0;  
}  
void DisplayMusicIfo (uchar *table)			//显示当前播放的音乐信息,名字幅值与时间
{
	uchar n	;
	for(n=0;n<11;n++)
	{
		delay(20);
		write_data(table[n]);
	}
	write_com(0x80+0x40);
	for(n=11;n<27;n++)
	{
		write_data(table[n]);	
	}
}
void DisplayFailure ()         //未定义键,显示错误提示
{
	uchar n	;
	write_com(0x01);
	for(n=0;n<8;n++)
	{
		delay(20);
		write_data(tableFailure[n]);
	}
	write_com(0x80+0x40);
	for(n=8;n<20;n++)
	{
		write_data(tableFailure[n]);	
	}
}
void Timer0(void) interrupt 1   //定时器0中断函数
{

	daccs=0;
	dacwr=0;
	if(music123==1)	         //DAC显示波形
	{	pb= Music1[musicnum]; 
	    
	}
	if(music123==2)
	{	pb= Music2[musicnum]; 
	   
	}
	if(music123==3)
	{	pb= Music3[musicnum]; 
	   
	}
	musicnum++;				 
    if(musicnum==193)    //显示歌曲信息,关定时器停止显示
	{
		musicnum=0;
		if(music123==1)	        
		{
			lcden=0;
			write_com(0x01);
			DisplayMusicIfo(table1); 
		    
		}
		if(music123==2)
		{	
			lcden=0;
			write_com(0x01);
			DisplayMusicIfo(table2); 
		   
		}
		if(music123==3)
		{	
			lcden=0;
			write_com(0x01);
			DisplayMusicIfo(table3); 
		   
		}
		TR0	   = 0;			
	}
	

}  
void init()			  //系统初始化,8255,LCD
{	
	control8255=0x80;
	lcden=0;
	write_com(0x38);
	write_com(0x0f);
	write_com(0x06);
	write_com(0x01);
	write_com(0x80);
}

void main()
{
	init();
	TH0=131;
	TL0=131;
	//T0=65536-125;
	TMOD  = 0x02;
	EA     = 1;
	ET0    = 1;
	TR0	   = 1;	
	keyscan();
}

⌨️ 快捷键说明

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