📄 key_ps2.c
字号:
/*****************************************************************************/
//hanshu.c
//功能:向Host's PS/2口发送键盘信息;并通过UART发送
//修改:
//时间:2007-6-8
/*****************************************************************************/
#include <regx52.h>
#include "pr/twj.h"
BYTE f=0;
bit falg_key=0;
unsigned char code table[17]={0x45,0x16,0x1E,0x26,0x25, //0~4
0x2E,0x36,0x3D,0x3E,0x46, //5~9
0x49,0x05,0x76,0x04,0x29,0x66}; //A~F
/*********************************************************/
//函数:keyscan()
//功能:扫描键盘
//输入:
//输出:键盘值
//描述:
/*********************************************************/
unsigned char keyscan(void)
{
BYTE i, hang,lei,key_vale;
KEY=0XF0;
if(KEY!=0xf0)
{
delayx(60);
if(KEY!=0xf0)
{
falg_key=1;
hang=KEY;
hang=~(hang&0xf0);
hang&=0xf0;
KEY=0X0F;
lei=KEY;
lei=~(lei&0x0f);
lei&=0x0f;
key_vale=(hang+lei);
switch(key_vale)
{
case 0x11 : i=0;break;
case 0x21 : i=1;break;
case 0x41 : i=2;break;
case 0x81 : i=3;break;
case 0x12 : i=4;break;
case 0x22 : i=5;break;
case 0x42 : i=6;break;
case 0x82 : i=7;break;
case 0x14 : i=8;break;
case 0x24 : i=9;break;
case 0x44 : i=10;break;
case 0x84 : i=11;break;
case 0x18 : i=12;break;
case 0x28 : i=13;break;
case 0x48 : i=14;break;
case 0x88 : i=15;break;
default : i=0xaa; break;
}
SBUF= i;
while(!TI);
TI=0;
while(KEY!=0X0F);
delayx(160);
/*SBUF=0X0D;
while(!TI);
TI=0;
SBUF=0X0A;
while(!TI);
TI=0; */
}
return table[i];
}
}
/*********************************************************/
//函数:key_send()
//功能:发送键盘通码值
//输入:键盘值
//输出:
//描述:
/*********************************************************/
void key_send(BYTE m)
{
BYTE i=8,temp,buffer;
bit flag_check=1;
temp=m;
for(i=0;i<8;i++)
{
buffer=(temp&0x01);
if(buffer) flag_check=!flag_check;
temp>>=0x1;
}
SDA0;//起始位
delay ( );
SCLK0;
delay ( );
do{
SCLK1;//从时钟脉冲的上升沿到一个数据转变的时间至少要有5 微秒
delay();
if((m&0x1)==0x1)//数据变化到时钟脉冲的下降沿的时间至少要有5 微秒并且不大于25 微秒
SDA1;
else
SDA0;
delay();
SCLK0;
m=m>>1;
delay();
i--;
}while(i);
SCLK1;
delay();
DATA=flag_check;
delay();
SCLK0;
delay();
SCLK1;
delay ( );
SDA1; //STOP BIT
delay ( );
SCLK0;
delayx(6);
SCLK1;
}
/*********************************************************/
//函数:key_break()
//功能:发送键盘断码值
//输入:键盘值
//输出:
//描述:
/*********************************************************/
void key_break(m)
{
BYTE i=8,temp,buffer;
bit flag_check=1;
temp=m;
/* */
for(i=0;i<8;i++)
{
buffer=(temp&0x01);
if(buffer) flag_check=!flag_check;
temp>>=0x1;
}
temp=0xf0;
do{
SCLK1;
delay();
if((temp&0x1)==0x1)
SDA1;
else
SDA0;
delay();
SCLK0;
temp=temp>>1;
delay();
i--;
}while(i);
SCLK1;
delay();
SDA1; //校验位
delay();
SCLK0;
delay();
SCLK1;
delay();
SDA1;
delay();
SCLK0;
delay();
delay();
delay();
SCLK1;
delayx(200);
delayx(200);
SDA0;//起始位
delay ( );
SCLK0;
delay ( );
i=8;
do{
SCLK1;
delay();
if((m&0x1)==0x1)
SDA1;
else
SDA0;
delay();
SCLK0;
m=m>>1;
delay();
i--;
}while(i);
SCLK1;
delay();
DATA=flag_check;
delay();
SCLK0;
delay();
}
/*********************************************************/
//函数:scan_key()
//功能:主调函数,检查PS2以及键盘
//输入:
//输出:
//描述:
/*********************************************************/
void scan_key(void)
{
if(CLK==1&&DATA==1)
{
delayx(30);
if(CLK==1&& DATA==1)
{
unsigned char pp;
pp= keyscan();
if((falg_key==1)&&(pp!=0xaa))
{
ABH;//
KEY=0XFF;
key_send(pp);//
delayms(100);
key_send(0xf0);
delayms(5);
key_send(0xf0);
/*
if(CLK==1&&DATA==1)
{
SDA0;
delay ( );
SCLK0;
delay ( );
key_break(pp);
SCLK1;
delay ( );
SDA1; //STOP BIT
delay ( );
SCLK0;
delayx(6);
SCLK1;
delayx(160); delayx(160);
} */
falg_key=0;
ABL;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -