www.pudn.com > HT1621Control.rar > kbd_task.c


/*C************************************************************************** 
* NAME:         kbd_task.c 
*---------------------------------------------------------------------------- 
* Copyright (c) 2006 Atmel. 
*---------------------------------------------------------------------------- 
* RELEASE:      C51 Sample       
* REVISION:     1.00      
*---------------------------------------------------------------------------- 
* 
*****************************************************************************/ 
#include "system\reg51.h" 
#include "system\compiler.h" 
#include "system\config.h" 
#include "driver\io_def.h" 
#include "kbd_task.h"                      /* scheduler definition */ 
#include "driver\kbd_drv.h"                /* kbd driver definition */ 
#include "dts_task.h"                /* kbd driver definition */ 
 
 
static  Byte    kbd_state;                  /* keyboard task state */ 
/*F************************************************************************** 
* NAME: kbd_task_init 
*---------------------------------------------------------------------------- 
* PARAMS: 
* 
* return: 
*---------------------------------------------------------------------------- 
* PURPOSE:  
*   Keyboard task initialisation 
*---------------------------------------------------------------------------- 
* EXAMPLE: 
*---------------------------------------------------------------------------- 
* NOTE: 
*---------------------------------------------------------------------------- 
* REQUIREMENTS: 
*****************************************************************************/ 
void kbd_task_init (void) 
{ 
  //kbd_state = KBD_IDLE;			/*按键任务状态(BYTE)*/ 
  //gl_key_press = FALSE;         /* 按键是否压住标志?,no key pressed */ 
  //gl_key = NO_KEY;				/*按键值,初使状态为空*/ 
	kbd_init();                   /* keyboard initialization */ 
} 
 
/*F************************************************************************** 
* NAME: ref_mode_task 
*---------------------------------------------------------------------------- 
* PARAMS: 
* 
* return: 
*---------------------------------------------------------------------------- 
* PURPOSE:  
*   Mode task  
*---------------------------------------------------------------------------- 
* EXAMPLE: 
*---------------------------------------------------------------------------- 
* NOTE: 
*   STATES: 
*   MODE_BOOT     boot state 
*   MODE_DOWNLOAD file download mode 
*   MODE_SONG     song playing mode 
*   MODE_VOICE    voice playing & recording mode 
*   MODE_TOOL     tool mode 
*   MODE_IDLE     idle mode (switch back to first task) 
*---------------------------------------------------------------------------- 
* REQUIREMENTS: 
*****************************************************************************/ 
void ref_mode_task (void) 
{ 
	kbd_process(); 
	//if((!MPOWER)&&(gl_key != KEY_MainPower)){ 
	//	; 
	//	} 
	//else {   
		switch(gl_key) 
		{ 
  			case	KEY_BAND: 
					if(kbd_process()){ 
						//P1_5 = ~P1_5; 
						if(vol_flag == High) break; 
						dts_AutoScan(); 
						gl_key_repeat = TRUE; 
						gl_key = NO_KEY; 
						} 
					break; 
 
  			case	KEY_FF: 
					if(kbd_process()){ 
						if(vol_flag == High) break; 
						if(CDPOWER){ 
							if(!DtsMen_flag){	/* if the state is setp ,dec and inc */ 
								dts_FerInc(); 
								dts_GetFer(); 
								disp_state = DISP_INIT; 
								gl_key_repeat = TRUE; 
								gl_key = NO_KEY; 
								} 
							else { 
								//Mem_add += 0x02; 
								dts_MemWriteFer(); 
								} 
							} 
						} 
					break; 
 
  			case	KEY_FR: 
					if(kbd_process()){ 
						//P1_5 = ~P1_5; 
						if(vol_flag == High) break; 
						dts_FerDec(); 
						dts_GetFer(); 
						disp_state = DISP_INIT; 
						gl_key_repeat = TRUE; 
						gl_key = NO_KEY; 
						} 
					break; 
 
			case	KEY_MainPower: 
					if(kbd_process()){ 
						MPOWER = ~MPOWER; 
						if(MPOWER) sch_scheduler_init(); 
						vol_flag = Low; 
						disp_state = DISP_INIT; 
						gl_key_repeat = TRUE; 
						gl_key = NO_KEY; 
						} 
					break; 
 
			case	KEY_VOL_INC: 
					if(gl_kbd_tick>KEY_LOOP){ 
						if(vol_value<32){ 
							vol_value++; 
							I2c_WriteByte (SC7313_ADD, VOL_Step_Map[vol_value]); 
							gl_kbd_tick = 0; 
							vol_tick = 0; 
							disp_state = DISP_INIT; 
							vol_flag = High; 
							} 
						} 
						if((vol_value == 32)&&(vol_flag == 0)){ 
							vol_flag = High; 
							disp_state = DISP_INIT; 
							} 
						gl_key = NO_KEY; 
					break; 
 
			case	KEY_VOL_DEC: 
					if(gl_kbd_tick>KEY_LOOP){ 
						if(vol_value>0){ 
							vol_value--; 
							I2c_WriteByte (SC7313_ADD, VOL_Step_Map[vol_value]); 
							gl_kbd_tick = 0; 
							vol_tick = 0; 
							disp_state = DISP_INIT; 
							vol_flag = High; 
							} 
						} 
						if((vol_value == 0)&&(vol_flag == 0)){ 
							vol_flag = High; 
							disp_state = DISP_INIT; 
							} 
						gl_key = NO_KEY; 
					break; 
 
			case	KEY_EQ_PROG: 
					if(kbd_process()){ 
						if(vol_flag == High) break; 
						if(CDPOWER){ 
							dts_MemReadFer(); 
							} 
						gl_key_repeat = TRUE; 
						gl_key = NO_KEY; 
						} 
					break; 
 
			case	KEY_ALBUM: 
					if(kbd_process()){ 
						//P1_5 = ~P1_5; 
						if(vol_flag == High) break; 
						if(CDPOWER){ 
							//dts_MemReadFer(); 
							DtsMen_flag = ~DtsMen_flag; 
							disp_state = DISP_INIT; 
							} 
						gl_key_repeat = TRUE; 
						gl_key = NO_KEY; 
						} 
					break; 
 
			case	KEY_CD: 
					if(kbd_process()){ 
						CDPOWER = Low; 
						gl_key_repeat = TRUE; 
						gl_key = NO_KEY; 
						} 
					break; 
 
			case	KEY_RADIO: 
					if(kbd_process()){ 
						CDPOWER = High; 
						gl_key_repeat = TRUE; 
						gl_key = NO_KEY; 
						} 
					break; 
 
			case	KEY_TAPE: 
					if(kbd_process()){ 
						TAPE_POWER = ~TAPE_POWER; 
						gl_key_repeat = TRUE; 
						gl_key = NO_KEY; 
						} 
					break; 
 
			default	: ; 
		} 
	//} 
} 
 
/*F************************************************************************** 
* NAME: kbd_task 
*---------------------------------------------------------------------------- 
* PARAMS: 
* 
* return: 
*---------------------------------------------------------------------------- 
* PURPOSE:  
*   Keyboard task 
*---------------------------------------------------------------------------- 
* EXAMPLE: 
*---------------------------------------------------------------------------- 
* NOTE: 
*---------------------------------------------------------------------------- 
* REQUIREMENTS: 
*****************************************************************************/ 
void kbd_task (void)					/*键盘时间间隔状态判断子程序*/ 
{ 
	kbd_task_init(); 
	//gl_key = kbd_decode();            /* 读键盘键值,程序段在kbd_drv.c文件,read key pressed */ 
	//if(gl_key != NO_KEY) { 
	if(kbd_decode()) { 
		DelayX1ms(8);				  /* 防抖动8mS */ 
		} 
		if( kbd_decode()){ 
			gl_key = kbd_decode();		 /* Key value detect,return the key operation value */ 
			} 
			else key_flag = Low; 
	ref_mode_task();			 /* Key operation 处理*/ 
} 
/*F************************************************************************** 
* NAME: kbd_process 
*---------------------------------------------------------------------------- 
* PARAMS: 
* 
* return: 
*---------------------------------------------------------------------------- 
* PURPOSE:  
*   Keyboard task 
*---------------------------------------------------------------------------- 
* EXAMPLE: 
*---------------------------------------------------------------------------- 
* NOTE: 
*---------------------------------------------------------------------------- 
* REQUIREMENTS: 
*****************************************************************************/ 
bit kbd_process (void)					/*键盘时间间隔状态判断子程序*/ 
{ 
    if((key_flag == Low)&&(gl_key_repeat == TRUE)){	 /* KEY is up ,can not process */ 
		gl_key_repeat = FALSE;	 	/* key up, Clr key keep flag */ 
		return(0); 
		} 
 
	if((key_flag == High)&&(gl_key_repeat == FALSE)){ /* KEY is keep ,can process */ 
		return(1); 
		} 
		else return(0);	 
}