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

📄 main.c

📁 凌阳61单片机实现的多功能电子琴源程序代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    display_cha(colon,0,112);
    display_cha(num1,2,0);
    display_cha(tan,2,16);
    display_cha(zou,2,32);
    display_cha(num2,4,0);
    display_cha(bian,4,16);
    display_cha(ji,4,32);
    display_cha(num3,6,0);
    display_cha(ge,6,16);
    display_cha(qu,6,32);
}
void display_mode_1(void)
{
	send_cmd(0xa6);
    display_cha(num1,0,0);
    display_cha(tan,0,16);
    display_cha(zou,0,32);
    display_cha(mo,0,48);
    display_cha(shi,0,64);
    display_cha(colon,0,80);
    page=1;
    colume=128;
}

void display_mode_2(void)
{
	send_cmd(0xa6);
    display_cha(num2,0,0);
    display_cha(bian,0,16);
    display_cha(ji,0,32);
    display_cha(mo,0,48);
    display_cha(shi,0,64);
    display_cha(colon,0,80);
    page=1;
    colume=128;
}

void display_mode_3(void)
{
	send_cmd(0xa6);
    display_cha(num3,0,0);
    display_cha(ge,0,16);
    display_cha(qu,0,32);
    display_cha(mo,0,48);
    display_cha(shi,0,64);
    display_cha(colon,0,80);
    page=1;
    colume=128;
}

/*初始化*/
void lcd_initial(void)
{
	LCD_RES_L;
	delay_nus(5);
	LCD_RES_H;
	delay_nus(5);
	send_cmd(0xA2);	//LCD bias setting: 1/9
	send_cmd(0xA0);	//ADC selection: ram-seg normal
	send_cmd(0xC8); //Common output mode selection: reverse
//	send_cmd(0xDC); //??????????????????


//	send_cmd(0xC8);//?????????????????

	send_cmd(0x25); //resistor
	send_cmd(0x81); //Electonic Volume
	send_cmd(0x14);
	send_cmd(0x2C); //voltage booster
	send_cmd(0x2E); //voltage regulator
	send_cmd(0x2F); //voltage follower
	send_cmd(0xAF); //LCD display on
	send_cmd(0xE0); //Column address increment w+1
	send_cmd(0x40); //start line address
	Clear_S();
}


/**************屏幕上添加一个音符********************************/
void display_add(unsigned char *note)
{
	if(colume==128)
	{
		colume=0;
		page++;
		if(page==8)
		{
			Clear_S();
			display_mode_1();
			display_add(note);
			return;
		}		
	}
	display_note(note,page,colume);
	colume+=8;
}
/**************屏幕上删除一个音符********************************/
void display_del()
{
	colume-=8;
	if(colume==-8)colume=0;
	display_note(null,page,colume);
	if(colume==0&&page!=2)
	{
		colume=128;
		page--;
	}
}

/*--------------------------------------------------------------------------*/
//	函数名称:void sound();
//	函数功能:控制DA转换发声。
//	入口参数:无
//	出口参数:无
/*-------------------------------------------------------------------------------*/
void sound(unsigned int key_delay)
{
	int i,j,m;
	long int t;	
	if(key_delay!=0)
	{
		switch(key_delay)
		{
			case 110:LEDL5_ON;break;
			case 98: LEDL6_ON;break;
			case 87: LEDL7_ON;break;
			
			case 82: LED1_ON;break;
			case 73: LED2_ON;break;
			case 64: LED3_ON;break;
		
			case 61: LED4_ON;break;
			case 54: LED5_ON;break;
			case 48: LED6_ON;break;
		
			case 42: LED7_ON;break;
			case 40: LEDH1_ON;break;
			default: break;
		}
		t=(int)20000/key_delay;
		j=0;
		for(i=0;i<t;i++)			//一次循环   cycles
		{
			*P_DAC_Ctrl=0x0000;
			*P_DAC1=j;
			*P_DAC2=j;
			for(m = 0;m<key_delay;m++);
			if(j==0x0000)
				j=0x8000;
			else j=0x0000;
			*P_Watchdog_Clear = 0x0001;
		}
		LED_OFF;	
		//	*P_DAC1=0x0000;
		//	*P_DAC2=0x0000;	
	}
	else
	{
		delay_nms(500);
	}
	*P_Watchdog_Clear = 0x0001;                             // 清看门狗
}



/*--------------------------------------------------------------------------*/
//	函数名称:unsigned int code_to_delay(unsigned int key_code)
//	函数功能:将键盘扫描码转换成发音的延时。
//	入口参数:key_code-----键盘扫描码
//	出口参数:key_delay----延时
/*-------------------------------------------------------------------------------*/
unsigned int code_to_delay(unsigned int key_code)
{
	unsigned int key_delay=0;
	switch(key_code)
		{
			case KEY_0: key_delay = 110;break;
			case KEY_1: key_delay = 98;break;
			case KEY_2: key_delay = 87;break;
			
			case KEY_4: key_delay = 82;break;
			case KEY_5: key_delay = 73;break;
			case KEY_6: key_delay = 64;break;
		
			case KEY_8: key_delay = 61;break;
			case KEY_9: key_delay = 54;break;
			case KEY_A: key_delay = 48;break;
		
			case KEY_C: key_delay = 42;break;
			case KEY_D: key_delay = 40;break;
			case KEY_E: key_delay = 0;break;
			
			default: key_delay = 0;break;
		}
		return key_delay;
}
/*--------------------------------------------------------------------------*/
//	函数名称:unsigned char code_to_note(unsigned int key_code)
//	函数功能:将键盘扫描码转换成音符字模。
//	入口参数:key_code-----键盘扫描码
//	出口参数:key_note----音符字模的首地址
/*-------------------------------------------------------------------------------*/
unsigned char *code_to_note(unsigned int key_code)
{
	unsigned char *key_note=null;
	switch(key_code)
		{
			case KEY_0: key_note=lsew;break;
			case KEY_1: key_note =lla;break;
			case KEY_2: key_note = ltea;break;
		
			case KEY_4: key_note = doe;break;
			case KEY_5: key_note = ray;break;
			case KEY_6: key_note = me;break;
		
			case KEY_8: key_note = far;break;
			case KEY_9: key_note = sew;break;
			case KEY_A: key_note = la;break;
	
			case KEY_C: key_note = tea;break;
			case KEY_D: key_note = hdoe;break;
			case KEY_E: key_note = zero;break;
	
			default: key_note = null;break;
		}
		return key_note;
}
/***********************音符转成整数,以便存储********************************/
//		doe-tea 用1-7
//		low_5,low_6,low_7用-5,-6,-7
//		high_1用8,休止符用0
int code_to_num(unsigned int key_code)
{
	int note_num=0;
	switch(key_code)
	{
		case KEY_0: note_num=-5;break;
		case KEY_1: note_num=-6;break;
		case KEY_2: note_num=-7;break;
		
		case KEY_4: note_num=1;break;
		case KEY_5: note_num=2;break;
		case KEY_6: note_num=3;break;
		
		case KEY_8: note_num=4;break;
		case KEY_9: note_num=5;break;
		case KEY_A: note_num=6;break;
	
		case KEY_C: note_num=7;break;
		case KEY_D: note_num=8;break;
		case KEY_E: note_num=0;break;
		default: break;
	}
	return note_num;	
}
/***********************存储一个音符*******************************/
void store_note(int num)
{
	int *p;
	p=song;
	if(n<95)
	{
		*(p+n)=num;
		n++;
	}
}

/***********************删除一个音符*******************************/
void del_note()
{
	n--;
	if(n==-1)
		n=0;
}
/***********************添加歌曲结束标志*******************************/
void store_end()
{
	int *p;
	p=song;
	*(p+n)=100;
}
/***********************播放歌曲********************************************/
void sing(unsigned int *song)
{
	unsigned int key_code=0;
	unsigned int *p;
	unsigned int delay;
	key_code=Key_Get();
	p=song;
	while(*p!=100&&key_code==Key_Get())
	{
		switch(*p)
		{
			case -5:delay=110;break;
			case -6:delay=98;break;
			case -7:delay=87;break;
			case 1:delay=82;break;
			case 2:delay=73;break;
			case 3:delay=64;break;
			case 4:delay=61;break;
			case 5:delay=54;break;
			case 6:delay=48;break;
			case 7:delay=42;break;
			case 8:delay=40;break;
			case 0:delay=0;break;
			default:break;
		}
		p++;
		sound(delay);
	}
}

//=============================================================================================== 
// 语法格式:	void speak(unsigned int key_code)
// 实现功能:	
// 参数:		
// 返回值:		
//===============================================================================================
//unsigned int KeyDataChange(unsigned int Key_Data);
//void Initial_INT(void);
//unsigned int g_Data[11] = {0x003f,0x0006,0x005b,0x004f,0x0066,0x006d,0x007d,0x0007,0x007f,0x006f};
						   //0,	     1,		2,		3,		4,	  5,	6,		7,		8,		9
void speak(unsigned int key_code)
{
 //   KeyFlag = 0;

	SACM_S480_Initial(Auto);                                   //初始化为自动方式播放
	*P_Watchdog_Clear = 0x0001;                             // 清看门狗
    SACM_S480_Volume(15);                            //设置为最大播放音量    
   	switch(key_code)
	{		
		 case KEY_3:	SACM_S480_Play(0,DAC1+DAC2,Ramp_UpDn_On);break; 	//播放语音资源s0
		 case KEY_7: 	SACM_S480_Play(1,DAC1+DAC2,Ramp_UpDn_On);break; 	//播放语音资源s1
		 case KEY_B: 	SACM_S480_Play(2,DAC1+DAC2,Ramp_UpDn_On);break; 	//播放语音资源s2
		 case KEY_F:  	SACM_S480_Play(3,DAC1+DAC2,Ramp_UpDn_On);break;     //播放语音资源s3
		 default: break;		   	
	}
	while(SACM_S480_Status()&0x01)
	{
		*P_Watchdog_Clear = 0x0001;
		SACM_S480_ServiceLoop();					// 获取语音数据并将其填入解码队列  
	} 
	*P_SystemClock=0x0012;		                             
	*P_Watchdog_Clear = 0x0001;                             // 清看门狗
}

⌨️ 快捷键说明

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