📄 ps2_bin.c
字号:
//函数: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)//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
{ // KeyFlag = 1;
KeyExtendFlag = 1;
KeyCodeSum=0x00;
KeyCodeBuff[KeyCodeSum] = KeyCode;
KeyCodeSum+=1;
}
break;
case CODE_PAUSE: //键盘发送的是Pause键的键码
KeyPauseFlag = 1;
//KeyFlag = 1;
KeyCodeSum=0x00;
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++;
}
KeyCodeBuff[KeyCodeSum] = KeyCode;
KeyUpFlag = 0;
KeyMakeCodeFlag = 0;
KeyPauseFlag = 0;
break;
}
case CODE_CAPSLOCK:
//KeyFlag = 1;//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// KeyCodeSum=0x00;
KeyCodeBuff[KeyCodeSum] = KeyCode;
if(KeyCodeSum < MAXBUFFER) KeyCodeSum++;
break;
case CODE_SCROLLLOCK: //发送的是三个LED控制键通码
// KeyFlag = 1;//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
KeyLedLockFlag = 1;
//KeyCodeSum=0x00;
KeyCodeBuff[KeyCodeSum] = KeyCode;
if(KeyCodeSum < MAXBUFFER) KeyCodeSum++;
break;
*/
default: //键盘发送的是通码
if(KeyUpFlag ==1)//KeyUpFlag ==
{ //发送的是断码之后的通码
KeyFlag = 1; //有正常键被按下
KeyUpFlag = 0; //键弹起标志
KeyMakeCodeFlag = 0; //键通码标志
KeyExtendFlag = 0;
if(KeyCode==0x12)KeyCodeBuff[0x03]= 0x00; //断码之后的通码为0X12说明按键码全部接收完毕/
else
{
// KeyCodeBuff[0x02]= 0x00; //断码之后的通码不为0X12就是普通扩展键清无用的字节
}
KeyCodeSum=0x00;
/*
if(KeyPauseFlag == 1) //Pause键被按下发送的键码是(E1+F0+14)
{
KeyPauseFlag = 0;
KeyCodeBuff[KeyCodeSum] = KeyCode;
if(KeyCodeSum < MAXBUFFER) KeyCodeSum++;
else
{
KeyCodeSum=0x00;//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
}
break;
}
if(KeyExtendFlag == 1)
{
if((KeyCodeSum > 0x02))
{
KeyCodeSum=0x00;//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
KeyExtendFlag = 0;
}
else
{
//KeyCodeSum+=1;
KeyCodeBuff[KeyCodeSum] = KeyCode;
KeyCodeSum++;
}
}
/*
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;
}
// KeyCodeBuff[KeyCodeSum] = KeyCode;
break;
}
Order(0xED); //设置Led
//Order(LedStatus);
//LedLock(LedStatus);
} */
}
else //通码
{
// KeyCodeSum=0x00;
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()
//功能:喂狗
//输入:
//输出:?
//描述:
/*********************************************************/
/*********************************************************/
//函数:Delay()
//功能:延时
//输入:延时时间设定值
//输出:?
//描述:
/*********************************************************/
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 + -