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

📄 keyboardps2_44b0.c

📁 标准PS2键盘源程序(S3C44B0XKeyboardPS2_44B0)
💻 C
📖 第 1 页 / 共 2 页
字号:
#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

/************************************************************************/
/*** 键盘所有按键的状态;若某按键按下,该按键对应字节的Bit7置1,放开置0; ***/
/*** PS/2 104键盘按键扫描码最大值为0x84,所以要定义133个元素.		  ***/
/************************************************************************/
static unsigned char KeyboardState[133];


/*******************************************************************************/
/* 由于uCGUI的某些功能按键为自定义,所以要做键盘扫描码与uCGUI功能按键码对应转换 */
/*******************************************************************************/
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码转换表 ************************/
/********************************************************************************/
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[]=	//数字小键盘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[]=	//数字小键盘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
};


/********************************************************************************/
/***************** 为键盘串口定义一个软件缓冲区,以避免接收数据丢失 **************/
/********************************************************************************/
typedef struct
{
	unsigned char FIFO_RxCnt;			//软件缓冲计数器
	unsigned char FIFO_Data[64];		//软件缓冲数据区
}
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键盘一字节数据(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键盘写一字节数据(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);
}

/*********************************************************************************/
/******************* 键盘功能键扫描码转换为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;
	
}

/***************************************************************************************/
/*** 将按键的扫描码转换为ASCII码,根据键盘按键状态数组KeyboardMap[]可以实现组合键判断 ***/
/***************************************************************************************/
static unsigned char ScanCode2Ascii(unsigned char ScanCode)
{
	int i;
	for(i=0; KeyboardMap[i].KeyScanCode; i++)
	{
		if(KeyboardMap[i].KeyScanCode == ScanCode)
		{

⌨️ 快捷键说明

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