?? ps-2keyboard.c
字號:
/********************************************************************************************************
原理:每次按鍵,鍵盤會向單片機發脈沖使單片機發生外部中斷,數據有p3.4口一位位傳進來
接口:鍵盤時鐘接在p3.2口,即8051的外部中斷int1上,鍵盤數據接到p3.4上,外部中斷使用邊沿觸發方式
鍵盤返回數據格式:1位開始位(0),8位數據位(所按按鍵的通碼,用來識別按鍵),1位校驗位(奇校驗)
*********************************************************************************************************/
#include "ScanCode.h" //按鍵通碼與ascii對照表
#include "ps2KEYBOARD.h"
#include "lcdapi.h"
#include "3310.h"
uchar InIndex=0,OutIndex=0;
uchar KeyBuff[BUFF_SIZE];
/*功能:通過外部中斷1讀取鍵盤發送回來的數據位
*性質:中斷調用
*參數:無
*返回:無
*/
void KeyBoardISR() interrupt 2 //外部中斷1 用來接受鍵盤發來的數據
{
static uchar BitCount=11,KeyData;
if(BitCount<11 && BitCount>2)
{
KeyData>>=1;
if(KeyBoardSda)
KeyData|=0x80;
}
if(--BitCount==0)
{
BitCount=11;
KeyBuff[InIndex]=KeyData;
if(++InIndex==BUFF_SIZE)
InIndex=0;
KeyData=0;
}
}
/*功能:通過串口或其它方式顯示鍵盤值(自定義)
*性質:外部調用
*參數:鍵盤按鍵值
*返回:無
*/
void Send(uchar d)
{
static uchar i,j;
if(i!=80)
{
DispAsc(i,2,&d);
i+=8;
}
else if(i==80)
{
DispAsc(j,4,&d);
j+=8;
if(j==80)
{
i=0;
j=0;
LCD_Clr2();
DispString(16,0,"零距離");
}
}
}
/*功能:通過中斷程序的數據位從數組中取出鍵值
*性質:外部調用
*參數:無
*返回:無
*/
void KeyBoardDecode(void)
{
static bit ShiftFlg,CapsFlg,NumFlg,BreakFlg,ExtendFlg;
uchar ArrayIndex;
uchar ScanCode;
while(InIndex != OutIndex)
{
if(!BreakFlg)
{
switch(KeyBuff[OutIndex])
{
case 0x12: //左SHIFT
case 0x59:
ShiftFlg = 1; //右SHIFT
break;
case 0x58:
if(CapsFlg) //Caps
{
CapsFlg = 0;
}
else if(!CapsFlg)
{
CapsFlg = 1;
}
break;
case 0x77:
if(NumFlg) //切換Num
{
NumFlg = 0;
}
else if(!NumFlg)
{
NumFlg = 1;
}
break;
case 0xe0 :
if(!ExtendFlg)
{
ExtendFlg = 1;
}
else if(ExtendFlg)
{
ExtendFlg = 0;
}
break;
case 0xf0 :
BreakFlg = 1;
break;
default:
if(ShiftFlg)
{
for(ArrayIndex = 0;shifted[ArrayIndex][0] != 0 ;ArrayIndex++)
{
if(KeyBuff[OutIndex] == shifted[ArrayIndex][0])
{
ScanCode = shifted[ArrayIndex][1];
Send(ScanCode);
break;
}
}
}
else if(CapsFlg)
{
for(ArrayIndex = 0;unshifted[ArrayIndex][0] != 0 ;ArrayIndex++)
{
if(KeyBuff[OutIndex] == unshifted[ArrayIndex][0])
{
ScanCode = unshifted[ArrayIndex][1];
if((ScanCode >= 'a')&&(ScanCode <= 'z'))
{
ScanCode -= 0x20;
}
Send(ScanCode);
break;
}
}
}
else if(!ShiftFlg)
{
for(ArrayIndex = 0;unshifted[ArrayIndex][0] != 0;ArrayIndex++)
{
if(KeyBuff[OutIndex] == unshifted[ArrayIndex][0])
{
ScanCode = unshifted[ArrayIndex][1];
Send(ScanCode);
break;
}
}
}
}
}
else
{
BreakFlg = 0; //break code received
switch(KeyBuff[OutIndex])
{
case 0x12 : //lshft
case 0x59 : ShiftFlg = 0; //rshft
break;
}
}
OutIndex ++;
if(OutIndex == BUFF_SIZE) OutIndex =0; //循環 outpointer
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -