亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ps2.c

?? ARM7增強型的PS2程序,ps2鍵盤驅動程序,嵌入式開發
?? C
字號:
#include "../inc/44blib.h"
#include "../inc/44b.h"
#include "ps2.h"

#define MAX_PS2_BUF (20)
#define PS2DATA		(rPDATG & 0x40)

unsigned int buf_w_pt, buf_r_pt;
unsigned char ps2_buffer[MAX_PS2_BUF];

KEYBOARD_STRUCT key1_lut[]=
{
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,	0,	0,	// { 6 }    { ^ }
0x3d,	0x37,	0x26,	0,	0,	// { 7 }    { & }
0x3e,	0x38,	0x2a,	0,	0,	// { 8 }    { * }
0x46,	0x39,	0x28,	0,	0,	// { 9 }    { ( }
0x45,	0x30,	0x29,	0,	0,	// { 0 }    { ) }
0x1c,	0x61,	0x41,	0,	0,	// { a }    { A }
0x32,	0x62,	0x42,	0,	0,	// { b }    { B }
0x21,	0x63,	0x43,	0,	0,	// { c }    { C }
0x23,	0x64,	0x44,	0,	0,	// { d }    { D }
0x24,	0x65,	0x45,	0,	0,	// { e }    { E }
0x2b,	0x66,	0x46,	0,	0,	// { f }    { F }
0x34,	0x67,	0x47,	0,	0,	// { g }    { G }
0x33,	0x68,	0x48,	0,	0,	// { h }    { H }
0x43,	0x69,	0x49,	0,	0,	// { i }    { I }
0x3b,	0x6a,	0x4a,	0,	0,	// { j }    { J }
0x42,	0x6b,	0x4b,	0,	0,	// { k }    { K }
0x4b,	0x6c,	0x4c,	0,	0,	// { l }    { L }
0x3a,	0x6d,	0x4d,	0,	0,	// { m }    { M }
0x31,	0x6e,	0x4e,	0,	0,	// { n }    { N }
0x44,	0x6f,	0x4f,	0,	0,	// { o }    { O }
0x4d,	0x70,	0x50,	0,	0,	// { p }    { P }
0x15,	0x71,	0x51,	0,	0,	// { q }    { Q }
0x2d,	0x72,	0x52,	0,	0,	// { r }    { R }
0x1b,	0x73,	0x53,	0,	0,	// { s }    { S }
0x2c,	0x74,	0x54,	0,	0,	// { t }    { T }
0x3c,	0x75,	0x55,	0,	0,	// { u }    { U }
0x2a,	0x76,	0x56,	0,	0,	// { v }    { V }
0x1d,	0x77,	0x57,	0,	0,	// { w }    { W }
0x22,	0x78,	0x58,	0,	0,	// { x }    { X }
0x35,	0x79,	0x59,	0,	0,	// { y }    { Y }
0x1a,	0x7a,	0x5a,	0,	0,	// { z }    { Z }
0x0e,	0x60,	0x7e,	0,	0,	// { ` }    { ~ }
0x4e,	0x2d,	0x5f,	0,	0,	// { - }    { _ }
0x55,	0x3d,	0x2b,	0,	0,	// { = }    { + }
0x5d,	0x5c,	0x7c,	0,	0,	// { \ }    { | }
0x54,	0x5b,	0x7b,	0,	0,	// { [ }    { { }
0x5b,	0x5d,	0x7d,	0,	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,	// { / }    { ? }
0x5a,	0x0a,	0,		0,	0,	// { enter }
0x29,	0x20,	0,		0,	0,	// { space }
0x05, 	0,		0,		0,	"F1",	
0x06, 	0,		0,		0,	"F2",	
0x04, 	0,		0,		0,	"F3",	
0x0c, 	0,		0,		0,	"F4",	
0x03, 	0,		0,		0,	"F5",	
0x0b, 	0,		0,		0,	"F6",	
0x83, 	0,		0,		0,	"F7",	
0x0a, 	0,		0,		0,	"F8",	
0x01, 	0,		0,		0,	"F9",	
0x09, 	0,		0,		0,	"F10",	
0x78,	0,		0,		0,	"F11",	
0x07,	0,		0,		0,	"F12",
0x66,	0,		0,		0,	"BKSP",
0x0d,	0,		0,		0,	"TAB",
0x14,	0,		0,		0,	"L_CTRL",
0xe01f,	0,		0,		0,	"L_GUI",
0x11,	0,		0,		0,	"L_ALT",
0xe014,	0,		0,		0,	"R_CTRL",
0xe027,	0,		0,		0,	"R_GUI",
0xe011,	0,		0,		0,	"R_ALT",
0xe02f,	0,		0,		0,	"APPS",
0x76,	0,		0,		0,	"ESC",
0xe070,	0,		0,		0,	"Ins",	
0xe06c,	0,		0,		0,	"Home",
0xe07d,	0,		0,		0,	"PgUP",
0xe071,	0,		0,		0,	"Del",
0xe069,	0,		0,		0,	"End",
0xe07a,	0,		0,		0,	"PgDn",
0xe075,	0,		0,		0,	"U_ARROW",
0xe06b,	0,		0,		0,	"L_ARROW",
0xe072,	0,		0,		0,	"D_ARROW",
0xe074,	0,		0,		0,	"R_ARROW",
0xe04a,	0,		0,		0,	"KP_/",
0x7c,	0,		0,		0,	"KP_*",
0x7b,	0,		0,		0,	"KP_-",
0x79,	0,		0,		0,	"KP_+",
0xe05a,	0,		0,		0,	"KP_EN",
0x71,	0,		0,		0,	"KP_.",
0x70,	0,		0,		0,	"KP_0",
0x69,	0,		0,		0,  "KP_1",
0x72,	0,		0,		0,	"KP_2",    
0x7a,   0,		0,		0,  "KP_3",    
0x6b,	0,		0,		0,	"KP_4",    
0x73,   0,		0,		0,  "KP_5",    
0x74,	0,		0,		0,	"KP_6",    
0x6c,   0,		0,		0,  "KP_7",    
0x75,	0,		0,		0,	"KP_8",    
0x7d,   0,		0,		0,  "KP_9", 
0xe037,	0,		0,		0,	"Power",
0xe03f,	0,		0,		0,	"Sleep",
0xe05e,	0,		0,		0,	"Wake",
0, 0, 0, 0,	0,
};

#define KEY_LSHIFT_MASK		(0x12)
#define KEY_RSHIFT_MASK		(0x59)
#define KEY_CAPS_MASK		(0x58)		
#define KEY_NUM_MASK		(0x77)

#define KEY_LSHIFT_INDEX	(0)
#define KEY_RSHIFT_INDEX	(1)
#define KEY_CAPS_INDEX		(2)
#define KEY_NUM_INDEX		(3)

KEYBOARD_STRUCT keys_lut[]=
{
KEY_LSHIFT_MASK,	0,	0,	0,	0,		//L_shift
KEY_RSHIFT_MASK,	0,	0,	0,	0,		//R_shift
KEY_CAPS_MASK,		0,	0,	0,	0,		//caps
KEY_NUM_MASK,		0,	0,	0,	0,		//num
0, 0, 0, 0, 0,
};


void ps2_interrupt(void)
{
	static unsigned int dat, count;
	
	count++;
	dat >>= 1;
	if(PS2DATA) dat |= 0x200;
	
	if(count == 11)
	{
	
		if((buf_w_pt+1)%MAX_PS2_BUF != buf_r_pt)
		{	
			ps2_buffer[buf_w_pt] = (unsigned char)(dat&0xff);
			buf_w_pt = (buf_w_pt+1)%MAX_PS2_BUF;
		}

		dat = 0;
		count = 0;
	}
}

void ps2_waitack(unsigned int count, unsigned int *ack)
{
	unsigned int i, wait_time;

	*ack = 0;
	for(i=0;i<count;i++)
	{
		wait_time = 20000;
		while((buf_r_pt == buf_w_pt) && wait_time--);
		if(buf_r_pt != buf_w_pt)
		{
			(*ack) <<= 8;
			*ack|=ps2_buffer[buf_w_pt-1];
			buf_w_pt = (buf_w_pt-1)%MAX_PS2_BUF;
		}
	}
}

void ps2_command(unsigned char cmd)
{
	unsigned int i, j;
	
	rINTMSK |= BIT_EINT4567;
	rPCONG = (rPCONG&(~(0xf<<12))) | (0x5<<12);
	
	rPDATG &= ~(1<<7);					//Bring the Clock line low for at least 100 microseconds.
	Delay(100);
	
	rPDATG &= ~(1<<6);					//Bring the Data line low.
	Delay(15);
	
	rPCONG = (rPCONG&(~(0xf<<12))) | (0x1<<12);		//Release the Clock line.

	while(rPDATG&0x80);					//Wait for the device to bring the Clock line low.

	for(i=0,j=0;i<8;i++)
	{
		if(cmd&0x01)					//Set/reset the Data line to send the first data bit.
		{
			rPDATG |= (1<<6);
			j++;
		}
		else
			rPDATG &= ~(1<<6);
		
		cmd >>=1;
		
		while(!(rPDATG&0x80));			//Wait for the device to bring Clock high.
		
		while(rPDATG&0x80);				//Wait for the device to bring Clock low.
	}
	
	if(!(j&0x01)) rPDATG |= (1<<6);		//Send parity bit
	else rPDATG &= ~(1<<6);
	
	while(!(rPDATG&0x80));				//Wait for the device to bring Clock high.
		
	while(rPDATG&0x80);					//Wait for the device to bring Clock low.

	rPDATG |= (1<<6);					//Send stop bit
	
	while(!(rPDATG&0x80));				//Wait for the device to bring Clock high.
		
	while(rPDATG&0x80);					//Wait for the device to bring Clock low.

	rPCONG = (rPCONG&(~(0xf<<12)));		//Release the Data line.
	
	while(rPDATG&0x40);					//Wait for the device to bring Data low.
	
	while(rPDATG&0x80);					//Wait for the device to bring Clock low.
	
	while((rPDATG&0xc0)!=0xc0);			//Wait for the device to release Data and Clock.
	
	rPCONG = (rPCONG&(~(0xf<<12))) | (0xc<<12);
	rINTMSK &= ~BIT_EINT4567;
}

void ps2_buffer_check(void)
{
	unsigned short dat, key;
	unsigned int i, ps2ack;
	static unsigned int end_state, exp_state;
	static unsigned char key_led;

//#define KEYBOARD_TEST	
#ifdef KEYBOARD_TEST
	while(buf_r_pt != buf_w_pt)
	{	
		Uart_Printf("%2.2x ",ps2_buffer[buf_r_pt]);
		buf_r_pt = (buf_r_pt+1)%MAX_PS2_BUF;
	}
#else
	while(buf_r_pt != buf_w_pt)
	{	
		dat = ps2_buffer[buf_r_pt];
		
		if(end_state)
		{
			switch(dat)
			{
				case KEY_LSHIFT_MASK :
					keys_lut[KEY_LSHIFT_INDEX].state = KEY_UP;
					break;
				case KEY_RSHIFT_MASK :
					keys_lut[KEY_RSHIFT_INDEX].state = KEY_UP;
					break;
				case KEY_CAPS_MASK :
					keys_lut[KEY_CAPS_INDEX].state = KEY_UP;
					break;
				default :
					if(exp_state) 
					{
						dat |= 0xe000;
						exp_state = 0;
					}
					for(i=0;(key1_lut[i].mask!=0)&&(key1_lut[i].mask!=dat);i++);
					if(key1_lut[i].mask)
					{
						key1_lut[i].state = KEY_UP;
						if(key1_lut[i].desc)
						{
							Uart_Printf(key1_lut[i].desc);
							Uart_Printf(" Up\n");
						}
					}
			}

			buf_r_pt = (buf_r_pt+1)%MAX_PS2_BUF;	
			end_state = 0;
			continue;
		}
		
		switch(dat)
		{
			case 0xf0 :
				end_state = 1;
				break;
			case 0xe0 :
				exp_state = 1;
				break;
			case KEY_LSHIFT_MASK :
				keys_lut[KEY_LSHIFT_INDEX].state=KEY_DOWN;
				break;
			case KEY_RSHIFT_MASK :
				keys_lut[KEY_RSHIFT_INDEX].state=KEY_DOWN;
				break;
			case KEY_CAPS_MASK :
				if(!(keys_lut[KEY_CAPS_INDEX].state))
				{	
					buf_r_pt = (buf_r_pt+1)%MAX_PS2_BUF;
					if(key_led&0x04) key_led&=0x03;
					else key_led|=0x04;
					ps2_command(0xed);
					ps2_waitack(1, &ps2ack);
					ps2_command(key_led);
					ps2_waitack(1, &ps2ack);
					keys_lut[KEY_CAPS_INDEX].state=KEY_DOWN;
					continue;
				}
				break;
			default :
				if(exp_state) 
				{
					dat |= 0xe000;
					exp_state = 0;
				}
				for(i=0,key=0;(key1_lut[i].mask!=0)&&(key1_lut[i].mask!=dat);i++);
				if(key1_lut[i].mask)
				{
					key1_lut[i].state=KEY_DOWN;
					if(keys_lut[KEY_LSHIFT_INDEX].state||keys_lut[KEY_RSHIFT_INDEX].state)
					{
						key=key1_lut[i].up_value;
						if((key_led&0x04) && (key>='A' && key<='Z'))
							key += 0x20;		
					}
					else
					{
						key=key1_lut[i].value;
						if((key_led&0x04) && (key>='a' && key<='z'))
							key -= 0x20;	
					}
					
					if(key1_lut[i].desc)
					{
						Uart_Printf(key1_lut[i].desc);
						Uart_Printf(" Down\n");
					}
					else
						Uart_SendByte(key);
				}
		}

		buf_r_pt = (buf_r_pt+1)%MAX_PS2_BUF;
	}
#endif
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品影视网| 成人三级在线视频| 国产精品视频麻豆| 欧美少妇性性性| 国产91综合网| 无码av免费一区二区三区试看| 欧美激情在线一区二区三区| 欧美性大战久久久久久久| 顶级嫩模精品视频在线看| 视频一区视频二区中文| 自拍偷拍国产亚洲| 国产午夜精品一区二区 | 欧美mv和日韩mv国产网站| 色综合天天综合给合国产| 国产资源精品在线观看| 午夜电影网一区| ...中文天堂在线一区| 26uuu亚洲综合色欧美| 欧美日韩一区视频| 欧美自拍偷拍一区| 99国产一区二区三精品乱码| 国产麻豆精品theporn| 日本女人一区二区三区| 亚洲国产综合色| 亚洲色图制服诱惑| 中文字幕精品一区二区精品绿巨人| 日韩欧美高清在线| 欧美福利视频导航| 欧美在线一区二区| 91网址在线看| 91在线看国产| www.亚洲精品| 成人av在线资源网站| 国产精品白丝av| 国产乱码精品一区二区三区忘忧草| 日本va欧美va精品| 天天射综合影视| 婷婷丁香激情综合| 午夜成人免费电影| 日韩中文字幕91| 日精品一区二区三区| 亚洲成av人片在线| 亚洲mv大片欧洲mv大片精品| 一区二区欧美视频| 午夜精品久久久久久不卡8050| 一区二区三区日韩精品| 一区二区三区在线观看国产 | 亚洲国产三级在线| 亚洲一区二区三区四区五区中文| 一区二区三区国产豹纹内裤在线| 亚洲精品久久久久久国产精华液| 亚洲精品一二三| 亚洲一区二区视频在线观看| 亚洲成人av福利| 美腿丝袜亚洲色图| 国产在线国偷精品产拍免费yy| 国产福利精品一区| 成人成人成人在线视频| 色综合久久66| 7878成人国产在线观看| 精品美女在线播放| 国产精品少妇自拍| 亚洲激情一二三区| 蜜桃av一区二区三区电影| 国产一区二区电影| caoporn国产精品| 欧美日韩在线播放一区| 欧美tickling挠脚心丨vk| 中文字幕乱码一区二区免费| 亚洲男同1069视频| 五月天丁香久久| 国产成人av影院| 色综合色狠狠综合色| 91精品国产综合久久久久久久| 精品少妇一区二区三区在线视频| 欧美国产日韩a欧美在线观看| 亚洲靠逼com| 精品中文av资源站在线观看| 成人免费黄色在线| 欧美浪妇xxxx高跟鞋交| 久久欧美一区二区| 亚洲欧美国产毛片在线| 日本视频一区二区| jiyouzz国产精品久久| 欧美精品视频www在线观看| 亚洲精品在线观| 亚洲自拍另类综合| 久久99精品久久久久久动态图 | 久久欧美中文字幕| 亚洲综合小说图片| 国产精品自拍网站| 欧美日韩一区在线观看| 国产亚洲一区二区在线观看| 亚洲成人1区2区| 成人亚洲精品久久久久软件| 欧美日韩中文另类| 国产精品国产自产拍在线| 日本欧洲一区二区| 色婷婷综合久久久中文一区二区| 亚洲精品在线三区| 日日摸夜夜添夜夜添精品视频| av成人动漫在线观看| 欧美成人精品1314www| 亚洲国产精品天堂| 风间由美性色一区二区三区| 91麻豆精品国产| 伊人夜夜躁av伊人久久| 国产成人免费xxxxxxxx| 日韩亚洲欧美综合| 亚洲综合视频网| 99久久婷婷国产综合精品电影| 精品欧美一区二区在线观看| 亚洲一级在线观看| 91首页免费视频| 国产精品免费人成网站| 国产精品影视天天线| 日韩欧美一二三区| 日本最新不卡在线| 91久久精品国产91性色tv| 国产片一区二区| 国产精品综合一区二区三区| 91精品欧美一区二区三区综合在| 一区二区三区在线视频免费| 成人av高清在线| 久久精品免费在线观看| 国产精品自拍毛片| 欧美精品一区二区三区高清aⅴ| 日产国产欧美视频一区精品| 欧美精品自拍偷拍| 一区二区不卡在线视频 午夜欧美不卡在| 粉嫩一区二区三区在线看| 26uuu国产电影一区二区| 精品夜夜嗨av一区二区三区| 欧美一区二区三区电影| 日韩1区2区日韩1区2区| 欧美一级国产精品| 免费在线观看成人| 精品日产卡一卡二卡麻豆| 久久国产精品99久久久久久老狼| 日韩精品一区二区三区视频在线观看| 日本在线播放一区二区三区| 日韩欧美中文一区二区| 美腿丝袜亚洲一区| 26uuuu精品一区二区| 经典三级在线一区| 久久综合九色综合97_久久久| 国产又粗又猛又爽又黄91精品| 精品1区2区在线观看| 国产成人av资源| 亚洲人成网站在线| 欧洲精品在线观看| 爽好多水快深点欧美视频| 3atv在线一区二区三区| 麻豆国产精品视频| 久久久电影一区二区三区| 99久久久久久| 亚洲成在线观看| 精品福利一区二区三区免费视频| 韩国欧美一区二区| 亚洲欧洲av一区二区三区久久| 91麻豆精品秘密| 天天免费综合色| 久久综合九色综合久久久精品综合 | 国产91精品入口| 中文字幕一区二区视频| 欧美私模裸体表演在线观看| 三级一区在线视频先锋| 久久久www成人免费毛片麻豆| 成人国产精品免费观看| 亚洲一二三区视频在线观看| 欧美一区二区二区| 成人免费看黄yyy456| 午夜精品123| 中文字幕高清不卡| 欧美日本国产一区| 国产麻豆视频精品| 亚洲一区影音先锋| 日韩精品一区二区三区蜜臀| jlzzjlzz亚洲女人18| 日韩制服丝袜av| 欧美韩日一区二区三区四区| 欧美亚一区二区| 国产九色sp调教91| 婷婷开心激情综合| 中文字幕一区二区三区视频| 4438x成人网最大色成网站| 成人动漫在线一区| 免费成人美女在线观看.| 中文字幕在线观看一区| 欧美一级夜夜爽| 色婷婷亚洲精品| 国产精品综合一区二区三区| 亚洲一二三四在线| 国产精品视频一区二区三区不卡| 欧美丰满嫩嫩电影| 99国产精品99久久久久久| 久久精品国产澳门| 亚洲一区自拍偷拍| 国产精品久久久久久久蜜臀| 欧美一级生活片|