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

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

?? ps2.c

?? 單片機與PS2鼠標接口設計 采用中斷或查詢多種方式
?? C
字號:
/*****************************************************************************/
//main.c
//功能:從PS/2口接受鍵盤信息,解碼成ACSII碼,通過UART發送出去,并且控制鍵盤
//修改:
//時間:2006-7-8
//作者:R.S.J
/*****************************************************************************/

#include <reg51.h>
#include <intrins.h>
#include "PS2.h"

#define EINT (EA = 1)
#define DINT (EA = 0)

#define MAXBUFFER 15

#define WAITFORKEYBOARDPULSE while(!scl); while(scl)

#define COMMAND_RESET 0xFF //命令:復位鍵盤
#define COMMAND_READID 0xF2 //命令:讀鍵盤ID
#define COMMAND_SETSTATUS 0xED //命令:設置狀態CapsLock,NumLock,ScrollLock
#define COMMAND_SETRATE 0xF3 //命令:設置速率,延時
#define COMMAND_ENABLE 0xF4 //命令:使能鍵盤
#define CAPSLOCK_EN 0x04 //使能CapsLock 燈
#define NUMLOCK_EN 0x02 //使能NumLock 燈
#define SCROLLLOCK_EN 0x01 //使能ScrollLock燈
#define CAPSLOCK_DIS 0x03 //關閉CapsLock燈
#define NUMLOCK_DIS 0x05 //關閉NumLock燈
#define SCROLLLOCK_DIS 0x06 //關閉ScrollLock燈
#define DISALL 0x00 //關閉所有燈


#define CODE_POST 0xAA //鍵盤上電自檢成功 Power On Self Test
#define CODE_ACK 0xFA //鍵盤應答碼
#define CODE_ECHO 0xEE //鍵盤的回應碼
#define CODE_BREAK 0xF0 //斷碼
#define CODE_EXTEND 0xE0 //擴展碼
#define CODE_PAUSE 0xE1 //Pause鍵起始碼 E1+14+77/E1+F0+14/F0+77
#define CODE_LSHIFT 0x12 //左Shift鍵通碼
#define CODE_RSHIFT 0x59 //右Shift鍵通碼
#define CODE_LCTRL 0x14 //左CTRL鍵通碼
#define CODE_RCTRL 0x14 //右CTRL鍵通碼 0xE0,0x14
#define CODE_LALT 0x11 //左ALT鍵通碼
#define CODE_RALT 0x11 //右ALT鍵通碼 0xE0,0x11
#define CODE_NUMLOCK 0x77 //NumLock鍵
#define CODE_CAPSLOCK 0x58 //CapsLock鍵
#define CODE_SCROLLLOCK 0x7E//SCROLLLOCK鍵

/* 函數定義 */
unsigned char ReadPS2(); //讀PS2端口獲取PS2發送的數據
void KeyScan(); //獲得鍵值
void KeyTransmit(); //發送鍵值
void Order(unsigned char); //向鍵盤發送命令
void KickDog(); //喂狗
void Delay(unsigned char);
void LedLock(unsigned char);
/* 變量定義 */
sbit sda = P3^7; //P3.7做為數據線
sbit scl = P3^2; //P3.2做為時鐘線
sbit key_sw = P1^1; //P1.2作為鍵盤電源開關

int i;
unsigned char KeyCodeBuff[MAXBUFFER+1] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//鍵值緩存
unsigned char KeyCodeSum = 0; //鍵碼數
bit KeyFlag = 0; //有鍵標志
bit KeyUpFlag = 0; //鍵彈起標志
bit KeyExtendFlag = 0; //擴展鍵標志
bit KeyLedLockFlag = 0; //三個Led鍵被按下的標志
bit KeyBoardConnectFlag = 0; //鍵盤連接標志
bit KeyPauseFlag = 0; //Pause鍵標志
bit KeyMakeCodeFlag = 0; //鍵盤發送通碼標志
/*
bit CapsLockFlag = 0; //CapsLock標志
bit NumLockFlag = 0; //NumLock標志
bit ScrollLockFlag = 0; //ScrollLock標志
*/
unsigned char KeyIDLo = 0; //鍵盤ID低字節
unsigned char KeyIDHi = 0; //鍵盤ID高字節
unsigned char LedStatus = 0; //NumLock,CapsLock,ScrollLock燈控制
/*********************************************************/
//函數:main()
//功能:主函數
//輸入:無
//輸出:無
//描述:
/*********************************************************/
void main()
{
DINT; //關中斷

for(i=0;i<1000;i++)
;//延時穩定

/* 初始化變量 */
sda = 0;
scl = 0; //端口設置為高
key_sw = 1; //關鍵盤
for(i=0;i<1000;i++)
Delay(10);
for(i = 0;i<16;i++)
{
KeyCodeBuff = 0;
}
KeyCodeSum = 0;
KeyFlag = 0;
KeyUpFlag = 0;
KeyExtendFlag = 0;
KeyLedLockFlag = 0;
KeyBoardConnectFlag = 0;
KeyPauseFlag = 0;
KeyMakeCodeFlag = 0;
KeyIDLo = 0;
KeyIDHi = 0;
LedStatus = 0;

TMOD = 0x22; //T1為波特率發生器設置19200波特率
//T0為采樣鍵盤時鐘發生器
TL1 = 0xFD;
TH1 = 0xFD;
// TL0 =
// TH0 =
PCON |= 0x80; //SMOD設置為1
SCON = 0x50; //串口控制寄存器
//工作方式
//非多機通訊方式
//允許接收
//

TR1 = 1; //定時器1開始

IT0 = 0; //低電平引起中斷

ES = 1; //開串口中斷
EX0 = 1; //開外部0中斷
key_sw = 0; //開鍵盤電源
scl = 1;
sda = 1;

Delay(1);
while(!KeyBoardConnectFlag)
ReadPS2();//等待鍵盤自檢成功

Order(COMMAND_RESET); //復位鍵盤
ReadPS2(); //等待鍵盤應答
Delay(5);

Order(COMMAND_SETSTATUS);//設置狀態燈CapsLock,NumLock,ScrollLock
ReadPS2(); //等待鍵盤應答
LedStatus = DISALL;
Order(LedStatus); //關閉所有燈
ReadPS2(); //等待鍵盤應答
/*
Order(COMMAND_READID); //讀鍵盤ID
ReadPS2(); //等待鍵盤應答
KeyIDLo = ReadPS2(); //獲得鍵盤ID低字節
KeyIDHi = ReadPS2(); //獲得鍵盤ID高字節
*/
LedStatus = NUMLOCK_EN; //開NumLock燈
Order(COMMAND_SETSTATUS); 
ReadPS2(); //等待應答
Order(LedStatus); //
ReadPS2(); //等待應答
Order(COMMAND_SETRATE); //設置速率延時
ReadPS2(); //等待應答
Order(0x20); //500ms/30
ReadPS2();
Order(COMMAND_ENABLE); //使能鍵盤
ReadPS2();
Order(COMMAND_SETRATE); //設置速率延時
ReadPS2();
Order(0x20); //
ReadPS2();

Delay(200); //延時

EINT; //開總中斷

for(;;)
{
//KeyScan();//掃描鍵盤
if(KeyFlag == 1)
{
KeyFlag = 0;
KeyTransmit();//
}

KickDog();
}
}

