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

📄 keyboard.c

📁 嵌入式系统下的键盘驱动程序。可识别三种类型的键盘动作:按下
💻 C
字号:
//###########################################################################
//
// FILE:	keyboard.c
//
// TITLE:	keyboard driver
//
//###########################################################################
//
//  Ver | dd mmm yyyy | Who        | Description of changes
// =====|=============|============|===============================================
//  1.00| 26 Jun 2007 | Stony.Chen | Create this file
//###########################################################################


#define KEY_MAX		20 
#define KEY_NULL	0

#define PRESS_TINGLE	0x01
#define PRESS_DOWN   	0x02
#define PRESS_REP		0x04
#define PRESS_UP		0x08

enum
{
	KEY_UP,
	KEY_DOWN,
	KEY_LEFT,
	KEY_RIGHT,
	KEY_NEXT,
	KEY_ENTER,
	KEY_PAUSE,
	KEY_RESET,
	KEY_F1,
	KEY_F2,
	KEY_F3,
	KEY_F4,
	KEY_HOME,
	KEY_TEST,
	KEY_COPY,
	KEY_MOVE,
	KEY_LAST
};

/* Define key press state */
typedef union KEY_PRESS_STATE{
	struct BITS{
	INT16U Ftingle:1;
	INT16U Fdown:1;
	INT16U Frep:1;
	INT16U Fup:1;
	INT16U Kinput:1;
	INT16U Ktemp:1;
	INT16U Kcur:1;
	INT16U Kpre:1;
	INT16U Rsved:8;
	}bits;

	INT16U all;
}KEY_PRESS_STATE_t;

const INT8U keyboard_table[4][4] = 
{
	KEY_ENTER,	KEY_NEXT,	KEY_HOME, 	KEY_PAUSE, 	
	KEY_RESET,	KEY_TEST,	KEY_COPY,	KEY_MOVE,
	KEY_F1,		KEY_F2,		KEY_F3,		KEY_F4,
	KEY_UP,		KEY_DOWN,	KEY_LEFT,	KEY_RIGHT
};

INT8U kb_key[KEY_MAX]; /* store keyboard input key */
INT8U kb_flag[KEY_MAX]; /* store keyboard input flag:press up or press down */

INT8U key_read = 0;
INT8U key_write = 0;
INT8S num_received_key=0;
INT8U pressed_key_column, pressed_key_row;
KEY_PRESS_STATE_t key_press_state;
	
VOID debounce(VOID)
{
	/*以下是去除键抖动表达式*/
	key_press_state.bits.Kcur=key_press_state.bits.Ktemp & key_press_state.bits.Kinput |key_press_state.bits.Kcur & (key_press_state.bits.Ktemp^key_press_state.bits.Kinput);
	
	/*distinguish the key action */
	key_press_state.bits.Ftingle = (~key_press_state.bits.Kpre)&(~key_press_state.bits.Kcur);
	key_press_state.bits.Frep	= key_press_state.bits.Kpre&key_press_state.bits.Kcur;
	key_press_state.bits.Fup = key_press_state.bits.Kpre&(~key_press_state.bits.Kcur);	
	key_press_state.bits.Fdown =(~key_press_state.bits.Kpre)&key_press_state.bits.Kcur;

	/*update the value and prepare for processing next time*/
	key_press_state.bits.Ktemp=key_press_state.bits.Kinput;
	key_press_state.bits.Kpre=key_press_state.bits.Kcur;
}

/*扫描键盘,检测是否有键被按下了;如果是则返回TRUE,且返回按下的键的行列号*/
BOOLEAN scankeypad(INT8U *row, INT8U *column)
{
//add your code here
}

/*只检测特定的键是否被按下了;如果是则返回TRUE*/
BOOLEAN ChechTheSpecifiedKey(INT8U row, INT8U column)
{
//add your code here
}


BOOLEAN readthekey(INT8U* key_val, INT8U* pressed_state)
{
	if(num_received_key<=0)
		return FALSE;

	*key_val=kb_key[key_read];
	*pressed_state=kb_flag[key_read];

	key_read=(key_read+1)%KEY_MAX;
	num_received_key--;

	return TRUE;
}

/*This is a timer isr*/	
void TIMER_ISR(void)
{
  
  //to scan the specified cloumn and row as recorded
	if(ChechTheSpecifiedKey(pressed_key_row, pressed_key_column))
		key_press_state.bits.Kinput= 1;
	else
		key_press_state.bits.Kinput= 0;
	
	//debounce routine	
	debounce();

	switch(key_press_state.all&0x000f)
	{
	case PRESS_DOWN:
		//this is press down
		if(num_received_key<KEY_MAX)
		{
			kb_key[key_write] = keyboard_table[pressed_key_row][pressed_key_column];
			kb_flag[key_write] = PRESS_DOWN;
			key_write=(key_write+1)%KEY_MAX;
			num_received_key++;
		}
		break;

	case PRESS_REP:
		//this is press repeatedly
		if(num_received_key<KEY_MAX)
		{
			kb_key[key_write] = keyboard_table[pressed_key_row][pressed_key_column];
			kb_flag[key_write] = PRESS_REP;
			key_write=(key_write+1)%KEY_MAX;
			num_received_key++;
		}
		break;

	case PRESS_UP:
		//this is press up
		if(num_received_key<KEY_MAX)
		{
			kb_key[key_write] = keyboard_table[pressed_key_row][pressed_key_column];
			kb_flag[key_write] = PRESS_UP;
			key_write=(key_write+1)%KEY_MAX;
			num_received_key++;
		}
	case PRESS_TINGLE:
	default:
		// unknown state
		//Add your code here, you need to 
			/* Step1: Stop this timer */
			/* Step2: Enable interrupt to detect key down trigger */

		break;
	}

}

/*this is isr which is called when a key-down action trigger a transient of 
voltage polatiry, such fall or rise trigger*/
void  EXT_ISR(void)
{
  	int i, j;
  
		if(scankeypad(&pressed_key_row, &pressed_key_column))
		{
			/*add your code here, you need to do*/
				/*Step 1: Disable this interrupt*/
				/*Step 2: Enable a timer isr*/
			
			/*Init debounce process*/
			key_press_state.all=0;

			/*first time of debounce*/
			key_press_state.bits.Kinput=1;
			debounce();
		}	
}     


//===========================================================================
// No more.
//===========================================================================

⌨️ 快捷键说明

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