打印

DIY优盘与PC遥控接收器--PS2键盘直接“打字”程序

[复制链接]
3874|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xwj|  楼主 | 2008-11-6 19:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
// DIY优盘与PC遥控接收器--PS2键盘直接“打字”程序下载

//--------------------------------------------------------------------------//
//                                                                          //
//                    (c) Copyright 2008-2009 xuwenjun                     //
//                            All Rights Reserved                           //
//                                    V1.00                                 //
//--------------------------------------------------------------------------//
//标 题: xwj 的PS2键盘程序                                                 //
//文件名: atkey_xwj.c                                                       //
//版 本: V1.00                                                             //
//修改人: xwj                            E-mail:xuwenjun@21cn.com           //
//日 期: 08-11-06                                                          //
//描 述: xwj 的PS2键盘程序                                                 //
//声 明:                                                                   //
//        以下代码仅免费提供给学习用途,但引用或修改后必须在文件中声明出处. //
//        如用于商业用途请与作者联系.    E-mail:xuwenjun@21cn.com           //
//        有问题请mailto xuwenjun@21cn.com   欢迎与我交流!                  //
//--------------------------------------------------------------------------//
//老版本: 废弃                           老版本文件名:                      //
//创建人: xwj                            E-mail:xuwenjun@21cn.com           //
//日 期:                                                                   //
//--------------------------------------------------------------------------//
//描 述:                                                                   //
// xwj  的PS2键盘程序                                                       //
// MCU 型号: MCS51                                                          //
// 开发环境: Keil                                                           //
// 开发日期: 08-11-06                                                       //
// 程序编写: XWJ                                                            //
//--------------------------------------------------------------------------//
// 程序特点:                                                                //
//1、扫描码和输出字符双环形队列缓存                                         //
//2、可以直接输出按键对应的字符,直接实现“打字”效果                         //
//3、完美支持CapsLock、Shift大小写转换,支持键盘灯控制                      //
//--------------------------------------------------------------------------//
//PS:
//  呵呵,不好意思,之前给古道热肠的程序发错了;
//  而且,看了古道热肠的程序,才知道以前为什么发送命令给键盘老是失败:
//  原来是因为我没有拉低CLK线 100uS去抢占控制权。

//论坛交流就是好啊~~
//帮助别人的同时,自己也能发现问题、学到更多的东西!!!

#include <intrins.h>  
#include <reg52.h>  

#include "Scancodes1.h"

//#define KB_DEBUG 1
#ifdef KB_DEBUG
#include "CH452.h"
#endif

#define BAUD_9600       (65536-60)      // 9600波特串口的自加载值,晶振频率: 18.432MHz //
#define BAUD_19200      (65536-30)      // 19200波特串口的自加载值,晶振频率: 18.432MHz //
#define BAUD_38400      (65536-15)      // 38400波特串口的自加载值,晶振频率: 18.432MHz //
#define BAUD_57600      (65536-10)      // 57600波特串口的自加载值,晶振频率: 18.432MHz //

        //  通用PC机键盘方式  //
unsigned char bdata kb_state;
sbit    kb_caps     =   kb_state^2;
sbit    kb_num      =   kb_state^1;
sbit    kb_scroll   =   kb_state^0;

bit     kb_testok;
bit     kb_is_up;
bit     kb_shift;
bit     kb_sent;
bit     kb_ok;
bit     kb_is_E0;       //收到E0,//以E0开始的扫描码                 
bit     kb_is_E1;       //收到E1,//以E1开始的扫描码                 
bit     kb_KeyP;

unsigned char kb_Keydata;                   // 保持收到的扫描码
unsigned char kb_bitCount;              //待接收?位
#define kb_BUFF_SIZE 8                  //键盘缓冲区大小
unsigned char kb_ScanBuffer[kb_BUFF_SIZE];  //键盘扫描码缓冲区
unsigned char kb_Buffer[kb_BUFF_SIZE];  //键盘缓冲区
unsigned char kb_Scaninpt, kb_Scanoutpt;        //键盘扫描码缓冲区 入、出指针
unsigned char kb_inpt, kb_outpt;        //键盘缓冲区 入、出指针
unsigned char kb_BufCnt;                //键盘缓冲区内数据量

//  通用PC机键盘方式  //
sbit    PIN_KEY_CLK = P3^3;         //键盘时钟线接 P3^3
sbit    PIN_KEY_DAT = P1^5;         //键盘数据线接 P1^5



/**************************************/
void DelayNus (unsigned char us)//us=(实际延时-5)/2
{                       //us=1:7;2:9;3:11;4:13;5:15;6:17;9:19;10:21周期
    while(--us);        //5 +n*2    DJNZ R7,DelayNus    RET
//  while(us){us--;}    //8 +n*6
//  for (;--us>0;);     //5 +n*6
//  for (;us>0;us--);   //10+n*8
//  unsigned char i;for (i=0;i<us;i++); //12+n*8
}

#ifdef KB_DEBUG
/**************************************/
void DelayNms(unsigned int x)
{
    //      j=10:6+50*x j=100:6+410     6+(10+4*j)*x
   unsigned char j;
   do {
      for (j=0; j<181; j++) _nop_();    //j=(?KHz/12-10)/4=381.5
      for (j=0; j<200; j++) _nop_();    //
   }while(--x);
}
#endif

//---------------- Kb.c
//详细说明.
//Clock ____________    __    __    __    __    __    __    __    __    __    __    __________
//时钟              |__|  |__|  |__|  |__|  |__|  |__|  |__|  |__|  |__|  |__|  |__|
//data  ___________      _____ _____ _____ _____ _____ _____ _____ _____ _____ _______________
//数据             |____|_____|_____|_____|_____|_____|_____|_____|_____|_____|
//
//                 Start|bit 0|bit 1|bit 2|bit 3|bit 4|bit 5|bit 6|bit 7|Parity|Stop |
//                 起始  位 0  位 1  位 2  位 3  位 4  位 5  位 6  位 7  奇偶位 停止位 
/**************************************/
void kb_Init(void)              //键盘初始化:INT0下降沿中断
{
//  static bit kb_testok=0, kb_is_up=0, kb_shift = 0;
    unsigned char i=0;
    kb_Scaninpt  = 0;       // 初始化键盘扫描码缓冲区入指针
    kb_Scanoutpt = 0;       // 初始化键盘扫描码缓冲区出指针
    kb_inpt  = 0;       // 初始化键盘码缓冲区入指针
    kb_outpt = 0;       // 初始化键盘码缓冲区出指针
    kb_BufCnt = 0;              // 缓冲区内字符数
    kb_bitCount = 11;           // 一字节数据有 11 bit
    IT1=1;                      // EX0下降沿触发中断
    PX1=1;                      // EX0高优先级
    EX1=1;                      // 打开外部中断0
    EA=1;                       // 打开总中断控制位
#ifdef KB_DEBUG
    CH452_init();
    cls(0x00);
    printat(0,"RESET.");
    while ((!kb_testok)&&(i++ <16)) //上电1.6秒钟内等待键盘应答
    {
        DelayNms(100);
        printat(10,char2asc(2,i));
    }
    if (!kb_testok)
    {
        printat(6,"Error!");
        //bp(3);
    }
    else
    {
        printat(6,"Key OK");
        //bp(1);
    }
    DelayNms(2000);
#endif
}

/**************************************/
void kb_PutBuff(unsigned char c)    //放一字节到键盘缓冲区
{
    if (kb_BufCnt<kb_BUFF_SIZE) //如果缓冲区不满
    {
        kb_Buffer[kb_inpt] = c;     //把字符放进缓冲区
        kb_inpt++;                  //增加指针
        kb_BufCnt++;
        if (kb_inpt >= kb_BUFF_SIZE)//指针绕接
            kb_inpt = 0;
    }
}

/**************************************/
unsigned char kb_GetKey(void)       //从键盘缓冲区取一字节
{
    unsigned char temp;
    while(kb_BufCnt == 0);          //等待数据
    temp = kb_Buffer[kb_outpt];     //得到字节
    kb_outpt++;                     //增量指针
    if (kb_outpt >= kb_BUFF_SIZE)   //指针绕接
        kb_outpt = 0;
    kb_BufCnt--;                    //减少缓冲区计数
    return temp;
}