/*********************************************************/
//函數:uart
//功能:串口中斷
//輸入:無
//輸出:無
//描述:
/*********************************************************/
void uart() interrupt 4 using 2
{
if(RI == 1) //接收中斷
{
RI= 0;

}
else if(TI == 1) //發送中斷
{
if(KeyCodeSum >1)
{
SBUF = KeyCodeBuff[--KeyCodeSum]; 
}
else
{
KeyCodeSum = 0; 
}
TI = 0;
}
}
/*********************************************************/
//函數:KeyTransmit()
//功能:發送鍵值
//輸入:
//輸出:
//描述:
/*********************************************************/
void KeyTransmit()
{
while(TI == 1);
SBUF = KeyCodeBuff[--KeyCodeSum]; //發送鍵值
//KeyCodeSum = 0; //
}
/*********************************************************/
//函數:timer0()
//功能:定時器0中斷
//輸入:
//輸出:
//描述:
/*********************************************************/
void timer0() interrupt 1 using 3
{

}
/*********************************************************/
//函數:ex0()
//功能:外部中斷0服務程序
//輸入:
//輸出:
//描述:
/*********************************************************/
void ex0() interrupt 0 using 3
{ //時鐘線變低
unsigned char bitCount;
unsigned char KeyCode = 0;
if(KeyCodeSum < MAXBUFFER) KeyCodeBuff[KeyCodeSum] = 0;
for(bitCount = 8; bitCount != 0; bitCount --) // 把起始位算入
{
WAITFORKEYBOARDPULSE; // 等待一個有效的下跳沿
KeyCode >>= 1; // 按照PS2格式,數據低位在前
scl = 1;
sda = 1;
if(sda == 1)
{
KeyCode |= 0x80; // 得到有效的數據位
}
}
WAITFORKEYBOARDPULSE; // 等待按鍵發送效驗位
WAITFORKEYBOARDPULSE; // 等待按鍵發送終止位
while(!scl); // 等待鍵盤把時鐘線拉高
switch(KeyCode)
{
	case CODE_POST:
		KeyBoardConnectFlag = 1;
		break;
	case CODE_ACK: //鍵盤應答
		Order(LedStatus);
		break;
	case CODE_ECHO: //鍵盤的echo回應碼 
		break;
	case 0xFE:
		break; 
	case CODE_BREAK: //鍵盤發送的是斷碼
		KeyUpFlag = 1;
		break;
	case CODE_EXTEND: //鍵盤發送的是擴展碼
		if(KeyExtendFlag == 0)
			{
			KeyExtendFlag = 1;
			KeyCodeBuff[KeyCodeSum] = KeyCode;
			if(KeyCodeSum < MAXBUFFER) KeyCodeSum++;
			} 
		break;
	case CODE_PAUSE: //鍵盤發送的是Pause鍵的鍵碼
		KeyPauseFlag = 1;
		KeyCodeBuff[KeyCodeSum] = KeyCode;
		if(KeyCodeSum < MAXBUFFER) KeyCodeSum++;
		break; 
	case CODE_NUMLOCK:
	if(KeyPauseFlag == 1 || (KeyMakeCodeFlag == 0 && KeyUpFlag))
	{
	
	KeyFlag = 1; //如果是Pause鍵的鍵碼(E1+14+77)則77代表鍵碼結束直接發送
	
	if(KeyMakeCodeFlag == 0) //Pause鍵發送的鍵碼是(F0+77)
		{
			KeyCodeBuff[KeyCodeSum] = CODE_PAUSE;
			if(KeyCodeSum < MAXBUFFER) KeyCodeSum++;
			KeyCodeBuff[KeyCodeSum] = 0x14;
			if(KeyCodeSum < MAXBUFFER) KeyCodeSum++;
		}
		
		KeyUpFlag = 0;
		KeyMakeCodeFlag = 0;
		KeyPauseFlag = 0;
		break;
	} 
	
	case CODE_CAPSLOCK:
	
	case CODE_SCROLLLOCK: //發送的是三個LED控制鍵通碼
		KeyLedLockFlag = 1;
	
	default: //鍵盤發送的是通碼
		if(KeyUpFlag == 1)
		{ //發送的是斷碼之后的通碼
			KeyFlag = 1; //有正常鍵被按下
			KeyUpFlag = 0; //鍵彈起標志
			KeyExtendFlag = 0; //擴展鍵標志
			KeyMakeCodeFlag = 0; //鍵通碼標志
			if(KeyPauseFlag == 1) //Pause鍵被按下發送的鍵碼是(E1+F0+14) 
			{
				KeyPauseFlag = 0;
				KeyCodeBuff[KeyCodeSum] = KeyCode;
				if(KeyCodeSum < MAXBUFFER) KeyCodeSum++;
				break;
			}
			
		if(KeyLedLockFlag == 1)
		{
			KeyLedLockFlag = 0;
			switch(KeyCode)
			{
			case CODE_CAPSLOCK:
				if(LedStatus & CAPSLOCK_EN)
					{
					LedStatus &= CAPSLOCK_DIS;
					}
				else
					{
					LedStatus |= CAPSLOCK_EN;
					} 
			break;
		case CODE_NUMLOCK:
			if(LedStatus & NUMLOCK_EN)
				{
				LedStatus &= NUMLOCK_DIS;
				}
			else
				{
				LedStatus |= NUMLOCK_EN;
				}
			break;
		case CODE_SCROLLLOCK:
			if(LedStatus & SCROLLLOCK_EN)
				{
				LedStatus &= SCROLLLOCK_DIS;
				}
			else
				{
					LedStatus |= SCROLLLOCK_EN;
				} 
			break;
			}
		
		Order(0xED); //設置Led
		
		//Order(LedStatus);
		//LedLock(LedStatus);
		} 
		}
		else //通碼
		{
		KeyCodeBuff[KeyCodeSum] = KeyCode;
		if(KeyCodeSum < MAXBUFFER) KeyCodeSum++;
		KeyMakeCodeFlag = 1;
		} 
	}
}
/*********************************************************/
//函數:KeyScan()
//功能:掃描鍵盤
//輸入:
//輸出:鍵值
//描述:
/*********************************************************/
/*
void KeyScan()
{
unsigned char KeyCode;
KeyCode = ReadPS2();
if(KeyCode == CODE_BREAK)
{

KeyFlag = 1;
}
else
{
KeyCodeBuff[KeyCodeSum] = KeyCode;
KeyCodeSum++;
}
}
*/
/*********************************************************/
//函數:ReadPS2()
//功能:掃描鍵盤
//輸入:
//輸出:鍵值
//描述:
/*********************************************************/\

