搜索
bottom↓
回复: 11

请熟悉PS/2键盘的兄弟们指导一下

[复制链接]

出390入22汤圆

发表于 2020-4-28 16:04:35 | 显示全部楼层 |阅读模式
如题,AVR接了一个PS/2数字小键盘,程序是51程序改的,忘了从哪里下载的了,看协议头大,现在省事一下直接问问,不知有没有熟悉的兄弟指导一下。
现在的问题是NumLock键按下,指示灯闪一下就灭了,数字键不管什么状态下都是数字键,没有上下左右键,该键盘接电脑是正常的,恳请懂的说一下这是怎么回事,谢谢

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

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入1119汤圆

发表于 2020-4-28 16:09:36 | 显示全部楼层
本帖最后由 Himem 于 2020-4-28 16:13 编辑

键盘每个按键的scancode是固定的,返回结果并不会因为capslock还是numlock而改变
程序处理下numlock不同状态的scancode映射

出390入22汤圆

 楼主| 发表于 2020-4-28 16:12:26 | 显示全部楼层
Himem 发表于 2020-4-28 16:09
键盘每个按键的scancode是固定的,返回结果并不会因为capslock还是numlock而改变
程序处理下numlock不同状 ...

谢谢,NumLock键按下,指示灯闪一下就灭了,是怎么回事?键盘是好的

出0入1119汤圆

发表于 2020-4-28 16:14:33 | 显示全部楼层
liudingding 发表于 2020-4-28 16:12
谢谢,NumLock键按下,指示灯闪一下就灭了,是怎么回事?键盘是好的

灯闪一下就灭可能numlock按下和抬起分别共处理了两次?

也可能程序里为防止误操作一直关闭numlock?

出390入22汤圆

 楼主| 发表于 2020-4-28 16:16:10 | 显示全部楼层
Himem 发表于 2020-4-28 16:09
键盘每个按键的scancode是固定的,返回结果并不会因为capslock还是numlock而改变
程序处理下numlock不同状 ...

灯闪一下就灭可能numlock按下和抬起分别共处理了两次?

不是单步仿真看,按下这个键,单片机向键盘发送了两个数据,头一个数据闪一下,第二个数据忘了,我看一下

出0入0汤圆

发表于 2020-4-28 17:13:46 | 显示全部楼层
指示灯似乎是受主机控制

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2020-4-28 17:59:34 来自手机 | 显示全部楼层
可以贴下初始化和键码部分的代码嘛,亮灯发指令0x02,灭灯发0x00,多年前玩过一次

出0入0汤圆

发表于 2020-4-28 18:44:11 来自手机 | 显示全部楼层
灯饰主机控制的 你应该理解成键盘等效特殊时序矩阵键盘加led合体  键值如果会变可能乱套的 它就应该固定 靠软件去记录状态处理

出100入113汤圆

发表于 2020-4-28 19:19:28 | 显示全部楼层


我好多年以前写过驱动,刚好也是用的 AVR XMEGA系列,不过当时功能也没有做全。记得大小写要自己判断,不过我当时也没有实现这个功能。,按键产生的是通码、重复码、断码等,都要驱动自己处理。上面是PS2 的接口协议资料,其实原理不难,自己看看协议资料,了解了原理解决起来可能不难。好多年没搞了,都忘光了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出20入0汤圆

发表于 2020-4-28 22:49:50 | 显示全部楼层
记得键盘的LED是主机记忆的

出390入22汤圆

 楼主| 发表于 2020-4-29 07:21:00 | 显示全部楼层
本帖最后由 liudingding 于 2020-4-29 07:23 编辑

我看了一下,单片机接收键盘发来的数据是正确的,单片机向键盘发送复位数据再发送翻转指示灯数据,不确定发送那个数据后指示灯闪一下,应该是向键盘发送数据的程序有问题,这个程序是我用51的程序改的,附上程序请兄弟们看一下,程序上半段是我修改后的AVR程序,下半段是原先的51程序

#define PS2DATA  PINE&0x10    // PS2数据  E4,
#define PS2CLK   PINE&0x20    // PS2时钟  E5,
#define SPD  PORTE|=0x10      // PS2
#define CPD  PORTE&=~0x10     // PS2
#define SPK  PORTE|=0x20      // PS2
#define CPK  PORTE&=~0x20     // PS2
void ps2_sentchar(unsigned char sentchar)     //  单片机向ps2键盘发送数据
{
  unsigned char sentbit_cnt;          //  数据
  unsigned char sentchar_chk = 0x00;  // 校验
  unsigned char i;
  CLI();         //关外部中断1
  EICRB&=~0x08;  //extended ext ints
  DDRE|=0x30;    //发起一个传送,发起始位
  CPK;           //将时钟线拉低并保持100 us
  delayus(100);
  CPD;           //起始位
  delayus(8);
  DDRE&=~0x20;               //发送DATA0-7
  SPK;
for(sentbit_cnt=0;sentbit_cnt< 8;sentbit_cnt++)
  {
    while(PS2CLK);      // 等待时钟线变为低
    if( sentchar& 0x01)
         {
          SPD;              // 发送数据
          sentchar_chk++;   // 计算校验
         }
        else
         CPD;
    while(!PS2CLK) ;  // 等待时钟线变高
    sentchar>>=1;     // 待发送数据右移一位
  }
  //发送校验位
  while(PS2CLK);      //等待时钟线变低
  switch(sentchar_chk)
  {
     case 0:
     case 2:
     case 4:
     case 6: SPD;break;//奇校验
     case 1:
     case 3:
     case 5:
     case 7: CPD;break;//奇校验
     default:break;
  }
  while(!PS2CLK);   // 等待时钟线变高
  while(PS2CLK);    // 等待时钟线变低
  SPD;              //  发送停止位,停止位总为1
  DDRE&=~0x10;
//  while(!PS2CLK)  ; // 等待时钟线变高
//  while(PS2CLK)   ; // 等待时钟线变低
  //接收ACK
//  if(PS2_SGN_DATA) error();
  //ACK信号由键盘发出,总为低电平
//  while(!PS2CLK)  ; // 等待时钟线变高
  delayms(1);
  EICRB|= 0x08;  //extended ext ints
  SEI(); //开外部中断1
}


/*    我参考的原先的51程序

void ps2_sentchar(unsigned char sentchar)     //  单片机向ps2键盘发送数据
{
  unsigned char sentbit_cnt= 0x00;   //  数据
  unsigned char sentchar_chk = 0x00;  // 校验
  unsigned char i;
  CLI();//EX1=0; //关外部中断1
  //发起一个传送,发起始位
  PS2CLK = 0; //将时钟线拉低并保持100 us
  i=60;while(--i);
  PS2DATA= 0; //起始位
  i=5;while(--i);
  PS2CLK = 1;
  //发送DATA0-7
  for(sentbit_cnt=0;sentbit_cnt< 8;sentbit_cnt++)
  {
    while(PS2CLK);    // 等待时钟线变为低
    PS2DATA = sentchar& 0x01;   // 发送数据
    if(PS2DATA) sentchar_chk++; // 计算校验
    while(!PS2CLK) ;  // 等待时钟线变高
    sentchar>>=1;     // 待发送数据右移一位
  }
  //发送校验位
  while(PS2CLK); //等待时钟线变低
  switch(sentchar_chk)
  {
     case 0:
     case 2:
     case 4:
     case 6: PS2DATA =1;break;//奇校验
     case 1:
     case 3:
     case 5:
     case 7: PS2DATA = 0;break;//奇校验
     default:break;
  }
  while(!PS2CLK);   // 等待时钟线变高
  while(PS2CLK);    // 等待时钟线变低
  PS2DATA =1;       //  发送停止位,停止位总为1
  //while(!PS2CLK)  ; // 等待时钟线变高
  //while(PS2CLK)   ; // 等待时钟线变低
  //接收ACK
  //if(PS2_SGN_DATA) error();
  //ACK信号由键盘发出,总为低电平
  //while(!PS2CLK)  ; // 等待时钟线变高
  SEI(); //开外部中断1
}

*/

出0入84汤圆

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

本版积分规则

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

GMT+8, 2024-9-28 11:21

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

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