/**************************************/
void intX1_kb () interrupt 2 using 2    //T1下降沿中断
{
    unsigned char i;
//-------接收----------------------------------------------
    if (!kb_sent)   //接收
    {
        i=0;
        if ((!PIN_KEY_CLK)&&(--i != 0))             // Routine entered at falling edge// 在下降沿上运行
        {
            if(kb_bitCount < 11 && kb_bitCount > 2) // bit 3 to 10 is kb_Keydata. Parity bit,// 位3~10是数据.校验位,
            {               // start and stop bits are ignored.// 起始和停止位忽略了.
                kb_Keydata = (kb_Keydata >> 1);
                if (PIN_KEY_DAT) kb_Keydata = kb_Keydata | 0x80; // Store a '1'// 存储一"1"
            }
        }
        i=0;
        while((!PIN_KEY_CLK)&&(--i != 0));              //等待时钟电平上升
        if(--kb_bitCount == 0)                      // 所有的比特收到
        {
//          kb_Decode(kb_Keydata);
//          SBUF=kb_Keydata;
            kb_ScanBuffer[kb_Scaninpt]=kb_Keydata;          //扫描码放缓冲区
            kb_Scaninpt++;                          //增加指针
            if (kb_Scaninpt >= kb_BUFF_SIZE)            //指针绕接
                kb_Scaninpt = 0;
            kb_bitCount = 11;
            if(kb_Keydata==0xAA)                // 键盘自检完成码
                kb_testok=1;
//          kb_ok=1;
        }
    }
//-------发送----------------------------------------------
    else            //发送
    {
        i=0;
        if ((!PIN_KEY_CLK)&&(--i != 0))             //  在下降沿上运行
        {
            kb_bitCount--;
            if(kb_bitCount > 2) // bit 3 to 10 is kb_Keydata. Parity bit,// 位3~10是数据.校验位,
            {               // start and stop bits are ignored.// 起始和停止位忽略.
                if (kb_Keydata&0x01)
                    PIN_KEY_DAT=1;
                else
                    PIN_KEY_DAT=0;
                kb_Keydata = (kb_Keydata >> 1);
            }
            else if(kb_bitCount == 2)   //奇检验位
                PIN_KEY_DAT=kb_KeyP;
            else
            {
                PIN_KEY_DAT=1;
                if(kb_bitCount == 0)        // 所有的比特已发送     
                {
                    kb_bitCount = 11;
                    kb_ok=1;
                    kb_sent=0;
//                  IE1=0;
                }
            }
        }
        i=0;
        while((!PIN_KEY_CLK)&&(--i != 0));      //等待时钟电平上升
    }
}

/**************************************/
void kb_SentCmd (unsigned char C)   //主机发送一字节到键盘
{
//  if ((kb_bitCount < 11)&& (kb_bitCount >= 2))//如果在第10位(奇偶检验位)发送前
    {
//      PIN_KEY_CLK=0;                  //下拉时钟线60uS以停止键盘发送
//      DelayNus(60);                   //us=(实际延时-5)/2
    }
//  else
//      while (kb_bitCount<2);      //如奇偶位已发出则等待键盘发送完
//  SBUF=C;
    kb_bitCount=11;
    kb_Keydata=C;
    ACC=C;
    kb_KeyP=~P;                     //kb_KeyP为奇检验位

    kb_sent=1;                      //置发送到键盘标志
    EX1=0;
    PIN_KEY_DAT=0;          //主机发送起始位以启动主机发送
    PIN_KEY_CLK=0;          //抢占PS/2总线的控制权
    DelayNus(100);                  //Delay100uS
    PIN_KEY_CLK=1;      //通知PS/2设备,时机已成熟
    IE1=0;
    EX1=1;
}

/**************************************/
void kb_LedCtrl(unsigned char sc)   // 控制键盘灯,参数为1的位取反;位2:caps;位1:num;位0:scroll;
{
    kb_state ^=sc;
    kb_SentCmd(0xed);
    while((kb_Keydata!=0xfa) || (kb_bitCount != 11));   //等待接收到0xfa
    kb_SentCmd(kb_state & 0x07);
}

/**************************************/
void kb_Decode(unsigned char sc)    // 输入扫描代码处理
{
    static unsigned char kb_mode = 0;
    unsigned char temp;
    switch (sc)
    {
    case 0xAA :             // 键盘自检完成码
        kb_testok=1;
        break;
    case 0xE0:              // 转义符号E0
        kb_is_E0=1;     //收到转义符号E0
        break;
    case 0xE1:              // 转义符号E1
        kb_is_E1=1;     //收到转义符号E1
        break;
    case 0xF0:              // 按键释放码F0
        if (!kb_is_up)          // 键按下状态
        {
            kb_is_up = 1;       //收到按键释放码F0
        }
        break;
    case 0x12 :             // Left kb_shift
    case 0x59 :             // Right kb_shift
        if (!kb_is_up)          // 键按下状态
        {
            kb_shift = 1;
        }
        else
        {
            kb_shift = 0;
        }
        break;
    case 0xFA : // 键盘应答
        break;
    case 0xFF : // 缓冲溢出错误
        break;
    case 0x00 : // 缓冲溢出错误
        break;
    case 0xFE:  // 重新发送上次数据
        break;
    case 0xEE : // Echo 应当也回应Echo
        break;
    case 0x58 : // kb_caps Lock //大小写
        if (kb_is_up)           // 键释放状态
        {
            kb_is_up=0;
            kb_LedCtrl(1<<2);   // 控制键盘灯,参数为1的位取反;位2:caps;位1:num;位0:scroll;
        }
        break;
    case 0x77 : // kb_num Lock  //小键盘kb_num Lock
        if (kb_is_E1)       //收到转义符号E1
        {
            kb_is_E1=0; //Pause break键             :E11477E1F014F077
            if (kb_is_up)           // 键释放状态
            {
                kb_PutBuff('^');    //^C
            }
        }
        else
        {
            if (kb_is_up)           // 键释放状态
            {
                kb_is_up=0;
                kb_LedCtrl(1<<1);   // 控制键盘灯,参数为1的位取反;位2:caps;位1:num;位0:scroll;
            }
        }
        break;
    case 0x7e : // kb_scroll Lock
        if (kb_is_up)           // 键释放状态
        {
            kb_is_up=0;
            kb_LedCtrl(0x01);   // 控制键盘灯,参数为1的位取反;位2:caps;位1:num;位0:scroll;
        }
        break;
    default:
        if(kb_is_E0)        //上次收到E0,查表获得以E0开始的扫描码
        {
            kb_is_E0=0;
            if (!kb_is_up)          // 键按下状态
            {
                for(temp = 0; e0_tab[temp][0]!=sc && e0_tab[temp][0]; temp++);
                if (e0_tab[temp][0] == sc) 
                {
                    kb_PutBuff(e0_tab[temp][1]);
                }
            }
        }
        else
        {   
            if (!kb_is_up)                      // 键按下时的数据
            {
                if(kb_mode == 0 || kb_mode == 3)//如果 ASCII 方式
                {
                    if(sc<=0x83)
                    {
                        if(!kb_shift)                   //如果(kb_shift)键不压,
                        {                       //执行一查表
                            temp=unshifted[sc];
                        }
                        else
                        {                   // 如果(kb_shift)键压下
                            temp=shifted[sc];
                        }
                        if(kb_caps)     //大写灯亮,大小写转换
                        {
                            if((temp>='A')&&(temp<='Z'))
                                temp+=0x20;
                            else if((temp>='a')&&(temp<='z'))
                                temp-=0x20;
                        }
                        if(temp)        //非0输出ASCII字符
                            kb_PutBuff(temp);
                        if(temp==0x0d)      //回车键还要多输出0x0a
                            kb_PutBuff(0x0a);
                    }
                }
                else
                {       //扫描码方式
//                  print(char2hexasc(sc));// Print scan code// 打印扫描码
                    kb_PutBuff(sc);
                }
            }
            else                //键释放时的数据
            {
                kb_is_up = 0;       // Two 0xF0 in a row not allowed不允许两个0xF0
                if(sc==0x05)    // F1   //切换输入扫描代码方式
                {
                    kb_mode++;
                    kb_mode &=0x03;
                }
            }
        }
        break;
    }
}
  
  
/**************************************/
unsigned char kb_CheckDecode(void)      //检查、转换并返回缓冲区字符数
{
    if (kb_Scaninpt != kb_Scanoutpt) 
    {
//      print(char2hexasc(kb_ScanBuffer[kb_Scanoutpt]));
        kb_Decode(kb_ScanBuffer[kb_Scanoutpt]);
        kb_Scanoutpt++;                     // 增量指针
        if (kb_Scanoutpt >= kb_BUFF_SIZE)   //指针绕接
            kb_Scanoutpt = 0;
    }
    return(kb_BufCnt);


#ifdef KB_DEBUG
/**************************************/
void InitSys(void)
{
    //  设置串口为  57600波特 晶振频率为 18.432MHz.
    //  设置中断--------------------------------------
        SCON   =  0x50;     // SCON: 设串口模式1,并打开接受:1起始位,8数据位,1停止位 //
        PCON=0x00;          //  PCON |= 0x80;   // PCON: 波特律加倍:关                                 //
        RCAP2H=BAUD_57600/256;      // 9600波特串口的自加载值,晶振频率: 18.432MHz //
        RCAP2L=BAUD_57600%256;
//      T2MOD=0X00;
        T2CON=0x3c;
//      TMOD   =  0x21;     // TMOD: 定时器0:模式1:16位; 定时器1:模式2:8位自加载;//
//      TH1    =  0xfB;     // TH1:  19200波特串口的自加载值,晶振频率: 18.432MHz //
    //------------------------------------------------
    //  设置并开启中断: T0高;开中断: T1、串口
    //------------------------------------------------//
        TMOD   =  0x11;     // TMOD: 定时器0:模式1:16位; 定时器1:模式1:16位;//
        TCON =  0x50;       // TCON: 定时器 0运行;定时器 1运行            //
        IP   =  0x02;       //中断优先寄存器IP:|D7_x |x|x  |PS|PT1|PX1|PT0|D0_PX0|//
        IE   =  0x83;       //中断允许寄存器IE:|D7_EA|x|ET2|ES|ET1|EX1|ET0|D0_EX0|//
    //----------------------------------------
相关链接:https://bbs.21ic.com/upfiles/img/200712/20071222192410983.rar

相关帖子

沙发
xwj|  楼主 | 2008-11-6 19:06 | 只看该作者

PS2键盘程序配套的扫描码 对照表

//--------------------------------------------------------------------------//
//                                                                          //
//                    (c) Copyright 2008-2009 xuwenjun                     //
//                            All Rights Reserved                           //
//                                    V1.00                                 //
//--------------------------------------------------------------------------//
//标 题: xwj 的PS2键盘程序配套的扫描码表                                   //
//文件名: Scancodes1.h                                                      //
//版 本: V1.00                                                             //
//修改人: xwj                            E-mail:xuwenjun@21cn.com           //
//日 期: 08-11-06                                                          //
//描 述: xwj 的PS2键盘程序                                                 //
//声 明:                                                                   //
//        以下代码仅免费提供给学习用途,但引用或修改后必须在文件中声明出处. //
//        如用于商业用途请与作者联系.    E-mail:xuwenjun@21cn.com           //
//        有问题请mailto xuwenjun@21cn.com   欢迎与我交流!                  //
//--------------------------------------------------------------------------//
//老版本: 废弃                           老版本文件名:                      //
//创建人: xwj                            E-mail:xuwenjun@21cn.com           //
//日 期:                                                                   //
//--------------------------------------------------------------------------//
//描 述:                                                                   //
// xwj  的PS2键盘程序配套的扫描码表                                         //
// MCU 型号: MCS51                                                          //
// 开发环境: Keil                                                           //
// 开发日期: 08-11-06                                                       //
// 程序编写: XWJ                                                            //
//--------------------------------------------------------------------------//
// 程序特点:                                                                //
//1、扫描码和输出字符双环形队列缓存                                         //
//2、可以直接输出按键对应的字符,直接实现“打字”效果                         //
//3、完美支持CapsLock、Shift大小写转换,支持键盘灯控制                      //
//--------------------------------------------------------------------------//

    //  通用PC机键盘方式  //
//----------------- Scancodes1.h
code unsigned char e0_tab[][2] = // 以E0开始的扫描码,不一定正确
{                                // 发现不同的资料说法不一致,条件受限没法测试
//  0x00,0x00,
    0x11,0x12,  //左Alt:    11; 右Alt:  E011
    0x12,0x2a,  //Print Screen Sys Rq   :E012E07C
    0x14,17,    //左Ctrl:  14; 右Ctrl: E014
    0x15,0x00,  //音量+键:E015
    0x1f,91,    //左Win键:  E01F;   右Win键:    E027;
    0x21,0x00,  //Email键:E021
    0x23,0x00,  //Search键:E023
    0x24,0x00,  //音量Mute键:E024
    0x27,92,    //右Win键:  E027;   左Win键:    E01F;
    0x2d,0x00,  //Internet键:E02d
    0x2f,93,    //鼠标右键快捷键:   E02f;
    0x37,0x00,  //Power键:  E037;
    0x3f,0x00,  //Sleep键:  E03f;
    0x4a,'/',   //小键盘'/':    E04a
    0x4d,0x00,  //音量-键:E04d
    0x5a,0x0d,  //大回车:5a;    小键盘回车 E05a;
    0x5f,0x00,  //WakeUp键: E05f;
    0x66,37,    //箭头左: E066
    0x69,35,    //End: E069
    0x6c,36,    //Home: E06c
    0x70,45,    //Insert: E070
    0x71,46,    //Delete: E071
    0x72,40,    //箭头下: E072
    0x74,39,    //箭头右: E072
    0x75,38,    //箭头上: E075
    0x77,19,    //Pause break           :E11477E1F014F077
    0x7a,34,    //Page down: E07a
    0x7c,0x2a,  //Print Screen Sys Rq   :E012E07C
    0x7d,33,    //Page Up: E07d

//ACPI 扫描码
    0x37,0x00,  //Power E0, 37
    0x3F,0x00,  //Sleep E0, 3F
    0x5E,0x00,  //Wake E0, 5E

//Windows 多媒体扫描码
    0x4D,0x00,  //Next Track E0, 4D
    0x15,0x00,  //Previous Track E0, 15
    0x3B,0x00,  //Stop E0, 3B
    0x34,0x00,  //Play/Pause E0, 34
    0x23,0x00,  //Mute E0, 23
    0x32,0x00,  //Volume Up E0, 32
    0x21,0x00,  //Volume down E0, 21
    0x50,0x00,  //Media Select E0, 50
    0x48,0x00,  //E-Mail E0, 48
    0x2B,0x00,  //Calculator E0, 2B
    0x40,0x00,  //My Computer E0, 40
    0x10,0x00,  //WWW Search E0, 10
    0x3A,0x00,  //WWW Home E0, 3A
    0x38,0x00,  //WWW Back E0, 38
    0x30,0x00,  //WWW forward E0, 30
    0x28,0x00,  //WWW Stop E0, 28
    0x20,0x00,  //WWW Refresh E0, 20
    0x18,0x00,  //WWW Favorites E0, 18
    
    0,0x00
};


// Unshifted characters//   不按Shift的字符
code unsigned char unshifted[] = {
    0x00,
    120,    //F9
    0x00,
    116,    //F5
    114,    //F3
    112,    //F1
    113,    //F2
    123,    //F12

    0x00,
    121,    //F10
    119,    //F8
    117,    //F6
    115,    //F4
    9,      //Tab
    '`',
    0x00,
    
    0x00,
    0x12,   //左Alt:    11; 右Alt:  E011
//  0x2a,   //Print Screen Sys Rq   :E012E07C
    0x10,   //左Shift:12;   右Shift:    59
    0x00,
    0x11,   //左Ctrl:  14; 右Ctrl: E014
    'q',
//  0x00,   //音量+键:E015
    '1',
    0x00,
    
    0x00,
    0x00,
    'z',
    's',
    'a',
    'w',
    '2',
    0x00,   //左Win键:  E01F;   右Win键:    E027;

    0x00,
    'c',
//  0x00,   //Email键:E021
    'x',
    'd',
//  0x00,   //Search键:E023
    'e',
//  0x00,   //音量Mute键:E024
    '4',
    '3',
    0x00,   //右Win键:  E027;   左Win键:    E01F;
    
    0x00,
    ' ',    //空格
    'v',
    'f',
    't',
    'r',
//  0x00,   //Internet键:E02d
    '5',
    0x00,   //右粘贴键: E02f;
    
    0x00,
    'n',
    'b',
    'h',
    'g',
    'y',
    '6',
    0x00,   //Power键:  E037;

    0x00,
    0x00,   //没有?
    'm',
    'j',
    'u',
    '7',
    '8',
    0x00,   //Sleep键:  E03f;
    
    0x00,
    ',',
    'k',
    'i',
    'o',
    '0',
    '9',
    0x00,
    
    0x00,
    '.',
    '/',
//  '/',    //小键盘'/':    E04a
    'l',
    ';',
    'p',
//  0x00,   //音量-键:E04d
    '-',
    0x00,
    
    0x00,
    0x00,
    '\'',
    0x00,
    '[',
    '=',
    0x00,
    0x00,
    
    0x00,       ]//大小写Caps Lock   :58
    0x00,   //右Shift:59;   左Shift:12; 
    0x0d,   //大回车:5a;    小键盘回车 E05a;
//  0x0d,   //小键盘回车 E05a
    ']',
    0x00,
    '\\',   // "\"
    0x00,
    0x00,   //WakeUp键: E05f;
    
    0x00,
    0x00,   //Fn
    0x00,
    0x00,
    0x00,
    0x00,
    8,      //退格
//  0x00,   //箭头左: E066
    0x00,

    0x00,
    '1',    //小键盘'1'
//  0x00,   //End: E069
    0x00,
    '4',    //小键盘'4'
    '7',    //小键盘'7'
//  0x00,   //Home: E06c
    0x00,
    0x00,
    0x00,
    
    '0',    //小键盘'0'
//  0x00,   //Insert: E070
    '.',    //小键盘'.'
//  0x00,   //Delete: E071
    '2',    //小键盘'2'
//  0x00,   //箭头下: E072
    '5',    //小键盘'5'
    '6',    //小键盘'6'
//  0x00,   //箭头右: E072
    '8',    //小键盘'8'
//  0x00,   //箭头上: E075
    27,     //ESC
    144,    //小键盘Num Lock    :77
//  0x00,   //Pause break           :E11477E1F014F077

    122,    //F11
    '+',    //小键盘'+'
    '3',    //小键盘'3'
//  0x00,   //Page down: E07a
    '-',    //小键盘'-'
    '*',    //小键盘'*'
    '9',    //小键盘'9'
//  0x00,   //Page Up: E07d
    145,    //Scroll Lock           :7E
    0x00,

    0x00,
    0x00,
    0x00,
    118,    //F7
};

// Shifted characters// 按下Shift的字符
code unsigned char shifted[] = {
    0x00,
    120,    //F9
    0x00,
    116,    //F5
    114,    //F3
    112,    //F1
    113,    //F2
    123,    //F12

    0x00,
    121,    //F10
    119,    //F8
    117,    //F6
    115,    //F4
    9,      //Tab
    '~',
    0x00,
    
    0x00,
    0x12,   //左Alt:    11; 右Alt:  E011
//  0x2a,   //Print Screen Sys Rq   :E012E07C
    0x10,   //左Shift:12;   右Shift:    59
    0x00,
    0x11,   //左Ctrl:  14; 右Ctrl: E014
    'Q',
//  0x00,   //音量+键:E015
    '!',
    0x00,
    
    0x00,
    0x00,
    'Z',
    'S',
    'A',
    'W',
    '@',
    0x00,   //左Win键:  E01F;   右Win键:    E027;

    0x00,
    'C',
//  0x00,   //Email键:E021
    'X',
    'D',
//  0x00,   //Search键:E023
    'E',
//  0x00,   //音量Mute键:E024
    '$',
    '#',
    0x00,   //右Win键:  E027;   左Win键:    E01F;
    
    0x00,
    ' ',    //空格
    'V',
    'F',
    'T',
    'R',
//  0x00,   //Internet键:E02d
    '%',
    0x00,   //右粘贴键: E02f;
    
    0x00,
    'N',
    'B',
    'H',
    'G',
    'Y',
    '^',
    0x00,   //Power键:  E037;

    0x00,
    0x00,   //没有?
    'M',
    'J',
    'U',
    '&',
    '*',
    0x00,   //Sleep键:  E03f;
    
    0x00,
    '<',
    'K',
    'I',
    'O',
    ')',
    '(',
    0x00,
    
    0x00,
    '>',
    '?',
//  '/',    //小键盘'/':    E04a
    'L',
    ':',
    'P',
//  0x00,   //音量-键:E04d
    '_',
    0x00,
    
    0x00,
    0x00,
    '|',
    0x00,
    '{',
    '+',
    0x00,
    0x00,
    
    20,     //大小写Caps Lock   :58
    0x10,   //右Shift:59;   左Shift:12; 
    0x0d,   //大回车:5a;    小键盘回车 E05a;
//  0x0d,   //小键盘回车 E05a
    '}',
    0x00,
    '|',    // "|"
    0x00,
    0x00,   //WakeUp键: E05f;
    
    0x00,
    0x00,   //Fn
    0x00,
    0x00,
    0x00,
    0x00,
    8,      //退格
//  0x00,   //箭头左: E066
    0x00,

    0x00,
    '1',    //小键盘'1'
//  0x00,   //End: E069
    0x00,
    '4',    //小键盘'4'
    '7',    //小键盘'7'
//  0x00,   //Home: E06c
    0x00,
    0x00,
    0x00,
    
    '0',    //小键盘'0'
//  0x00,   //Insert: E070
    '.',    //小键盘'.'
//  0x00,   //Delete: E071
    '2',    //小键盘'2'
//  0x00,   //箭头下: E072
    '5',    //小键盘'5'
    '6',    //小键盘'6'
//  0x00,   //箭头右: E072
    '8',    //小键盘'8'
//  0x00,   //箭头上: E075
    27,     //ESC
    144,    //小键盘Num Lock
//  0x00,   //Pause break           :E11477E1F014F077

    122,    //F11
    '+',    //小键盘'+'
    '3',    //小键盘'3'
//  0x00,   //Page down: E07a
    '-',    //小键盘'-'
    '*',    //小键盘'*'
    '9',    //小键盘'9'
//  0x00,   //Page Up: E07d
    145,    //Scroll Lock           :7E
    0x00,

    0x00,
    0x00,
    0x00,
    118,    //F7
};


//本程序由xwj设计的UltraEdit脚本加亮显示,如需要脚本请访问我的Blog或联系xwjfile@21cn.com

使用特权

评论回复
板凳
isbit| | 2008-11-7 09:37 | 只看该作者

牛人

使用特权

评论回复
地板
古道热肠| | 2008-11-7 10:33 | 只看该作者

好,值得收藏

程序中最好不要直接操纵用Sbit定义的变量来控制管脚,移植性欠佳,移植到ARM平台会要改很多地方
定义成如下可能会更好
#define  setPin_KEY_DAT_Low() PIN_KEY_DAT=0
#define  setPin_KEY_DAT_High() PIN_KEY_DAT=1
怎样拉高和拉低数据线会根据目标系统有所不同,用户自己确定.

使用特权

评论回复
5
xwj|  楼主 | 2008-11-7 11:19 | 只看该作者

呵呵,碰到移植性问题俺一般都是直接替换

使用特权

评论回复
6
dlwlmlj| | 2008-11-7 13:34 | 只看该作者

学习了

使用特权

评论回复
7
lpCFans| | 2008-11-7 17:30 | 只看该作者

hao...

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

xwj

288

主题

22797

帖子

35

粉丝