📄 ps2.bak
字号:
#include <reg51.h>
#include "PS2.H"
BYTE PS2RecChar=0xCC;
BOOL KeyBoardFlag=FASLE;
void OnKeyBoardOnline(BOOL i)
{
KeyBoardFlag=i;
}
//---------------------------------------------------------------------------
void OnPS2ReceiveChar(BYTE ReceChar,BOOL P)
{
BOOL ParityBit=0;
ACC=ReceChar;
CY=P;
ParityBit=(BOOL)(CY?0x00:0x80);//奇校验位
if(P==ParityBit);
PS2RecChar=ReceChar;
}
//---------------------------------------------------------------------------
void OnPS2SendChar(BYTE dat)
{
BOOL ParityBit;
BYTE i;
ACC=dat;
CY=P;
ParityBit=(BOOL)(CY?0x00:0x80);//奇校验位
CLSSIGNAL();
CT_KB=OFF;
EX0=0;
H_DATA=0;Delay10us();//start bit
H_CLK=1;
Delay10us();
H_CLK=0;
Delay30us();
for(i=0;i<8;i++)
{
if(dat&0x01==0x01){H_DATA=1;Delay10us();}
else {H_DATA=0;Delay10us();}
dat>>=1;
H_CLK=1;
Delay10us();
H_CLK=0;
Delay30us();
}
H_DATA=ParityBit;Delay10us();//parity bit
H_CLK=1;
Delay10us();
H_CLK=0;
Delay30us();
H_DATA=1;Delay10us();//stop bit
H_CLK=1;
Delay10us();
H_CLK=0;
Delay30us();
IE0=0;
EX0=1;
H_CLK=1;
H_DATA=1;
CT_KB=ON;
Delay30us();
}
//---------------------------------------------------------------------------
void ExternInterrupt0(void) interrupt 0
{
BOOL ParityBit=0,CLKFlag=1;
BYTE i=0,j=8,dat=0x00;
EX0=0;
while(CLKFlag)
{
i++;
if(H_CLK==1)CLKFlag=0;
if(i>0xEE)
{
IE0=0;
EX0=1;
return ;
}
}
while(j--)//延时等待大键盘的动作
{
for(i=0;i<0x88;i++)//检查是否有数据处理 0x88
{
if(H_CLK==0)//有动作则是大键盘存在
{
OnKeyBoardOnline(TRUE);//大键盘存在,开机由大键盘应答
IE0=0;
EX0=1;
return ;//存在的话置标志位,并返回
}
}
}
OnKeyBoardOnline(FALSE);//大键盘不存在,由小键盘应答
//转到接收
for(i=0;i<8;i++)//read 8bit
{
Delay30us();
H_CLK=0;
Delay30us();
H_CLK=1;
dat=dat>>1;
if(H_DATA)dat|=0x80;
if(H_CLK==0){ return; }//如果时钟被拉低,则有错误发生
}
Delay30us();
H_CLK=0;
Delay30us();
H_CLK=1;
if(H_DATA)ParityBit=1;
else ParityBit=0;
Delay30us();
H_CLK=0;
Delay30us();
H_CLK=1;//STOP BIT H_DATA 0 ERR
Delay10us();
H_DATA=0; //ACK bit
Delay10us();
H_CLK=0;
Delay30us();Delay30us();
H_CLK=1;
Delay30us();
H_DATA=1;
OnPS2ReceiveChar(dat,ParityBit);
IE0=0;
EX0=1;
return ;
}
//---------------------------------------------------------------------------
void ProcessPS2(void)
{
if(KeyBoardFlag==FALSE)//大键盘不存在
{
if(PS2RecChar==0xF3)//1
{
OnPS2SendChar(0xFA);
PS2RecChar=0xCC;
}
else if(PS2RecChar==0x00)//11
{
OnPS2SendChar(0xFA);
PS2RecChar=0xCC;
}
else if(PS2RecChar==0x02)//111
{
OnPS2SendChar(0xFA);
PS2RecChar=0xCC;
}
else if(PS2RecChar==0x20)//1111
{
OnPS2SendChar(0xFA);
PS2RecChar=0xCC;
}
else if(PS2RecChar==0xED)//2
{
OnPS2SendChar(0xFA);
PS2RecChar=0xCC;
}
else if(PS2RecChar==0xF0)//3
{
OnPS2SendChar(0xFA);
PS2RecChar=0xCC;
}
else if(PS2RecChar==0xF2)//4
{
OnPS2SendChar(0xFA);
Delay30us();
OnPS2SendChar(0xAB);
Delay30us();
OnPS2SendChar(0x83);
PS2RecChar=0xCC;
}
else if(PS2RecChar==0xEF)//5
{
OnPS2SendChar(0xFA);
Delay30us();
OnPS2SendChar(0xBF);
Delay30us();
OnPS2SendChar(0xB0);
PS2RecChar=0xCC;
}
else if(PS2RecChar==0xF3)//6
{
OnPS2SendChar(0xFA);
PS2RecChar=0xCC;
}
else if(PS2RecChar==0xFE)//7 //resend
{
PS2RecChar=0xCC;
}
else if(PS2RecChar==0xEE)//8
{
OnPS2SendChar(0xEE);
PS2RecChar=0xCC;
}
else if(PS2RecChar==0xEE)//9
{
OnPS2SendChar(0xEE);
PS2RecChar=0xCC;
}
else if(PS2RecChar==0xF1)//10
{
OnPS2SendChar(0xFA);
PS2RecChar=0xCC;
}
else if(PS2RecChar==0xF4)//11
{
OnPS2SendChar(0xFA);
PS2RecChar=0xCC;
}
else if(PS2RecChar==0xAA)//12
{
OnPS2SendChar(0xAA);
PS2RecChar=0xCC;
}
else if(PS2RecChar==0xFF)//13
{
OnPS2SendChar(0xFA);
Delay30us();
OnPS2SendChar(0xAA);
Delay30us();
PS2RecChar=0xCC;
}
else ;
}
}
//---------------------------------------------------------------------------
void PS2Init(void)
{
IT0=0; //低电平触发中断
PX0=1;
EX0=1;
}
//---------------------------------------------------------------------------
/*
//用法-以下文件在main.c--------------------------------------------------------------------------
//把PS2.C Delay.asm加入工程
extern void ProcessPS2(void);
extern void PS2Init(void)
void main(void)
{
//晶振为18.432 其他的频率需要修改延时程序
//往PC上发按键使用OnPS2SendChar();
//OnPS2SendChar(0x15);//Q//发送通码
//OnPS2SendChar(0xF0);
//OnPS2SendChar(0x15);//Q//发送断码
PS2Init();
while(1)
{
ProcessPS2();//开机应答,使电脑能识别到键盘
//other code
}
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -