📄 keyboard.c
字号:
/******************************************/
/* 广州天河双龙电子公司 */
/* http://www.sl.com.cn */
/* PS2键盘驱动程序 */
/* 作者:ntzwq@wx88.net */
/* 2002年5月11日 */
/* 目标MCU:MEGA8 晶振:外部(EXT) 8MHZ */
/******************************************/
/******************************************/
/* 经过改动移植到51芯片上 */
/* 改动者:jifeng */
/******************************************/
#include <REG52.h>
#include "scancodes.h"
#define BUFF_SIZE 64
unsigned char bitcount;
unsigned char xdata kb_buffer[BUFF_SIZE];
unsigned char input=0;
unsigned char output=0;
sbit PINDATA= P1^0; //连接数据线
unsigned char Temp_Key;
//使用软件模拟FIFO
void put_kbbuff(unsigned char c)
{
kb_buffer[input]=c;
if (input<(BUFF_SIZE-1))
input++;
else
input=0;
}
//从缓冲区读取键值
unsigned char getchar(void)
{
unsigned char temp;
if(output==input)
return 0;
else
{
temp=kb_buffer[output];
if(output<(BUFF_SIZE-1))
{
output++;
}
else
output=0;
return temp;
}
}
//初始化
void init_kb(void)
{
IT1 = 1;//下降延触发
EX1 = 1;
PX1 = 0;
EA=1;
bitcount = 11;
}
//键值分析
void decode(unsigned char sc)
{
static unsigned char shift,shiftup,alt,altup,up;
unsigned char i;
if (sc==0xf0)
{
up=1;
return;
}
if (up==1)
{
up=0;
if ((sc==0x12)||(sc==0x59)) shift=0;
if (sc==0x11) alt=0;
return;
}
switch (sc)
{
case 0x11:
{ alt=1;
altup=1;
}break;
case 0x12:{
if((Temp_Key==0xe0)||(Temp_Key==0xf0)) //按键PRINT出现的特殊情况
{ put_kbbuff(27);
}
else
{ shift=1;
shiftup=1;
}
}break;
case 0x59:{
shift=1;
shiftup=1;
}
break;
default:{
if ((shift==0)&&(alt==0))
{
for(i = 0;i<90; i++)
{ if (unshifted[i][0] == sc)
{ if(((Temp_Key==0xe0)||(Temp_Key==0xf0))&&(sc==0x7c)) {}
else
{ if(((Temp_Key==0xe0)||(Temp_Key==0xf0))&&(sc==0x71))
put_kbbuff(15);
else put_kbbuff(unshifted[i][1]);
}
i=90;
}
}
}
else if((shift==1)&&(alt==0)) //使用SHIFT+字母的方式,输入大写字母
{
for(i = 0;shifted[i][0]!=sc && shifted[i][0]; i++);
if (shifted[i][0] == sc)
{
put_kbbuff(shifted[i][1]);
}
}
else if((shift==0)&&(alt==1)) //使用ALT+字母的方式,用于焦点的跳转
{
for(i = 0;alted[i][0]!=sc && alted[i][0]; i++);
if (alted[i][0] == sc)
{
put_kbbuff(alted[i][1]);
}
}
}
}
}
//键盘信息接收,使用中断 ,连接时钟线
void Key_isr() interrupt 2
{
static unsigned char dat;
switch (bitcount)
{
case 11:{
//if ((PIN_KB&(1<<DATAPIN))!=0)
if (PINDATA!=0)
return;
else
bitcount--;
break;
}
case 2:{
bitcount--;
break;
}
case 1:{
bitcount--;
//if ((PIN_KB&(1<<DATAPIN))!=0)
if (PINDATA==0)
{
bitcount=11;
return;
}
else
{
bitcount=11;
decode(dat);
Temp_Key=dat;
}
break;
}
default:{
dat = (dat >> 1);
//if ((PIN_KB&(1<<DATAPIN))!=0)
if (PINDATA!=0)
dat|=0x80;
bitcount--;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -