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

📄 ad_key.c

📁 按键 详细的AD按键程序 C语言版本 绝对 好用可以到出一直
💻 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 + -