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

📄 keyproc.c

📁 一个带收音的功放程序, VFD显示驱动用一个非常实用的方法, 稍加修改即可换成不同的VFD, 功放芯片用M61538
💻 C
字号:
#include "reg52.h"
#include "intrins.h"
#include "..\..\inc\globedef.h"
#include "..\..\inc\keyproc.h"
#include "..\..\inc\vfddef.h"
#include "..\..\inc\delay.h"
#include "..\..\inc\m61538.h"
#include "..\..\inc\keydef.h"
#include "..\..\inc\tuner.h"
#include "..\..\inc\i2c.h"
code 	BYTE 	IR_KEY_TBL[] =
{
	NO_KEY,                //0
	KEY_1,                 //1
	VOLUME_UP_KEY,         //2	
	KEY_3,                 //3	
	KEY_4,                 //4
	KEY_0,                 //5
	KEY_5PLUS,             //6
	CHANNEL_STEPR_KEY,     //7
	CHANNEL_STEPF_KEY,     //8
	MEMORY_KEY,            //9
	CHANNEL_PREV_KEY,      //10
	CHANNEL_NEXT_KEY,      //11
	KEY_MINUS,             //12
	FUNCTION_KEY,          //13
	KEY_PLUS,              //14
	NO_KEY,                //15
	NO_KEY,                //16
	NO_KEY,                //17
	FMAM_KEY,              //18
	VOLUME_DOWN_KEY,       //19
	CHANNEL_FB_KEY,        //20
	CHANNEL_FF_KEY,        //21
	MUTE_KEY,              //22
	NO_KEY,                //23
	KEY_PLUS,              //24
	FUNCTION_KEY,          //25
	POWER_KEY,             //26
	MEMORY_KEY,            //27
	AUTO_SCAN_KEY,         //28
	NO_KEY,                //29
	KEY_2,                 //30
	SOURCE_KEY,            //31
	NO_KEY                 //32		
};

/*=======================================================
设置输入源选择
=======================================================*/
void Source_Set()
{	
	VFD_ICON_Display(0);
	switch(Current_State)
	{

		case TUNER: 
					CD4053_SELECT = 0;
					Pin_4052B = 1;
					Pin_4052A = 1;					
					VFD_Display("TUNER", 5, 0, 0);
					Change_Tuner_Mode();
					break;
		case AUX1: 
					CD4053_SELECT = 0;
					Pin_4052B = 0;
					Pin_4052A = 1;
					VFD_Display("AUX 1 ", 5, 0, 0);
					
					break;			
		case AUX2: 
					CD4053_SELECT = 0;
					Pin_4052B = 0;
					Pin_4052A = 0;
					VFD_Display("AUX 2 ", 5, 0, 0);
					break;
		case CH5: 
					CD4053_SELECT = 1;					
					VFD_Display("6CH  ", 5, 0, 0);
					
					break;
	}
	
}



/*=====================================================================
                          按键处理函数
POWER_KEY具有最高优先级别
在MUTE状态下,只有POWER_KEY和VOLUME_KEY有作用
有三种按键输入,VFD面板按键,遥控输入按键,飞梭滚轮输入按键
=====================================================================*/
void KEY_Proc()
{	
	static BYTE KEY_TEMP[3];
	
	if((1 == Panel_KeyAct) || (1 == IR_KeyAct) || (1 == Jog_KeyAct))
	{
		//遥控按键有效
		if(1 == IR_KeyAct)
		{
			if(Remote_value < 33)
				Current_Key  =  IR_KEY_TBL[Remote_value];
			else
				Current_Key  =  NO_KEY;
			
			IR_KeyAct = 0;

			//恢复出厂默认值, 方便开机时频率设置成默认值
			if(POWER_Status == 0)//power_off状态
			{
				KEY_TEMP[2] = KEY_TEMP[1];
				KEY_TEMP[1] = KEY_TEMP[0];
				KEY_TEMP[0] = Current_Key;
				if((KEY_TEMP[2] == FUNCTION_KEY) && (KEY_TEMP[1] == KEY_0) 
					    && (KEY_TEMP[0] == KEY_5PLUS))
				{
					I2C_PutByte(A24C02, Channel_Test, 0xFF);					
				}
			}

		}
	    //飞梭旋钮按键有效
		else if(1 == Jog_KeyAct)
		{
			if(1 == Jog_Key)
				Current_Key = VOLUME_UP_KEY;
			else if(2 == Jog_Key)
				Current_Key = VOLUME_DOWN_KEY;
			Jog_KeyAct = 0;
			Jog_Key = 0;
		}
		//面板按键有效
		else if(1 == Panel_KeyAct)
		{
			if(8 == Panel_Key)
				Current_Key = POWER_KEY;			
			else if(4 == Panel_Key)
				Current_Key = SOURCE_KEY;
			else				
				Current_Key = NO_KEY;
			Panel_KeyAct = 0;
			Panel_Key = 0;
		}				
		if(Current_Key == POWER_KEY)
		{	
			Power_Proc();
		}
		else if(POWER_Status == 1)
		{
			{
				if( (Current_Key != MEMORY_KEY ) && (Current_Key != KEY_0)
					&&(Current_Key != KEY_1 ) && (Current_Key != KEY_2)
					&&(Current_Key != KEY_3 ) && (Current_Key != KEY_4)
					&&(Current_Key != KEY_5PLUS))
					
					Memory_Start = 0;//记忆标志清零
				
				switch(Current_Key)
				{
		  		 
					//FL-FR音量调节加函数,音量的调节使用M62429
					case VOLUME_UP_KEY:
						 Proc_Volume_UP();						 
						 break;
			 
					case VOLUME_DOWN_KEY:
						 Proc_Volume_DOWN(); 
						 break;
	
					case SOURCE_KEY:	
						 Mute_Switch = 0;
						 AV_STANDBY = 0;
						 if(Current_State == CH5)
						 {
							 Current_State =  TUNER;
						 }
						 else
							 Current_State++;
						 Source_Set();	
						 TO_MAIN_DISPLAY = 40;
						 break;						 					
						 
					case FUNCTION_KEY: 						 
						 Proc_FUNCTION_Key();						
						 break;
						 
					case KEY_MINUS:	 
					case KEY_PLUS:	
						 Proc_KEYPLUSorMinus();
						 break;
						 
					case CHANNEL_STEPR_KEY:
						 Tuner_Step(0);
						 break;
						 
					case CHANNEL_STEPF_KEY:
						 Tuner_Step(1);
						 break;	 
						 
					case CHANNEL_FF_KEY:
						 if(Current_State == TUNER)
							 Proc_Tuner_FF_KEY();												
						 break;
						 
					case CHANNEL_FB_KEY:
						 if(Current_State == TUNER)
							 Proc_Tuner_FB_KEY();						 
						 break;
						 
					case AUTO_SCAN_KEY: 
						 if(Current_State == TUNER)
							 Proc_Tuner_AUTOSCAN_KEY();						 
						 break;

					case CHANNEL_NEXT_KEY:
						 if(Current_State == TUNER)
						 	Proc_Tuner_NEXT_KEY();
						 break;
						 
					case CHANNEL_PREV_KEY:
						 if(Current_State == TUNER)
						 	Proc_Tuner_PREV_KEY();
						 break;
						 
					case FMAM_KEY:
						 if(Current_State == TUNER)
						 {
							 AV_STANDBY = 1;
							 Proc_FMAM_Change();
							 AV_STANDBY = 0;
						 }
						 break;
						 
					case MUTE_KEY:						 
						 if(Mute_Switch == 0)
						 {
						 	Mute_Switch = 1;
							AV_STANDBY = 1;
							VFD_Display("MUTE ", 5, 0, 0);	
							VFD_ICON_Display(ICON_MUTE);
						 }
						 else
						 {
						 	if(Current_State == TUNER)
								Tuner_MuteOFF_Display();
						 	Mute_Switch = 0;
							AV_STANDBY = 0;
						 }
						 
						 break;
						 
					case KEY_0:												
					case KEY_1:
					case KEY_2:
					case KEY_3:	
					case KEY_4:	
					case KEY_5PLUS:
						 if(Current_State == TUNER)
						 	Proc_Digital_Key();							
						 break;

					case MEMORY_KEY:
						 if(Current_State == TUNER)
						 	Proc_MEMORY_Key();
						 break;
						
					default:
						 break;
				}
			
		}
		}
		Current_Key = NO_KEY;
	}
}



void Power_Proc(void)
{
	BYTE i;
	if(POWER_Status == 0)
	{				
		Tuner_Channel_Init();
		FMAM_PRESSED    = 0;
		Auto_Scan_Enable = Auto_Scan_Stop;
		Auto_Scan_Start = 0;
		Manual_Scan_Flag = 0;
		Auto_Is_Reach = 0;
		Mono_Stereo_Select = Tuner_STEREO;
		FM_AM_Select = FM_MODE;
		Channel_Display = 100;
		VFD_WriteLedPort(0x0);		
		Tuner_Open();
		VFD_DisplayOn();
		DelayX1ms(10);	
		Mute_Switch = 0;
		Volume_Control = 1;	
		Current_State  = TUNER;
		Source_Set();
		for(i = TOTAL_VOLUME; i <= SURROUNDR_VOLUME; i++)
			VOLUME_CHANNEL[i] = 30;		
		Memory_Start    = 0;
		Digital_Number  = 0;
		Volume_Tune(ALLCH_Vol);				
		TO_MAIN_DISPLAY = 25;
		POWER_Status = 1;	
		AV_STANDBY = 0;	
		
		
	}
	else if(POWER_Status == 1)
	{	
		Volume_Control = 0;
		AV_STANDBY = 1;
		Current_State  = STANDBY;
		VFD_WriteLedPort(0xF);
		VFD_ClearALL();				
		Mute_Switch   = 1;
		Current_State  = STANDBY;
		POWER_Status = 0;
		
	}
	Current_Key 	= NO_KEY;
}

void  Proc_Volume_UP(void)
{
	 BYTE i;
	
	 Mute_Switch = 0;
	 AV_STANDBY = 0;
	 for(i = TOTAL_VOLUME; i <= SURROUNDR_VOLUME; i++)
	 {
	 	if(VOLUME_CHANNEL[i] < Volume_Max)
			VOLUME_CHANNEL[i]++;
	 }			
	if(VOLUME_CHANNEL[TOTAL_VOLUME] > 9)
		VFD_Display("VOL", 3, VOLUME_CHANNEL[TOTAL_VOLUME], 0);
	else
		VFD_Display("VOL0", 3, VOLUME_CHANNEL[TOTAL_VOLUME], 0);						
	VFD_ICON_Display(0);
	Volume_Tune(ALLCH_Vol);	
	Volume_Key_Dealed = 0;
	TO_MAIN_DISPLAY = 50;
}
void  Proc_Volume_DOWN(void)
{
	BYTE i;

	Mute_Switch = 0;
	AV_STANDBY = 0;

	for(i = TOTAL_VOLUME; i <= SURROUNDR_VOLUME; i++)
	{
		if(VOLUME_CHANNEL[i] > Volume_Min)
			VOLUME_CHANNEL[i]--;
	}
	if(VOLUME_CHANNEL[TOTAL_VOLUME] == 0)
		AV_STANDBY = 1;
	
	if(VOLUME_CHANNEL[TOTAL_VOLUME] > 9)
		VFD_Display("VOL", 3, VOLUME_CHANNEL[TOTAL_VOLUME], 0);
	else
		VFD_Display("VOL0", 3, VOLUME_CHANNEL[TOTAL_VOLUME], 0);
	VFD_ICON_Display(0);
	Volume_Key_Dealed = 0;
	Volume_Tune(ALLCH_Vol);	
	TO_MAIN_DISPLAY = 40;
}

/*===================== 功能按键处理 =============*/

code BYTE Function_Display[] = 
{
	'F','L','F','R','S','W','C',' ','S','L','S','R'
};

void Proc_FUNCTION_Key(void)
{
	
	if(VOLUME_CHANNEL[TOTAL_VOLUME] == 0)
		return;
	 //音量调节时,假如原来在MUTE状态, 关闭MUTE状态
	 Mute_Switch = 0;

	 //音量调节时, 假如原来功放MUTE掉, 打开
	 AV_STANDBY = 0;
	 VFD_ICON_Display(0);
	 FUNCTION_Count++;
	 //假如在5.1通道,那么程序要循环,从FL,FR,BASS, CENTER, SL到SR, 然后到FL
	 if(Current_State == CH5)
	 {
	 	if(FUNCTION_Count == 7)
	 		FUNCTION_Count = 1;
	 }
	 else
	 {

	 	//否则, 从FL,FR,SUBWOOFER三个之间循环
	 	if(FUNCTION_Count == 4)
	 		FUNCTION_Count = 1;
	 }
					
	 Difference_Value();
     VFD_Display(String_Display, 5, 0, 0);							
	 TO_MAIN_DISPLAY = 120;					 
}
void 		Proc_KEYPLUSorMinus(void)
{
 	if(TO_MAIN_DISPLAY == 0)
	 	return;
	
	if(Current_Key == KEY_PLUS)
	{
		if((VOLUME_CHANNEL[FUNCTION_Count] < Volume_Max) && (VOLUME_CHANNEL[FUNCTION_Count] < (VOLUME_CHANNEL[TOTAL_VOLUME] + 10)))	
	 		VOLUME_CHANNEL[FUNCTION_Count]++;			
	}
	else
	{
		if((VOLUME_CHANNEL[FUNCTION_Count] > Volume_Min) && ( VOLUME_CHANNEL[TOTAL_VOLUME] < (VOLUME_CHANNEL[FUNCTION_Count] + 10)))						 
	 		VOLUME_CHANNEL[FUNCTION_Count]--;
	}
		
	Difference_Value();
	Volume_Tune((FUNCTION_Count - 1)/2 + 1);	
    VFD_Display(String_Display, 5, 0, 0);							
	TO_MAIN_DISPLAY = 120;	
}

void  Difference_Value(void)
{
	String_Display[0] = Function_Display[(FUNCTION_Count - 1)* 2];
	String_Display[1] = Function_Display[(FUNCTION_Count - 1)* 2 + 1];
	 
	if(VOLUME_CHANNEL[FUNCTION_Count] < VOLUME_CHANNEL[TOTAL_VOLUME])
	{
		VOL_Difference = VOLUME_CHANNEL[TOTAL_VOLUME] - VOLUME_CHANNEL[FUNCTION_Count];
		String_Display[2] = '-';							 		
	}
	else
	{
		VOL_Difference = VOLUME_CHANNEL[FUNCTION_Count] - VOLUME_CHANNEL[TOTAL_VOLUME];
		String_Display[2] = '+';		 		
	}	
	
	if(VOL_Difference == 10)
	{
		String_Display[3] = '1';
		String_Display[4] = '0';
	}
	else
	{
		String_Display[3] = '0';
		String_Display[4] = '0' + VOL_Difference;
	}
}

⌨️ 快捷键说明

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