📄 pckeydrive.c
字号:
/*
DIN: PS/2
1 - CLOCK 1 - DATA
2 - DATA 2 - nc
3 - nc 3 - GND
4 - GND 4 - +5V
5 - +5V 5 - CLOCK
6 - nc
nc = not connected
Pins:
|_|
1 3 5 || 6
4 5 3 4
2 1 2
*/
#include "..\INC\config.h"
unsigned char PcByteCount; //用于接收每个字节的中断次数
unsigned char PcByteOk; //正确读取一个数据
unsigned char PckeyCode;
unsigned char PckeyPar; //存校验位
unsigned char xdata Pcodetemp[100];
unsigned char pccount;
unsigned char pcsub;
#define PCKEYERR 0
#define PCKEYOK 1
//读出一个字节
unsigned char readtemp(unsigned char *rpt)
{
if(pcsub == pccount)return 0;
*rpt = Pcodetemp[pcsub];
pcsub++;
if(pcsub>99)pcsub=0;
return 1;
}
//加一个字节
void insbytstemp(unsigned char prt)
{
if((pccount+1) == pcsub) return;
Pcodetemp[pccount] = prt;
pccount++;
if(pccount>99)pccount=0;
}
/*
//PC键盘延时函数
void Pckeydelayus(unsigned int pcd)
{
unsigned int i = pcd;
while(i--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
//时钟高电平超时判断 <1ms
unsigned char PcKey_Clk_Hei_Over()
{
unsigned int i = 1000;
while(i--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
if(!PClk)return PCKEYOK;
}
return PCKEYERR;
}
//时钟低电平超时判断 <1ms 未超时返回1 超时返回0
unsigned char PcKey_Clk_Low_Over()
{
unsigned int i = 1000;
while(i--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
if(PClk)return PCKEYOK;
}
return PCKEYERR;
}
*/
//初始化PcKey IO初始化
void PcKeyReadIOInit()
{
//Pdat
PSD_reg.DIRECTION_B.bits.bit7 = 1; //位为0为输入,为1输出
PSD_reg.DATAOUT_B.bits.bit7 = 1;
//Pclk
PSD_reg.DIRECTION_B.bits.bit1 = 1; //位为0为输入,为1输出
PSD_reg.DATAOUT_B.bits.bit1 = 1;
//Pdat
PSD_reg.DIRECTION_B.bits.bit7 = 0; //位为0为输入,为1输出
PSD_reg.DATAIN_B.bits.bit7 = 0;
//Pclk
PSD_reg.DIRECTION_B.bits.bit1 = 0; //位为0为输入,为1输出
PSD_reg.DATAIN_B.bits.bit1 = 0;
P3_3 = 1;
PcKeyInitVar();
IT1 = 1; //INT1下降沿有效
EX1 = 1; //开INT1中断;
PX1 = 1;
}
//初始化PCKEY的相关变量
void PcKeyInitVar()
{
PcByteCount = 0;
PcByteOk = 0;
pccount = 0;
pcsub = 0;
}
/************************************************************************/
/* 从键盘读取一个字节 */
/* 正确返回1,错误返回0,且不改变指针内容 */
/***********************************************************************
unsigned char HostReadPcKeyChar(unsigned char *Hpc)
{
unsigned char i=0; //
unsigned char par = 0; //校验位
unsigned char hrtemp = 0;
PcKeyReadIOInit();
if(!PcKey_Clk_Hei_Over()) return PCKEYERR; //如果在1ms内Clk一直处于高电平,说明没有数据要发送到主机
if(!PcKey_Clk_Low_Over()) return PCKEYERR;
for(i=0;i<9;i++)
{
if(!PcKey_Clk_Hei_Over()) return PCKEYERR;//等待低电平
if(i < 8)
{
hrtemp >>= 1;
if(PDat == 0x01)
hrtemp |= 0x80;
}
else
{
if(PDat == 0x01)
{
par = 0x01;
}
else
{
par = 0x00;
}
}
if(!PcKey_Clk_Low_Over()) return PCKEYERR;
}
ACC = hrtemp;
if(P == 0 && par ==1)
{
*Hpc = hrtemp;
return PCKEYOK;
}
if(P == 1 && par ==0)
{
*Hpc = hrtemp;
return PCKEYOK;
}
return PCKEYERR;
}
*/
unsigned char SeachrCode(unsigned char *pcode)
{
unsigned char i=0;
//先找noshift
for(i=0;i<80;i++)
{
if((*pcode) == noshift[i][0])
{
*pcode = noshift[i][1];
return PCKEYOK;
}
}
//先找addshift
for(i=0;i<47;i++)
{
if((*pcode) == addshift[i][0])
{
*pcode = noshift[i][1];
return PCKEYOK;
}
}
return PCKEYERR;
}
void ISR_INT1() interrupt 2
{
if( ReadPCKey(&PckeyCode))
{
insbytstemp(PckeyCode);
}
}
void PckeyFun()
{
unsigned char xt = 0;
if(readtemp(&xt))
{
//查找相应的代码
// if(xt == 0xE0) return;
// if(xt == 0xF0)
// {
// readtemp(&xt);
// }
// else
{
// if(SeachrCode(&xt))
{
PrintChCom2(xt);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -