📄 ad_key.c
字号:
#include "type.h"
#include "Port.h"
#include "Hardinit.h"
#include "AD_KEY.h"
#include "Variable.h"
#include "Lcd.h"
#include "PT2313.h"
#include "Tuner.h"
#if 0
#include "Ds1302.h"
#include "Sirius_main.h"
#include "Audio_main.h"
#include "Sirius.h"
#include "Aux_main.h"
#include "Wb.h"
#include "standard.h"
#include "SSPAPI.h"
#include "ramdef.h"
#include "AT24C02.h"
#include "iPOD.h"
#include "Ramdef_xm.h"
#include "SSPMsgHandler.h"
#include "CD_main.h"
#include "iPod_main.h"
#endif
extern const UCHAR ucVOL_VOLtbl[];
/*MAIN : KEY1 / DVD : KIN0 / MCU : AN3 */
const UINT ADlvTBL03[MAX_ADSTEP3][2] =
{
{0x3CE , KMENU}, /* MENU */
{0x3BE , KASPS}, /* AS/PS */
{0x3A0 , KAMFM}, /* AM/FM */
{0x38E , KTUNUP}, /* TUN+ */
{0x360 , KTUNDN}, /* TUN- */
{0x338 , KM6}, /* M6 */
{0x30F , KM5}, /* M5 */
{0x2CE , KM4}, /* M4 */
{0x26F , KM3}, /* M3 */
{0x1F0 , KM2}, /* M2 */
{0x12F , KM1}, /* M1 */
{0x000 , KEJECT}, /* EJECT */
};
/*MAIN : KEY2 / DVD : KIN1 / MCU : AN4 */
const UINT ADlvTBL04[MAX_ADSTEP4][2] =
{
{0x3CE , KTF}, /* T/F */
{0x3BD , KSPKC}, /* SPKC */
{0x3A0 , KSPKB}, /* SPKB */
{0x38e , KAUD}, /* AUD */
{0x368 , KMUTE}, /* MUTE */
{0x343 , KALMONOFF}, /* ALARM /ON */
{0x308 , KALMSET}, /* ALARM SET */
{0x2c8 , KSPKA}, /* SPKA */
{0x270 , KDVD}, /* DVD */
{0x1f4 , KENTER}, /* ENTER */
{0x130 , KAUX}, /* AUX */
{0x000, KPWR}, /* PWr */
};
void KEY_adin(UCHAR ch)
{
UCHAR timeout;
union
{
struct
{
UCHAR ucLow;
UCHAR ucHigh;
} Byte;
USHORT unWord;
} result;
/* Interrupt prohibition. */
/*------------------------------------------*/
/* A/D conversion starting */
/*------------------------------------------*/
#if 1
ANCHS = ch; /* A/D Channel Select */
ANSH = 0;
ANCK = 0;
ANLADE = 1; /* Ladder resistance ON. */
ANSTSEL = 0; /*0:Set ANST flag to "1"*/
ANST = 1; /* Analog to digital c onversion function start. */
#if 0
ADIE = 1;/*Enable the interrupt by setting the ADIE flag the ADICR*/
ADLV = 2;/*Set the interrupt level*/
#endif
/*------------------------------------------*/
/* A/D conversion completion wait */
/*------------------------------------------*/
for (timeout=0; timeout<ADC_TIMEOUT; timeout++)
{
if ( !ANST )
{ /* */
result.Byte.ucHigh = ANBUF1;
result.Byte.ucLow = ANBUF0;
result.unWord >>= 6;
result.unWord &= 0x3fff;
#if 1
for (; timeout<ADC_TIMEOUT; timeout++);
break;
#endif
}
}
/*------------------------------------------*/
/* A/D conversion stop */
/*------------------------------------------*/
ANST = 0; /* Analog to digital conversion function stop. */
ANLADE = 0; /* Resistance ladder Off. */
KEY.AD_Data = result.unWord;
#endif
}
UCHAR KEY_adconv(USHORT lv, UCHAR ch, UCHAR channel)
{
UCHAR i;
if(channel == ADkeyChannel3)
{
for( i= 0; i<MAX_ADSTEP3; i++)
{
if( lv >= ADlvTBL03[i][0])
break;
}
return( ADlvTBL03[i][ch]);
}
if(channel == ADkeyChannel4)
{
for( i= 0; i<MAX_ADSTEP4; i++)
{
if( lv >= ADlvTBL04[i][0])
break;
}
return( ADlvTBL04[i][ch]);
}
}
/* Get AD Value , Judge Whether a valid Key */
void vKey_Fetchkey(void)
{
KEY_adin(ADkeyChannel3);
if(KEY.AD_Data < 0x03e3)
{
if(!uiKeyADTemp)
uiKeyADTemp = KEY.AD_Data;
else
{
if(uiKeyADTemp > KEY.AD_Data)
uiKeyADTemp = KEY.AD_Data;
}
ucKeyCnt3 ++;
if(ucKeyCnt3 < 6)
return;
KEY.AD_Data = uiKeyADTemp ;
ucKeyCh3 = KEY_adconv(KEY.AD_Data,1,ADkeyChannel3);
ucKeyCnt3 = 0;
uiKeyADTemp = 0;
}
else
{
if(ucKeyCnt3) /* dithering ,counter decrease*/
ucKeyCnt3 -- ;
else
{
uiKeyADTemp = 0;
ucKeyCh3 = KNOP;
}
}
KEY_adin(ADkeyChannel4);
if(KEY.AD_Data < 0x03e3)
{
if(!uiKeyADTemp)
uiKeyADTemp = KEY.AD_Data;
else
{
if(uiKeyADTemp > KEY.AD_Data)
uiKeyADTemp = KEY.AD_Data;
}
ucKeyCnt4 ++;
if(ucKeyCnt4 < 6)
return;
KEY.AD_Data = uiKeyADTemp;
ucKeyCh4 = KEY_adconv(KEY.AD_Data,1,ADkeyChannel4);
ucKeyCnt4 = 0;
uiKeyADTemp = 0;
}
else
{
if(ucKeyCnt4)
ucKeyCnt4 -- ;
else
{
uiKeyADTemp = 0;
ucKeyCh4 = KNOP;
}
}
}
/* Long /Short /Combine Key Judge */
void vKey_Judge(void)
{
/* Key Get */
vKey_Fetchkey();
if(ucKeyCh3)
ucKeyvalue = ucKeyCh3;
else if(ucKeyCh4)
ucKeyvalue = ucKeyCh4;
else
ucKeyvalue = KNOP;
/* multiple judge ,can make it to singlel*/
#if 0
if((ucKeyCh3 == KBSKIP) && (ucKeyCh4 == KFSKIP))
{
ucKeyvalue = KMUTI1;
}
#endif
/* short or long judge */
switch(ucKeyvalue)
{
/* the key :Only have short functions */
case KAMFM:
case KEJECT:
case KDVD:
case KSPKC:
case KSPKB:
case KAUD:
case KMUTE:
case KSPKA:
case KENTER:
case KAUX:
if(ucKeyOld == KNOP)
{
ucKeyOld = ucKeyvalue;
KEY.keyQ = ucKeyOld;
Fonlyshort = 1;
}
else
KEY.keyQ = 0;
break;
/* the key : have short and long functions */
case KMENU:
case KASPS:
case KTUNUP:
case KTUNDN:
case KM6:
case KM5:
case KM4:
case KM3:
case KM2:
case KM1:
case KTF:
case KPWR:
case KALMONOFF:
case KALMSET:
if(ucKeyOld == KNOP)
{
ucKeyOld = ucKeyvalue;
uiKeyCnt = 0;
}
else
{
if(uiKeyCnt > 500)
{
if(!Flongpress)
{
Flongpress = 1;
KEY.keyQ = ucKeyvalue + 0xa0;
}
}
else
KEY.keyQ = 0;
}
break;
case KNOP:
{
if(Flongpress)
{
Flongpress = 0;
ucKeyOld = 0;
}
else
{
if(Fonlyshort)
{
Fonlyshort = 0;
ucKeyOld = 0;
}
else
{
if(ucKeyOld)
KEY.keyQ = ucKeyOld;
ucKeyOld = 0;
}
}
}
break;
}
}
/* Knob Key judge */
void vKey_Knob(void)
{
/*invalid operation while pressed*/
if(KEY.AD_Data < 0x10)
return;
if(EN_INC)
{
if(EN_DEC)
{
/* same status , no key */
Fendec_last = LAST_HIGH;
Feninc_last = LAST_HIGH;
}
else
{
/* different status, has a key */
if(Fendec_last == LAST_LOW)
{
if(Feninc_last == LAST_LOW)
{
Feninc_last = LAST_HIGH;
KEY.keyQ = KVOLDN;
}
}
else
{
if(Feninc_last == LAST_HIGH)
{
Feninc_last = LAST_LOW;
KEY.keyQ = KVOLUP;
}
}
}
}
else
{
if(EN_DEC)
{
if(Fendec_last == LAST_LOW)
{
if(Feninc_last == LAST_LOW)
{
Fendec_last = LAST_HIGH;
KEY.keyQ = KVOLUP;
}
}
else
{
if(Feninc_last == LAST_HIGH)
{
Feninc_last = LAST_LOW;
KEY.keyQ = KVOLDN;
}
}
}
else
{
Fendec_last = LAST_LOW;
Feninc_last = LAST_LOW;
}
}
}
void vMute_ON(void)
{
vWrite_PT7313(ucVOL_VOLtbl[0]);
vWrite_PT7313(PT_NULL);
/*MUTEb = ON;*/
}
void vMute_OFF(void)
{
if(ucModeKey == RADIO)
{
if(!ucLoud_ON_Flag)
vWrite_PT7313(PT_Radio);
else
vWrite_PT7313(PT_Radio_LD);
}
else if(ucModeKey == CD_MP3 )
{
if(!ucLoud_ON_Flag)
vWrite_PT7313(PT_4052);
else
vWrite_PT7313(PT_4052_LD);
}
else
{
if(ucModeKey == AUX)
IC_4052(Aux_4052);
else if(ucModeKey == iPOD)
IC_4052(iPod_4052);
else if(ucModeKey == SIRIUS)
IC_4052(Sirius_4052);
if(!ucLoud_ON_Flag) /* Sirius / iPod / Aux */
vWrite_PT7313(PT_CD);
else
vWrite_PT7313(PT_CD_LD);
}
vWrite_PT7313(ucVOL_VOLtbl[ucVolValue]);
/*MUTEb = OFF;*/
}
void vKey_Sift(void)
{
if(Power_Flag)
{
if(Mute_Flag)
{
if(KEY.keyQ != KPWR && KEY.keyQ != KMUTE)
KEY.keyQ = 0;
}
}
else
{
if(KEY.keyQ != KPWR)
KEY.keyQ = 0;
}
/* No BeepTone :invalid key , Volume */
if(KEY.keyQ == KVOLDN ||KEY.keyQ == KVOLUP || KEY.keyQ == 0)
return;
/* Beep On : Beep Tone Control*/
if(Fbeepon)
{
if(Mute_Flag)
{
MUTEb = OFF;
ucBeepNum = T300MS;
Fdelaybeep = 1;
Fdelaymute = 1;
}
else
{
BUZOE = 1;
Fdelaybeep = 0;
ucBeepNum = T100MS;
if(KEY.keyQ == KMUTE)
Fdelaymute = 1;
}
}
}
void KEY_Caulter(void)
{
vKey_Judge();
/* Pressed key filtration */
if(KEY.keyQ)
vKey_Sift();
}
void vKeyJob_Power(void)
{
Power_Flag =!Power_Flag;
Power_remember_Flag =!Power_remember_Flag;
vLcd_clearall();
if(Power_Flag)
{
MAIN_PWR = 1;
Mute_Flag = 0;
Fmutestatus = 1;
ucKeyq == KAUD;
}
else
{
vMute_ON();
Mute_Flag = 1;
Fmutestatus = 1;
MAIN_PWR = 0;
}
ucKeyq = 0;
}
void vKeyJob_Mute(void)
{
UCHAR ucICON[] = {' ',' ','M','U','T','E',' ',' '};
Mute_Flag =! Mute_Flag;
Fmutestatus = 1;
if(Mute_Flag)
{
vMute_ON();
vLcd_writestring(ucICON, 8);
}
else
{
vMute_OFF();
vLcd_clearbottom();
}
ucKeyq = 0;
}
void vVol_Display(UCHAR ucValue)
{
UCHAR ucChar[7] = {'V','O','L','U','M','E',' '};
UCHAR i;
vLcd_writechar(0,'v');
vLcd_writechar(1,'o');
vLcd_writechar(2,'l');
vLcd_writechar(3,' ');
vLcd_writechar(4,ucValue/10);
vLcd_writechar(5,ucValue%10);
}
void vKeyJob_Vol(void)
{
if(ucKeyq == KVOLUP)
{
ucVolValue ++;
if(ucVolValue > MAX_VOL)
ucVolValue = MAX_VOL;
}
if(ucKeyq == KVOLDN)
{
if(ucVolValue)
ucVolValue --;
}
vVol_Display(ucVolValue);
}
void KEY_main(void)
{
KEY_Caulter();
ucKeyq = KEY.keyQ;
KEY.keyQ = 0;
if(ucKeyq == KPWR)
vKeyJob_Power();
if(ucKeyq == KMUTE)
vKeyJob_Mute();
else if(ucKeyq == KAUD) /* now as Mode */
{
ucModeKey ++;
if(ucModeKey > MODE_MAX - 1)
ucModeKey = MODE_RADIO;
if(ucModeKey == MODE_RADIO)
{
Reflash_radio_disp_register();
vRAD_init();
Time_Flag = 1;
gtun.ucRds_Job = FREQ_DISP_MODE;
gtun.ucRdsWire_Job = FREQ_DISP_MODE;
gtun.Rds_Disp_PsMsg = 0;
gtun.RdsWire_Disp_PsMsg = 0;
grds.ucTaFlag = 0;
grds.TaAutoFlag = 0;
}
if(ucModeKey == MODE_DVD)
{
vLcd_writechar(0, 'd');
vLcd_writechar(1, 'v');
vLcd_writechar(2, 'd');
}
if(ucModeKey == MODE_iPod)
{
vLcd_writechar(0, 'i');
vLcd_writechar(1, 'p');
vLcd_writechar(2, 'o');
vLcd_writechar(3, 'd');
}
if(ucModeKey == MODE_AUX)
{
vLcd_writechar(0, 'a');
vLcd_writechar(1, 'u');
vLcd_writechar(2, 'x');
}
}
else if(ucKeyq == KVOLUP || ucKeyq == KVOLDN)
{
vKeyJob_Vol();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -