?? keyboardps2_44b0.c
字號:
#include <string.h>
#include "KeyboardPS2_44B0.h"
#include "44B.h"
#include "GUI.H"
#include "ucos_ii.h"
/**********************************************************************/
/** PS2_SCLK接44B0的Uart1->TxD1引腳;PS2_SDATA接44B0的Uart1->RxD1引腳 **/
/**********************************************************************/
#define PS2_SCLK_BIT (0x01<<12)
#define PS2_SDATA_BIT (0x01<<13)
#define Timer2_Update (0x1 << 13)
#define Timer2_Start (0x1 << 12)
/**********************************************************************/
/************************* 鍵盤按鍵掃描碼定義 *************************/
/**********************************************************************/
#define SCAN_KEY_UP 0x63
#define SCAN_KEY_DOWN 0x60
#define SCAN_KEY_RIGHT 0x6a
#define SCAN_KEY_LEFT 0x61
#define SCAN_KEY_HOME 0x6e
#define SCAN_KEY_END 0x65
#define SCAN_KEY_LSHIFT 0x12
#define SCAN_KEY_RSHIFT 0x59
#define SCAN_KEY_LCTRL 0x11
#define SCAN_KEY_RCTRL 0x58
#define SCAN_KEY_BACK 0x66
#define SCAN_KEY_INSERT 0x67
#define SCAN_KEY_DELETE 0x64
#define SCAN_KEY_LALT 0x19
#define SCAN_KEY_RALT 0x39
/**************************** 定義三個LED鍵 ****************************/
#define CapsLock 0x14
#define NumLock 0x76
#define ScrollLock 0x5f
/************************************************************************/
/*** 鍵盤所有按鍵的狀態(tài);若某按鍵按下,該按鍵對應(yīng)字節(jié)的Bit7置1,放開置0; ***/
/*** PS/2 104鍵盤按鍵掃描碼最大值為0x84,所以要定義133個元素. ***/
/************************************************************************/
static unsigned char KeyboardState[133];
/*******************************************************************************/
/* 由于uCGUI的某些功能按鍵為自定義,所以要做鍵盤掃描碼與uCGUI功能按鍵碼對應(yīng)轉(zhuǎn)換 */
/*******************************************************************************/
typedef struct
{
int Scan_Key;
int Gui_Key;
}
SCAN_KEY2GUI_KEY;
static const SCAN_KEY2GUI_KEY ScanKey_GuiKey[] =
{
{SCAN_KEY_UP, GUI_KEY_UP },
{SCAN_KEY_DOWN, GUI_KEY_DOWN },
{SCAN_KEY_RIGHT, GUI_KEY_RIGHT },
{SCAN_KEY_LEFT, GUI_KEY_LEFT },
{SCAN_KEY_HOME, GUI_KEY_HOME },
{SCAN_KEY_END, GUI_KEY_END },
{SCAN_KEY_LSHIFT, GUI_KEY_SHIFT },
{SCAN_KEY_RSHIFT, GUI_KEY_SHIFT },
{SCAN_KEY_LCTRL, GUI_KEY_CONTROL },
{SCAN_KEY_RCTRL, GUI_KEY_CONTROL },
{SCAN_KEY_BACK, GUI_KEY_BACKSPACE },
{SCAN_KEY_INSERT, GUI_KEY_INSERT },
{SCAN_KEY_DELETE, GUI_KEY_DELETE },
{0, 0 } //The End
};
/********************************************************************************/
/*********************** 鍵盤按鍵掃描碼與其ASCII碼轉(zhuǎn)換表 ************************/
/********************************************************************************/
typedef struct
{
unsigned char KeyScanCode;
unsigned char KeyAscii;
unsigned char KeyShiftAscii;
unsigned char KeyCtrlAscii;
unsigned char KeyAltAscii;
}
KEYBOARD_MAP;
static const KEYBOARD_MAP KeyboardMap[] =
{
{0x1c, 0x61, 0x41, 0x01, 0 }, //a
{0x32, 0x62, 0x42, 0x02, 0 }, //b
{0x21, 0x63, 0x43, 0x03, 0 }, //c
{0x23, 0x64, 0x44, 0x04, 0 }, //d
{0x24, 0x65, 0x45, 0x05, 0 }, //e
{0x2b, 0x66, 0x46, 0x06, 0 }, //f
{0x34, 0x67, 0x47, 0x07, 0 }, //g
{0x33, 0x68, 0x48, 0x08, 0 }, //h
{0x43, 0x69, 0x49, 0x09, 0 }, //i
{0x3b, 0x6a, 0x4a, 0x0a, 0 }, //j
{0x42, 0x6b, 0x4b, 0x0b, 0 }, //k
{0x4b, 0x6c, 0x4c, 0x0c, 0 }, //l
{0x3a, 0x6d, 0x4d, 0x0d, 0 }, //m
{0x31, 0x6e, 0x4e, 0x0e, 0 }, //n
{0x44, 0x6f, 0x4f, 0x0f, 0 }, //o
{0x4d, 0x70, 0x50, 0x10, 0 }, //p
{0x15, 0x71, 0x51, 0x11, 0 }, //q
{0x2d, 0x72, 0x52, 0x12, 0 }, //r
{0x1b, 0x73, 0x53, 0x13, 0 }, //s
{0x2c, 0x74, 0x54, 0x14, 0 }, //t
{0x3c, 0x75, 0x55, 0x15, 0 }, //u
{0x2a, 0x76, 0x56, 0x16, 0 }, //v
{0x1d, 0x77, 0x57, 0x17, 0 }, //w
{0x22, 0x78, 0x58, 0x18, 0 }, //x
{0x35, 0x79, 0x59, 0x19, 0 }, //y
{0x1a, 0x7a, 0x5a, 0x1a, 0 }, //z
{0x45, 0x30, 0x29, 0 , 0 }, //0
{0x16, 0x31, 0x21, 0 , 0 }, //1
{0x1e, 0x32, 0x40, 0 , 0 }, //2
{0x26, 0x33, 0x23, 0 , 0 }, //3
{0x25, 0x34, 0x24, 0 , 0 }, //4
{0x2e, 0x35, 0x25, 0 , 0 }, //5
{0x36, 0x36, 0x5e, 0x1e, 0 }, //6
{0x3d, 0x37, 0x26, 0 , 0 }, //7
{0x3e, 0x38, 0x2a, 0 , 0 }, //8
{0x46, 0x39, 0x28, 0 , 0 }, //9
{0x0e, 0x60, 0x7e, 0 , 0 }, //` ~
{0x4e, 0x2d, 0x5f, 0x1f, 0 }, //- _
{0x55, 0x3d, 0x2b, 0 , 0 }, //= +
{0x5c, 0x5c, 0x7c, 0 , 0 }, //\ |
{0x29, 0x20, 0x20, 0x20, 0x20}, //" "
{0x0d, 0x09, 0 , 0 , 0 }, //Tab
{0x5a, 0x0d, 0x0d, 0x0a, 0 }, //Enter
{0x08, 0x1b, 0x1b, 0x1b, 0 }, //Esc
{0x07, 0 , 0 , 0 , 0 }, //F1
{0x0f, 0 , 0 , 0 , 0 }, //F2
{0x17, 0 , 0 , 0 , 0 }, //F3
{0x1f, 0 , 0 , 0 , 0 }, //F4
{0x27, 0 , 0 , 0 , 0 }, //F5
{0x2f, 0 , 0 , 0 , 0 }, //F6
{0x37, 0 , 0 , 0 , 0 }, //F7
{0x3f, 0 , 0 , 0 , 0 }, //F8
{0x47, 0 , 0 , 0 , 0 }, //F9
{0x4f, 0 , 0 , 0 , 0 }, //F10
{0x56, 0 , 0 , 0 , 0 }, //F11
{0x5e, 0 , 0 , 0 , 0 }, //F12
{0x54, 0x5b, 0x7b, 0x1b, 0 }, //[ {
{0x6f, 0xe0, 0xe0, 0xe0, 0 }, //Page Up
{0x6d, 0xe0, 0xe0, 0xe0, 0 }, //Page Down
{0x5b, 0x5d, 0x7d, 0x1d, 0 }, // ] }
{0x4c, 0x3b, 0x3a, 0 , 0 }, // ; :
{0x52, 0x27, 0x22, 0 , 0 }, // ' "
{0x41, 0x2c, 0x3c, 0 , 0 }, // , <
{0x49, 0x2e, 0x3e, 0 , 0 }, // . >
{0x4a, 0x2f, 0x3f, 0 , 0 }, // / ?
{0, 0, 0, 0, 0 } //The End
};
static const KEYBOARD_MAP SmallKeyboardMap_NumOn[]= //數(shù)字小鍵盤Ascii碼表(NumLock燈開)
{
{0x77, 0x2f, 0x2f, 0 , 0 }, //KP /
{0x7e, 0x2a, 0x2a, 0 , 0 }, //KP *
{0x84, 0x2d, 0x2d, 0 , 0 }, //KP -
{0x7c, 0x2b, 0x2b, 0 , 0 }, //KP +
{0x79, 0x0d, 0x0d, 0 , 0 }, //KP Enter
{0x71, 0x2e, GUI_KEY_DELETE, 0 , 0 }, //KP .
{0x70, 0x30, GUI_KEY_INSERT, 0 , 0 }, //KP 0
{0x69, 0x31, GUI_KEY_END, 0 , 0 }, //KP 1
{0x72, 0x32, GUI_KEY_DOWN, 0 , 0 }, //KP 2
{0x7a, 0x33, 0xe0, 0 , 0 }, //KP 3
{0x6b, 0x34, GUI_KEY_LEFT, 0 , 0 }, //KP 4
{0x73, 0x35, 0 , 0 , 0 }, //KP 5
{0x74, 0x36, GUI_KEY_RIGHT, 0 , 0 }, //KP 6
{0x6c, 0x37, GUI_KEY_HOME, 0 , 0 }, //KP 7
{0x75, 0x38, GUI_KEY_UP, 0 , 0 }, //KP 8
{0x7d, 0x39, 0xe0, 0 , 0 }, //KP 9
{0 , 0 , 0 , 0 , 0 } //The end
};
static const KEYBOARD_MAP SmallKeyboardMap_NumOff[]= //數(shù)字小鍵盤Ascii碼表(NumLock燈滅)
{
{0x77, 0x2f, 0x2f, 0 , 0 }, //KP /
{0x7e, 0x2a, 0x2a, 0 , 0 }, //KP *
{0x84, 0x2d, 0x2d, 0 , 0 }, //KP -
{0x7c, 0x2b, 0x2b, 0 , 0 }, //KP +
{0x79, 0x0d, 0x0d, 0 , 0 }, //KP Enter
{0x71, GUI_KEY_DELETE, GUI_KEY_BACKSPACE, 0 , 0 }, //KP .
{0x70, GUI_KEY_INSERT, 0 , 0 , 0 }, //KP 0
{0x69, GUI_KEY_END, 0 , 0 , 0 }, //KP 1
{0x72, GUI_KEY_DOWN, 0 , 0 , 0 }, //KP 2
{0x7a, 0xe0, 0 , 0 , 0 }, //KP 3
{0x6b, GUI_KEY_LEFT, 0 , 0 , 0 }, //KP 4
{0x73, 0 , 0 , 0 , 0 }, //KP 5
{0x74, GUI_KEY_RIGHT, 0 , 0 , 0 }, //KP 6
{0x6c, GUI_KEY_HOME, 0 , 0 , 0 }, //KP 7
{0x75, GUI_KEY_UP, 0 , 0 , 0 }, //KP 8
{0x7d, 0xe0, 0 , 0 , 0 }, //KP 9
{0 , 0 , 0 , 0 , 0 } //The end
};
/********************************************************************************/
/***************** 為鍵盤串口定義一個軟件緩沖區(qū),以避免接收數(shù)據(jù)丟失 **************/
/********************************************************************************/
typedef struct
{
unsigned char FIFO_RxCnt; //軟件緩沖計數(shù)器
unsigned char FIFO_Data[64]; //軟件緩沖數(shù)據(jù)區(qū)
}
SOFTFIFO;
static SOFTFIFO FIFO_KeyBoard;
static void PS2_Delay1us(unsigned int delay) //Delay 1uS
{
unsigned int i;
for(;delay>0;delay--)
{
for(i=0;i<10;i++);
}
}
/******************************************************************************/
/******************* 讀PS2鍵盤一字節(jié)數(shù)據(jù)(I/O口操作方式) ***********************/
/******************************************************************************/
static unsigned char PS2_ReadByte(void)
{
unsigned int i = 0;
unsigned char j,data;
rPCONC &= ~(0x0f<<24); //GPC12 = input,GPC13 = input;
rPDATC |= (0x03<<12); //GPC12 = 1,GPC13 = 1;
rPUPC |= (0x03<<12); //GPC12\GPC13 Disable pull-up
PS2_Delay1us(2); //Delay 2uS
while((rPDATC & PS2_SCLK_BIT) && i<2000000) //Wait PS2_SCLK = 0;START BIT
{
i++;
}
if(i >= 2000000)
{
return (0xFC); //若沒接鍵盤;超時退出.
}
PS2_Delay1us(2); //Delay 2uS
while(!(rPDATC & PS2_SCLK_BIT)); //Wait PS2_SCLK = 1;
PS2_Delay1us(2); //Delay 2uS
data = 0x00; //Clear data;
for(j=0;j<8;j++)
{
data >>= 1;
while(rPDATC & PS2_SCLK_BIT); //Wait PS2_SCLK = 0;
PS2_Delay1us(2); //Delay 2uS
if(rPDATC & PS2_SDATA_BIT)
{
data |= 0x80;
}
while(!(rPDATC & PS2_SCLK_BIT));//Wait PS2_SCLK = 1;
PS2_Delay1us(2); //Delay 2uS
}
while(rPDATC & PS2_SCLK_BIT); //Wait PS2_SCLK =0;PARITY BIT
PS2_Delay1us(2); //Delay 2uS
while(!(rPDATC & PS2_SCLK_BIT));//Wait PS2_SCLK =1;
PS2_Delay1us(2); //Delay 2uS
while(rPDATC & PS2_SCLK_BIT); //Wait PS2_SCLK =0;STOP BIT
PS2_Delay1us(2); //Delay 2uS
while(!(rPDATC & PS2_SCLK_BIT));//Wait PS2_SCLK =1;
PS2_Delay1us(2); //Delay 2uS
return (data);
}
/******************************************************************************/
/******************* 向PS2鍵盤寫一字節(jié)數(shù)據(jù)(I/O口操作方式) *********************/
/******************************************************************************/
static unsigned char PS2_SendByte(unsigned char data)
{
unsigned int i;
unsigned char j;
unsigned char Parity_Even =0x01;
unsigned char data_temp;
data_temp = data;
for( i=0; i<8; i++) //find the number of 1 in this uchar data is odd or not
{
if(data_temp & 0x01)
{
Parity_Even = ~Parity_Even;
}
data_temp >>=1;
}
rPCONC &= ~(0x0f<<24);
rPCONC |= (0x05<<24); //GPC12 = output,GPC13 = output;
rPUPC |= (0x03<<12); //GPC12\GPC13 Disable pull-up
rPDATC &= ~(PS2_SCLK_BIT); //PS2_SCLK = 0;
PS2_Delay1us(300); //Delay 300uS
rPDATC &= ~(PS2_SDATA_BIT); //PS2_SDATA = 0;
PS2_Delay1us(50); //Delay 50uS
rPDATC |= PS2_SCLK_BIT; //PS2_SCLK = 1;
rPCONC &= ~(0x03<<24); //PS2_SCLK = input;
PS2_Delay1us(2); //Delay 2uS
for(j=0;j<8;j++)
{
while((rPDATC & PS2_SCLK_BIT) && i<2000000) //Wait PS2_SCLK = 0;
{
i++;
}
if(i >= 2000000)
{
return (0); //若沒接鍵盤;超時退出.
}
if(data & 0x01)
rPDATC |= PS2_SDATA_BIT;
else
rPDATC &= ~PS2_SDATA_BIT;
PS2_Delay1us(2); //Delay 2uS
while(!(rPDATC & PS2_SCLK_BIT));//Wait PS2_SCLK =1;
PS2_Delay1us(2); //Delay 2uS
data >>= 1;
}
while(rPDATC & PS2_SCLK_BIT); //Wait PS2_SCLK =0;PARITY BIT
PS2_Delay1us(2); //Delay 2uS
if(Parity_Even & 0x01)
rPDATC |= PS2_SDATA_BIT;
else
rPDATC &= ~PS2_SDATA_BIT;
while(!(rPDATC & PS2_SCLK_BIT));//Wait PS2_SCLK =1;
PS2_Delay1us(2); //Delay 2uS
while(rPDATC & PS2_SCLK_BIT); //Wait PS2_SCLK =0;STOP BIT
PS2_Delay1us(2); //Delay 2uS
rPDATC |= PS2_SDATA_BIT; //PS2_SDATA = 1;
rPCONC &= ~(0x03<<26); //PS2_SDATA = input;
PS2_Delay1us(2); //Delay 2uS
while(rPDATC & PS2_SDATA_BIT); //Wait PS2_SDATA = 0;
PS2_Delay1us(2); //Delay 2uS
while(rPDATC & PS2_SCLK_BIT); //Wait PS2_SCLK =0;
PS2_Delay1us(2); //Delay 2uS
while(!(rPDATC & PS2_SCLK_BIT) || !(rPDATC & PS2_SDATA_BIT));//Wait PS2_SCLK=1 & PS2_SDATA=1;
return (1);
}
/*********************************************************************************/
/******************* 鍵盤功能鍵掃描碼轉(zhuǎn)換為uCGUI自定義的功能碼 *******************/
/*********************************************************************************/
static unsigned char ScanKey2GuiKey(unsigned char ScanCode)
{
int i;
for (i=0; ScanKey_GuiKey[i].Scan_Key; i++)
{
if (ScanKey_GuiKey[i].Scan_Key == ScanCode)
{
return ScanKey_GuiKey[i].Gui_Key;
}
}
return 0;
}
/**********************************************************************************/
/**************** ScrollLock,NumLock,CapsLock三個鍵處理程序 ***********************/
/**********************************************************************************/
static unsigned char HandleLockEven(void)
{
unsigned char LockState = 0;
unsigned char data;
if(KeyboardState[ScrollLock]&0x80)
{
LockState |= 0x01;
}
if(KeyboardState[NumLock]&0x80)
{
LockState |= 0x02;
}
if(KeyboardState[CapsLock]&0x80)
{
LockState |= 0x04;
}
PS2_SendByte(0xED);
PS2_Delay1us(2); //Delay 2uS
data = PS2_ReadByte();
if(data != 0xFA)
{
return 0;
}
PS2_Delay1us(2); //Delay 2uS
PS2_SendByte(LockState);
PS2_Delay1us(2); //Delay 2uS
data = PS2_ReadByte();
if(data != 0xFA)
{
return 0;
}
rPCONC &= ~(0x0f<<24);
rPCONC |= (0x0C<<24); //GPC12 = input,GPC13 = RxD0;
rPDATC |= (0x03<<12); //GPC12 = 1,GPC13 = 1;
rPUPC |= (0x03<<12); //GPC12\GPC13 Disable pull-up
return 1;
}
/***************************************************************************************/
/*** 將按鍵的掃描碼轉(zhuǎn)換為ASCII碼,根據(jù)鍵盤按鍵狀態(tài)數(shù)組KeyboardMap[]可以實現(xiàn)組合鍵判斷 ***/
/***************************************************************************************/
static unsigned char ScanCode2Ascii(unsigned char ScanCode)
{
int i;
for(i=0; KeyboardMap[i].KeyScanCode; i++)
{
if(KeyboardMap[i].KeyScanCode == ScanCode)
{
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -