📄 keyproc.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 + -