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