unsigned char ReadPS2()
{
unsigned char KeyCode; //鍵盤鍵值
unsigned char bitCount; //位數
while(scl); // 等待鍵盤把時鐘第一次拉低

for(bitCount = 8; bitCount != 0; bitCount --) // 把起始位算入
{
WAITFORKEYBOARDPULSE; // 等待一個有效的下跳沿
KeyCode >>= 1; // 按照PS2格式,數據低位在前
scl = 1;
sda = 1;
if(sda == 1)
{
KeyCode |= 0x80; // 得到有效的數據位
}
}
WAITFORKEYBOARDPULSE; // 等待按鍵發送效驗位
WAITFORKEYBOARDPULSE; // 等待按鍵發送終止位
while(!scl); // 等待鍵盤把時鐘線拉高
if(KeyCode == CODE_POST)
KeyBoardConnectFlag = 1;
return(KeyCode); // 返回按鍵掃描
}

/*********************************************************/
//函數:Order()
//功能:向鍵盤發送命令
//輸入:命令
//輸出:?
//描述:
/*********************************************************/
void Order(unsigned char orderByte)
{
unsigned char cnt;
unsigned char check;

//DINT; //關閉總中斷,發送命令到鍵盤

scl = 0;
sda = 1;
for(cnt = 0xff; cnt != 0; cnt --); // 拉低時鐘與數據并延時

sda = 0;
scl = 1;
for(cnt = 8; cnt != 0; cnt --)
{ // 發送八位數據,循環八次

while(scl);
if(orderByte & 0x01)
{
sda = 1; // 根據低位設定輸出數據
check ++; // 如果輸出一個1,效驗記錄數據加一
}
else
{
sda = 0;
}
orderByte >>= 1; // 命令字調整
while(!scl); // 輸出脈沖
}
while(scl);
if(check % 2)
{ // 如果輸出過偶數個脈沖
sda = 0; // 效驗數據位置1
}
else
{
sda = 1; // 否則數據位置0
}
while(!scl);
while(scl);
sda = 1;
while(!scl); // 發送終止位
sda = 1;
scl = 1;
while((scl) | (sda)); // 等待ACK握手信號
while(!scl); //等待scl變高
//EINT; //開總中斷
}
/*********************************************************/
//函數:void LedLock()
//功能:三個鍵盤的控制
//輸入:三個鍵盤燈的控制
//輸出:三個燈的狀態
//描述:
/*********************************************************/
void LedLock(unsigned char LedLock)
{
Order(0xED); //控制命令字
Order(LedLock);
}
/*********************************************************/
//函數:KickDog()
//功能:喂狗
//輸入:
//輸出:?
//描述:
/*********************************************************/
void KickDog()
{


}
/*********************************************************/
//函數elay()
//功能:延時
//輸入:延時時間設定值
//輸出:?
//描述:
/*********************************************************/
void Delay(unsigned char Times)
{
unsigned char n;
n = 120;
for(;Times>0;Times--)
{
for(;n>0;n--)
;
}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲自拍与偷拍| 亚洲欧美乱综合| 中文字幕精品一区二区精品绿巨人| 成人免费小视频| 蜜臀精品久久久久久蜜臀| 91在线看国产| 精品久久久久久久人人人人传媒| 亚洲欧美偷拍卡通变态| 国产一区二区毛片| 欧美二区三区的天堂| 亚洲丝袜制服诱惑| 成人蜜臀av电影| 久久你懂得1024| 麻豆国产精品一区二区三区 | 一区二区三区在线影院| 国产成人免费在线观看| 精品少妇一区二区三区在线视频 | 色网站国产精品| 国产精品久久一级| 国产精品一二三四五| 欧美成人午夜电影| 日韩电影在线观看电影| 精品国产一区二区三区不卡| 亚洲欧洲日韩综合一区二区| 激情综合一区二区三区| 欧美顶级少妇做爰| 午夜av一区二区三区| 色一情一乱一乱一91av| 国产农村妇女毛片精品久久麻豆| 另类专区欧美蜜桃臀第一页| 欧美一卡在线观看| 日本免费在线视频不卡一不卡二| 欧美精品日韩精品| 午夜伦理一区二区| 欧美一区二区三区精品| 欧美aaaaaa午夜精品| 日韩精品中文字幕在线不卡尤物| 日本成人超碰在线观看| 日韩欧美一级在线播放| 久久av资源网| 国产亚洲精久久久久久| 成人国产精品视频| 亚洲欧美福利一区二区| 欧美影院午夜播放| 五月天激情综合| 久久久亚洲精品石原莉奈| 国产精品一二三四区| 国产精品乱码人人做人人爱| 99re66热这里只有精品3直播 | 亚洲.国产.中文慕字在线| 欧美三级电影网站| 日本伊人精品一区二区三区观看方式| 正在播放亚洲一区| 国产在线播放一区三区四| 国产精品嫩草99a| 91网站视频在线观看| 亚洲一区二区三区影院| 欧美精品一级二级| 国产精品综合一区二区三区| 丝袜亚洲另类欧美| 亚洲国产中文字幕在线视频综合| 欧美亚洲日本一区| 日本欧美在线观看| 久久久久久久久久久99999| av一区二区三区黑人| 亚洲国产视频直播| 欧美电影免费观看完整版| 国产美女视频一区| 亚洲男人天堂av| 日韩午夜电影在线观看| 成人午夜碰碰视频| 亚洲午夜久久久久久久久电影网| 欧美成人精品福利| 99国产欧美另类久久久精品| 亚洲黄色在线视频| 欧美不卡视频一区| 色一区在线观看| 国产精品综合网| 亚洲v日本v欧美v久久精品| 国产亲近乱来精品视频| 精品视频一区二区三区免费| 狠狠网亚洲精品| 亚洲色图欧美激情| 美女诱惑一区二区| 国产精品看片你懂得| 日韩写真欧美这视频| 91视频www| 成人亚洲一区二区一| 久久精品国产99国产精品| 一区二区三区国产精品| 欧美国产亚洲另类动漫| 日韩欧美一区二区免费| 欧美视频三区在线播放| 99久久亚洲一区二区三区青草| 久久99久久99小草精品免视看| 亚洲欧洲制服丝袜| 国产精品久久二区二区| 国产三级精品在线| 精品sm在线观看| 日韩精品一区二区三区视频在线观看 | 精品区一区二区| 欧美日韩国产bt| 欧美影院精品一区| 色老头久久综合| 色综合久久久久久久| 成年人午夜久久久| 不卡高清视频专区| 成人午夜短视频| 丁香激情综合五月| 99精品视频免费在线观看| 大陆成人av片| 99久久精品免费看| www.日韩精品| 99re这里只有精品6| 91一区二区三区在线播放| 91免费视频观看| 在线精品亚洲一区二区不卡| 欧美影片第一页| 欧美一区二区三区播放老司机| 欧美精品一级二级| 日韩视频一区二区在线观看| 日韩欧美色综合| 精品国产乱码久久久久久免费| 精品国产自在久精品国产| 久久综合狠狠综合久久激情 | 国产二区国产一区在线观看| 成人性生交大片免费看中文| 成人毛片在线观看| 色噜噜狠狠色综合中国| 欧美日韩综合在线免费观看| 欧美一区二区三区在线电影| 日韩精品一区二区三区老鸭窝| 久久综合色婷婷| 亚洲欧美怡红院| 五月天激情综合| 国产精品亚洲第一| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 欧美视频一区二区三区四区| 91精品国产综合久久精品| 久久一区二区三区四区| 欧美成人女星排行榜| 亚洲女同ⅹxx女同tv| 亚洲一级二级三级在线免费观看| 亚洲激情中文1区| 亚洲一区二区免费视频| 全国精品久久少妇| 国产资源在线一区| 9久草视频在线视频精品| 欧美性大战久久| 久久综合久久鬼色| 亚洲免费观看视频| 爽好久久久欧美精品| 国精品**一区二区三区在线蜜桃| 粉嫩久久99精品久久久久久夜| 在线观看视频一区二区欧美日韩| 欧美一级在线视频| 国产精品久久久久永久免费观看| 亚洲一区二区欧美激情| 国产精品综合二区| 91久久精品一区二区三| 日韩精品一区二区三区视频播放| 亚洲欧洲美洲综合色网| 美洲天堂一区二卡三卡四卡视频 | 亚洲欧美偷拍三级| 久久国产精品免费| 曰韩精品一区二区| 美女www一区二区| 成人ar影院免费观看视频| 欧美精选一区二区| 中文字幕一区二区三区乱码在线| 青青草97国产精品免费观看| av高清不卡在线| 日韩一区二区三区四区| 夜夜嗨av一区二区三区网页| 国产成人亚洲综合a∨婷婷 | 成人高清免费观看| 欧美r级在线观看| 亚洲v中文字幕| 色综合久久久久网| 国产精品久久久久久久久免费相片 | 国精产品一区一区三区mba桃花 | 99国产精品久久久久久久久久 | 国产精品久久久久久久久搜平片| 日本欧美一区二区三区| 欧美一区二区三区播放老司机| 欧美精品一区男女天堂| 亚洲第一福利一区| 日本韩国精品一区二区在线观看| 欧美国产日韩亚洲一区| 国产自产v一区二区三区c| 欧美一区二区在线视频| 亚洲成人精品一区| 在线亚洲+欧美+日本专区| 一区免费观看视频| 成人一级黄色片| 亚洲欧洲国产专区| 91啪亚洲精品| 国产精品久久福利| 91亚洲精品一区二区乱码| 中文字幕日韩一区二区|