⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyboard.c

📁 一个用C语言编写的usb程序,测试可以运行,内附有原理图
💻 C
字号:
#include "keyboard.h"

void kbbufadd(unsigned char dat)
{
  unsigned char i;

  for (i=0;i<BUFLEN;i++)
  {
    if (kbbuf[i]==dat)
    {
      return;
    }
  }
  for (i=0;i<BUFLEN;i++)
  {
    if (kbbuf[i]==0)
    {
      kbbuf[i] = dat;
      break;
    }
  }
}

void kbbufdel(unsigned char dat)
{
  unsigned char i, c, c0 = 0, t;
  bit f = 0;

  for (i=0;i<BUFLEN;i++)
  {
    if (kbbuf[i] == dat)
    {
      t = i;
      kbbuf[i] = 0;
      f = 1;
    }
  }
  if (f == 0)
  {
    for (i=0;i<BUFLEN;i++)
    {
      kbbuf[i] = 0;
    }
  }
}

void kbReply(void)
{
  unsigned char i, j, t, mod;

  j = 2; mod = 0;
  for (i=0;i<6;i++)
  {
    ReplyBuffer[i+2] = 0;
    t = kbdecode(kbbuf[i]);
    if (t != 0)
    {
      s0 = 0;
      switch (t) {
      case 0xe0:
        s0b0 = 1;
        break;
      case 0xe1:
        s0b1 = 1;
        break;
      case 0xe2:
        s0b2 = 1;
        break;
      case 0xe3:
        s0b3 = 1;
        break;
      case 0xe4:
        s0b4 = 1;
        break;
      case 0xe5:
        s0b5 = 1;
        break;
      case 0xe6:
        s0b6 = 1;
        break;
      case 0xe7:
        s0b7 = 1;
        break;
      default:
        ;
      }
      if (s0 == 0) ReplyBuffer[j++] = t;
      mod |= s0;
    }
  }

  ReplyCount = 8;
  ReplyBuffer[0] = mod;
  ReplyBuffer[1] = 0;
}

void kbScan(void)
{
  bit p;
  p = ps2read();
  while (ps2test(p) == 0)
  {
    ps2write(0xfe);
    p = ps2read();
  }
  Output(PS2_BYTE);
  
  if (PS2_Ready == 1)
  {
    if (PS2_BYTE != 0xf0)
    {
      kbbufadd(PS2_BYTE);
    }
    else
    {
      do {
        p = ps2read();
        while (ps2test(p) == 0)
        {
          ps2write(0xfe);
          p = ps2read();
        }
        Output(PS2_BYTE);
      } while (PS2_Ready == 0);
  
      kbbufdel(PS2_BYTE);
    }
    kbReply();	//write keyboard buffer to reply buffer
//    IsListening = 0;
    d12comm(0x03);
    SendReplyBuffer();
  }
}

unsigned char kbdecode(unsigned char dat)
{
  unsigned char usage;

  switch (dat) {
  case 0x1c:
    usage = 0x04;
    break;
  case 0x32:
    usage = 0x05;
    break;
  case 0x21:
    usage = 0x06;
    break;
  case 0x23:
    usage = 0x07;
    break;
  case 0x24:
    usage = 0x08;
    break;
  case 0x2b:
    usage = 0x09;
    break;
  case 0x34:
    usage = 0x0a;
    break;
  case 0x33:
    usage = 0x0b;
    break;
  case 0x43:
    usage = 0x0c;
    break;
  case 0x3b:
    usage = 0x0d;
    break;
  case 0x42:
    usage = 0x0e;
    break;
  case 0x4b:
    usage = 0x0f;
    break;
  case 0x3a:
    usage = 0x10;
    break;
  case 0x31:
    usage = 0x11;
    break;
  case 0x44:
    usage = 0x12;
    break;
  case 0x4d:
    usage = 0x13;
    break;
  case 0x15:
    usage = 0x14;
    break;
  case 0x2d:
    usage = 0x15;
    break;
  case 0x1b:
    usage = 0x16;
    break;
  case 0x2c:
    usage = 0x17;
    break;
  case 0x3c:
    usage = 0x18;
    break;
  case 0x2a:
    usage = 0x19;
    break;
  case 0x1d:
    usage = 0x1a;
    break;
  case 0x22:
    usage = 0x1b;
    break;
  case 0x35:
    usage = 0x1c;
    break;
  case 0x1a:
    usage = 0x1d;
    break;
  case 0x16:
    usage = 0x1e;
    break;
  case 0x1e:
    usage = 0x1f;
    break;
  case 0x26:
    usage = 0x20;
    break;
  case 0x25:
    usage = 0x21;
    break;
  case 0x2e:
    usage = 0x22;
    break;
  case 0x36:
    usage = 0x23;
    break;
  case 0x3d:
    usage = 0x24;
    break;
  case 0x3e:
    usage = 0x25;
    break;
  case 0x46:
    usage = 0x26;
    break;
  case 0x45:
    usage = 0x27;
    break;
  case 0x5a:
    usage = 0x28;
    break;
  case 0x76:
    usage = 0x29;
    break;
  case 0x66:
    usage = 0x2a;
    break;
  case 0x0d:
    usage = 0x2b;
    break;
  case 0x29:
    usage = 0x2c;
    break;
  case 0x4e:
    usage = 0x2d;
    break;
  case 0x55:
    usage = 0x2e;
    break;
  case 0x54:
    usage = 0x2f;
    break;
  case 0x5b:
    usage = 0x30;
    break;
  case 0x5d:
    usage = 0x31;
    break;
  case 0x4c:
    usage = 0x33;
    break;
  case 0x52:
    usage = 0x34;
    break;
  case 0x41:
    usage = 0x36;
    break;
  case 0x49:
    usage = 0x37;
    break;
  case 0x4a:
    usage = 0x38;
    break;
  case 0x58:
    usage = 0x39;
    break;
  case 0x05:
    usage = 0x3a;
    break;
  case 0x06:
    usage = 0x3b;
    break;
  case 0x04:
    usage = 0x3c;
    break;
  case 0x0c:
    usage = 0x3d;
    break;
  case 0x03:
    usage = 0x3e;
    break;
  case 0x0b:
    usage = 0x3f;
    break;
  case 0x83:
    usage = 0x40;
    break;
  case 0x0a:
    usage = 0x41;
    break;
  case 0x01:
    usage = 0x42;
    break;
  case 0x09:
    usage = 0x43;
    break;
  case 0x78:
    usage = 0x44;
    break;
  case 0x07:
    usage = 0x45;
    break;
//  case 0x57:	//PrintScreen
//    usage = 0x46;
//    break;
  case 0x7e:
    usage = 0x47;
    break;
//  case 0x62:	//Break
//    usage = 0x48;
//    break;
  case 0x70:
    usage = 0x49;
    break;
  case 0x6c:
    usage = 0x4a;
    break;
  case 0x7d:
    usage = 0x4b;
    break;
  case 0x71:
    usage = 0x4c;
    break;
  case 0x69:
    usage = 0x4d;
    break;
  case 0x7a:
    usage = 0x4e;
    break;
  case 0x74:
    usage = 0x4f;
    break;
  case 0x6b:
    usage = 0x50;
    break;
  case 0x72:
    usage = 0x51;
    break;
  case 0x75:
    usage = 0x52;
    break;
  case 0x77:
    usage = 0x53;
    break;
//  case 0x4a:
//    usage = 0x54;
//    break;
  case 0x7c:
    usage = 0x55;
    break;
  case 0x7b:
    usage = 0x56;
    break;
  case 0x79:
    usage = 0x57;
    break;
//  case 0x5a:	//Keypad ENTER
//    usage = 0x58;
//    break;
//  case 0x69:	//Keypad 1
//    usage = 0x59;
//    break;
//  case 0x72:	//Keypad 2
//    usage = 0x5a;
//    break;
//  case 0x7a:	//Keypad 3
//    usage = 0x5b;
//    break;
//  case 0x6b:
//    usage = 0x5c;
//    break;
//  case 0x73:
//    usage = 0x5d;
//    break;
//  case 0x74:
//    usage = 0x5e;
//    break;
//  case 0x6c:
//    usage = 0x5f;
//    break;
//  case 0x75:
//    usage = 0x60;
//    break;
//  case 0x7d:
//    usage = 0x61;
//    break;
//  case 0x70:
//    usage = 0x62;
//    break;
//  case 0x71:
//    usage = 0x63;
//    break;
  case 0x2f:
    usage = 0x76;
    break;
  case 0x14:
    usage = 0xe0;
    break;
  case 0x12:
    usage = 0xe1;
    break;
  case 0x11:
    usage = 0xe2;
    break;
  case 0x1f:
    usage = 0xe3;
    break;
//  case 0x14:	//Right Ctrl
//    usage = 0xe4;
//    break;
  case 0x59:
    usage = 0xe5;
    break;
//  case 0x11:	//Right ALT
//    usage = 0xe6;
//    break;
  case 0x27:
    usage = 0xe7;
    break;
  default:
    usage = 0;
  }
  return usage;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -