搜索
bottom↓
回复: 12

PS2键盘与单片机通信,在上位机显示按键情况(使用查询方式)

[复制链接]

出0入0汤圆

发表于 2007-2-9 14:20:23 | 显示全部楼层 |阅读模式
这是我写的一个PS2与单片机通信的程序。

但是还没有加入Shift功能,和其他功能键。

现在只能完成普通的输入。

想完成一个完整的PS2键盘程序,还请高手指点。



CPU:STC89C55RD+

编译环境:Keil C 8.0

没有奇校验

上位机可以使用串口调试助手或超级终端都行。





/*----------------------main.c---------------------------*/



#include "STC89CXXRD.H"

#include "PS2KeyBoard.H"

#define uchar unsigned char

void main(void)

{

    uchar redat;

    TMOD = 0x20;                 //定时/计数器1,工作方式2

    TL1 = 0xfa;                  //11.0592M晶振波特率为4800bps

    TH1 = 0xfa;

    TR1 = 1;                     //启动计数器1

    SCON = 0x40;                 //串行口工作为方式1发送

    while(1)

    {

        redat = ReceiveDatFromPS2KeyBoard();

        if(redat)

        {

            SBUF = redat;

            while(!TI);

            TI = 0;

        }

    }

}





/*---------------------PS2KEY.C---------------------------*/



/*

╭════════════════════════════════════╮

║  公司名称:吉林工程技术师范学院                                        ║

║                                                                        ║

║  模 块 名:PS2键盘驱动程序       驱动芯片型号:第二套键盘模版          ║

║                                                                        ║

║  创 建 人:韩林                  日期:2007-02-08                      ║

║                                                                        ║

║  修 改 人:韩林                  日期:2007-02-08                      ║

║                                                                        ║

║  功能描述:将PC机的PS2键盘利用单片机读回数据,并进行译码.(查询方式)     ║

║                                                                        ║

║  其他说明:无                                                          ║

║                                                                        ║

║  版    本:v1.0                                                        ║

║                                                                        ║

║  E-mail  : hanlinxp@163.com      QQ: 33737559                        ║

║                                                                        ║

║                      Copyright@2006 - 2007                             ║

║                                                                        ║

╰════════════════════════════════════╯

*/

#include "STC89CXXRD.H"

#define uchar unsigned char

#define SHIFT 0x12

/*

╭════════════════════════════════════╮

║                                                                        ║

║                      硬  件  信  号  定  义                            ║

║                                                                        ║

╰════════════════════════════════════╯

*/

sbit io_dat_ps2key = P1^0;                  //PS2键盘的数据端口

sbit io_clk_ps2key = P3^2;                  //PS2键盘的时钟端口

/*

╭════════════════════════════════════╮

║                                                                        ║

║                      键  码  转  换  数  组                            ║

║                                                                        ║

╰════════════════════════════════════╯

*/

//没有按下Shift键时的键码转换

static unsigned char code UnShifted[59][2] = {0x1C, 'a',0x32, 'b',0x21, 'c',0x23, 'd',0x24, 'e',

                                              0x2B, 'f',0x34, 'g',0x33, 'h',0x43, 'i',0x3B, 'j',

                                              0x42, 'k',0x4B, 'l',0x3A, 'm',0x31, 'n',0x44, 'o',

                                              0x4D, 'p',0x15, 'q',0x2D, 'r',0x1B, 's',0x2C, 't',

                                              0x3C, 'u',0x2A, 'v',0x1D, 'w',0x22, 'x',0x35, 'y',

                                              0x1A, 'z',0x45, '0',0x16, '1',0x1E, '2',0x26, '3',

                                              0x25, '4',0x2E, '5',0x36, '6',0x3D, '7',0x3E, '8',

0x46, '9',0x0E, '`',0x4E, '-',0x55, '=',0x5D, '\\',

                                              0x29, ' ',0x54, '[',0x5B, ']',0x4C, ';',0x52, '\'',

                                              0x41, ',',0x49, '.',0x4A, '/',0x71, '.',0x70, '0',

                                              0x69, '1',0x72, '2',0x7A, '3',0x6B, '4',0x73, '5',

0x74, '6',0x6C, '7',0x75, '8',0x7D, '9',};

//按下Shift键时的键码转换

/*static unsigned char code Shifted[59][2] =   {0x1C, 'A',0x32, 'B',0x21, 'C',0x23, 'D',0x24, 'E',

                                              0x2B, 'F',0x34, 'G',0x33, 'H',0x43, 'I',0x3B, 'J',

                                              0x42, 'K',0x4B, 'L',0x3A, 'M',0x31, 'N',0x44, 'O',

                                              0x4D, 'P',0x15, 'Q',0x2D, 'R',0x1B, 'S',0x2C, 'T',

                                              0x3C, 'U',0x2A, 'V',0x1D, 'W',0x22, 'X',0x35, 'Y',

                                              0x1A, 'Z',0x45, '0',0x16, '1',0x1E, '2',0x26, '3',

                                              0x25, '4',0x2E, '5',0x36, '6',0x3D, '7',0x3E, '8',

                                              0x46, '9',0x0E, '~',0x4E, '_',0x55, '+',0x5D, '|',

                                              0x29, ' ',0x54, '{',0x5B, '}',0x4C, ':',0x52, '"',

                                              0x41, '<',0x49, '>',0x4A, '?',0x71, '.',0x70, '0',

                                              0x69, '1',0x72, '2',0x7A, '3',0x6B, '4',0x73, '5',

0x74, '6',0x6C, '7',0x75, '8',0x7D, '9',};

/*

╭════════════════════════════════════╮

║                                                                        ║

║                      函  数  原  型  声  明                            ║

║                                                                        ║

╰════════════════════════════════════╯

*/

static uchar ReceiveByte(void);

static void SkipCode(void);

static uchar ReceiveDat(void);              //接收一个正常键

static uchar ChangeASCII(uchar dat);        //将接通码转为简码的ASCII码

uchar ReceiveDatFromPS2KeyBoard(void);      //返回相应按键的ASCII码

/*

╭════════════════════════════════════╮

║  函 数 名: static uchar ReceiveByte(void)                             ║

║  功能模式: 内部                                                       ║

║  函数说明: 返回键盘传送的一个字节.                                    ║

║  调用函数: 无                                                         ║

║  全局变量: 无                                                         ║

║  端口信号:  io_clk_ps2key、io_dat_ps2key                               ║

║  输    入: 无                                                         ║

║  返    回: 11位数据中的8位数据.                                       ║

║  设 计 者: 韩林                  日    期:2007-02-09                 ║

║  修 改 者: 韩林                  日    期:2007-02-09                 ║

║  E-mail  : hanlinxp@163.com      QQ: 33737559                        ║

║  版    本: v1.0                                                       ║

║                                                                        ║

║                      Copyright@2006 - 2007                             ║

║                                                                        ║

╰════════════════════════════════════╯

*/

static uchar ReceiveByte(void)

{

    uchar i,dat = 0;

    while(!io_clk_ps2key);          //起始位0

    while(io_clk_ps2key);

    for(i=0;i<8;i++)                //接收8位数据

    {

        dat >>= 1;

        if(io_dat_ps2key)

            dat |= 0x80;

        while(!io_clk_ps2key);

        while(io_clk_ps2key);

    }

                                    //此处取出奇校验位

    while(!io_clk_ps2key);

    while(io_clk_ps2key);

    while(!io_clk_ps2key);

    return dat;

}

/*

╭════════════════════════════════════╮

║  函 数 名: static void SkipCode(void)                                 ║

║  功能模式: 内部                                                       ║

║  函数说明: 将其余编码跳过.                                            ║

║  调用函数: 无                                                         ║

║  全局变量: 无                                                         ║

║  端口信号:  io_clk_ps2key、io_dat_ps2key                               ║

║  输    入: 无                                                         ║

║  返    回: 无                                                         ║

║  设 计 者: 韩林                  日    期:2007-02-09                 ║

║  修 改 者: 韩林                  日    期:2007-02-09                 ║

║  E-mail  : hanlinxp@163.com      QQ: 33737559                        ║

║  版    本: v1.0                                                       ║

║                                                                        ║

║                      Copyright@2006 - 2007                             ║

║                                                                        ║

╰════════════════════════════════════╯

*/

static void SkipCode(void)

{

    (void)ReceiveByte();

    (void)ReceiveByte();

}

/*

╭════════════════════════════════════╮

║  函 数 名: static uchar ReceiveDat(void)                              ║

║  功能模式: 内部                                                       ║

║  函数说明: 返回键盘按键对应的一个接通码.                              ║

║  调用函数: ReceiveByte()、SkipCode()                                  ║

║  全局变量: 无                                                         ║

║  端口信号:  无                                                         ║

║  输    入: 无                                                         ║

║  返    回: 键盘的接通码.                                              ║

║  设 计 者: 韩林                  日    期:2007-02-08                 ║

║  修 改 者: 韩林                  日    期:2007-02-09                 ║

║  E-mail  : hanlinxp@163.com      QQ: 33737559                        ║

║  版    本: v1.1                                                       ║

║                                                                        ║

║                      Copyright@2006 - 2007                             ║

║                                                                        ║

╰════════════════════════════════════╯

*/

static uchar ReceiveDat(void)

{

    uchar dat;

    if(io_clk_ps2key)                       //如果无键按下,返回0

        return 0;

    dat = ReceiveByte();

    SkipCode();

    return dat;                             //返回接通码

}

/*

╭════════════════════════════════════╮

║  函 数 名: static uchar ChangeASCII(uchar dat)                        ║

║  功能模式: 内部                                                       ║

║  函数说明: 将接通码转为与键盘按键对应的ASCII码.                       ║

║  调用函数: 无                                                         ║

║  全局变量: 无                                                         ║

║  端口信号:  无                                                         ║

║  输    入: 无                                                         ║

║  返    回: 键盘按键的ASCII码.                                         ║

║  设 计 者: 韩林                  日    期:2007-02-08                 ║

║  修 改 者: 韩林                  日    期:2007-02-08                 ║

║  E-mail  : hanlinxp@163.com      QQ: 33737559                        ║

║  版    本: v1.0                                                       ║

║                                                                        ║

║                      Copyright@2006 - 2007                             ║

║                                                                        ║

╰════════════════════════════════════╯

*/

static uchar ChangeASCII(uchar dat)

{

    uchar i;

    if(dat == 0)

        return 0;

    for(i=0;i<59;i++)

    {

        if(UnShifted[0] == dat)          //没按Shift键

            return UnShifted[1];

    }

    return 0;

}

/*

╭════════════════════════════════════╮

║  函 数 名: uchar ReceiveDatFromPS2KeyBoard(void)                      ║

║  功能模式: 全局                                                       ║

║  函数说明: 返回键盘按键的ASCII码,没有按键则为0.                       ║

║  调用函数: ChangeASCII()、ReceiveDat()                                ║

║  全局变量: 无                                                         ║

║  端口信号:  无                                                         ║

║  输    入: 无                                                         ║

║  返    回: 键盘按键的ASCII码.                                         ║

║  设 计 者: 韩林                  日    期:2007-02-08                 ║

║  修 改 者: 韩林                  日    期:2007-02-08                 ║

║  E-mail  : hanlinxp@163.com      QQ: 33737559                        ║

║  版    本: v1.0                                                       ║

║                                                                        ║

║                      Copyright@2006 - 2007                             ║

║                                                                        ║

╰════════════════════════════════════╯

*/

uchar ReceiveDatFromPS2KeyBoard(void)

{

    return ChangeASCII(ReceiveDat());

}



/*-------------------------PS2KEYBOARD.H------------------------*/



extern unsigned char ReceiveDatFromPS2KeyBoard(void);           //返回相应按键的ASCII码




-----此内容被hanlin于2007-02-09,14:27:07编辑过

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2007-2-9 15:06:54 | 显示全部楼层
怎么没有人顶啊。郁闷。大家不要光看,发表一下你的意见啊。



加入Shift键的算法或思想。

出0入0汤圆

发表于 2007-2-9 15:52:08 | 显示全部楼层
加shift的,键盘好象是会连续送2个数据来

出0入0汤圆

发表于 2009-10-6 14:56:17 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-9-20 19:58:52 | 显示全部楼层
不错

出0入0汤圆

发表于 2010-10-16 23:21:48 | 显示全部楼层
调试通过了吗?对信号的毛刺处理不太理想吧?

出0入0汤圆

发表于 2010-10-17 01:18:22 | 显示全部楼层
标记。

另外,毛刺是按键毛刺么?那个应该撒PS2键盘里面的ic自己处理好的吧。

出0入0汤圆

发表于 2010-10-17 10:23:00 | 显示全部楼层
用了  但是仅仅是单独可以用  如果和其他模块一起就不好用了     关键在于while循环在稍大程序里会出现问题   或者说我对它的控制应用不是很了解

出0入0汤圆

发表于 2010-10-17 18:14:39 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-10-17 20:16:33 | 显示全部楼层
marak

出0入0汤圆

发表于 2011-5-30 19:36:03 | 显示全部楼层
我今晚好好验证验证看

出0入0汤圆

发表于 2011-7-31 14:52:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2013-10-10 15:49:47 | 显示全部楼层
这么好的东西,值得一看。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 02:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表