PS2相关接口资料

news/2024/4/19 2:33:13

PS2鼠标规范 rar

ps2技术参考rar

PS2中文资料pdf

先存在这里,用的时候再说,下来是网上找到的相关程序。

单片机与PS2键盘接口程序

单片机与PS2键盘接口程序(转载自大虾电子网)

void int1proc() interrupt IE1_VECTOR using 1
{
unsigned char i, key;
code unsigned char PS2TAB[] = {//20键PS2小键盘键码表
  0x70,//0
  0x69,//1
  0x72,//2
  0x7a,//3
  0x6b,//4
  0x73,//5
  0x74,//6
  0x6c,//7
  0x75,//8
  0x7d,//9
  0x05,//F1
  0x06,//F2
  0x04,//F3
  0x0c,//F4
  0x03,//F5
  0x0b,//F6
  0x5a,//Enter
  0x76,//Esc
  0x66,//Bksp
  0x71//KP.
  };
  if (PS2Buffers.PS2KeyCount == 0){//PS2起始位测试
    if (!PS2CLOCK && !PS2DATA){//低电平是起始位
      if (PS2Buffers.PS2KeyExtFlage != 0xf0){
        PS2Buffers.PS2KeyTemp = 0;
        PS2Buffers.PS2KeyExtFlage = 0;
        PS2Buffers.PS2KeyPopError = 0;
      }
      PS2Buffers.PS2KeyCount ++;//脉冲计数
    }
    else PS2Buffers.PS2KeyPopError = 0xeb;//置键起始位错误号0xeb
  }
  else if (PS2Buffers.PS2KeyCount < 9){//PS2数据位
    key = PS2Buffers.PS2KeyTemp;//取键盘缓冲区移位数据
    key >>= 1;
    if (PS2DATA) key |= 0x80;
    PS2Buffers.PS2KeyTemp = key;
    PS2Buffers.PS2KeyCount++;//脉冲计数
  }
  else if (PS2Buffers.PS2KeyCount == 9){//PS2数据奇校验
    ACC = PS2Buffers.PS2KeyTemp;//取键盘缓冲区移位数据(C51取偶校验位)
    if (P != PS2DATA) PS2Buffers.PS2KeyCount ++;//脉冲计数
    else{
      PS2Buffers.PS2KeyPopError = 0xec;置键奇校验位错误号0xec
      PS2Buffers.PS2KeyCount = 0;//脉冲计数归零
    }
  }
  else if (PS2Buffers.PS2KeyCount == 10){//停止位
    key = PS2Buffers.PS2KeyTemp;//取键盘缓冲区移位数据
    PS2Buffers.PS2KeyCount = 0;//脉冲计数归零
    if (PS2DATA){//高电平是停止位
      if (key == 0xe0){//本次是扩展键
        PS2Buffers.PS2KeyExtFlage = 0xe0;//置扩展键标志(小键盘只有回车键)
      }
      else if (key == 0xf0){//本次是键断码,键释放
        PS2Buffers.PS2KeyExtFlage = 0xf0;//置键释放标志
      }
      else{//本次必为键值
        if ((key == 0xaa) || (key == 0xfa)) PS2Buffers.PS2KeyPushCount = 0;//长
压键计数器清零
        else{
            PS2CLOCK = 0;//阻止PS2键盘立即回送数据
          PS2Buffers.PS2KeyPopError = 0xaa;//出错码
          for (i = 0; i < 20; i++){
            if (key == (PS2TAB[i])){//搜索
              key = i + 1;
              if (PS2Buffers.PS2KeyExtFlage == 0xf0){
                key |= 0x80;//键释放
                PS2Buffers.PS2KeyPushCount = 0;//长压键计数器清零
                PS2Buffers.PS2KeyMessage = key;//存入当前键值并执行命令
              }
              else{
                if (key != PS2Buffers.PS2KeyVal){//换了一个键
                  PS2Buffers.PS2KeyPushCount = 0;//长压键计数器清零
                  PS2Buffers.PS2KeyMessage = key;//存入当前键值并执行命令
                }
                else{//未换键
                  PS2Buffers.PS2KeyPushCount ++;//长压键计数器计数
                  if (PS2Buffers.PS2KeyPushCount > DEFPS2PUSHCOUNT){//长压时间到
                    PS2Buffers.PS2KeyMessage = key | 0x40;//存入当前键值并执行命

                    PS2Buffers.PS2KeyPushCount = 0;//长压键计数器清零
                  }
                }
              }
              PS2Buffers.PS2KeyVal = key;//存入当前键值值1~20或0x80+(1~20)
              PS2Buffers.PS2KeyTemp = 0;//键码移位记录器
              PS2Buffers.PS2KeyExtFlage = 0;//扩展键标志
              PS2Buffers.PS2KeyPopError = 0;//键释放标志或出错码
              break;
            }
          }
          if (PS2Buffers.PS2KeyPopError) PS2Buffers.PS2KeyPushCount = 0;//长压键
计数器清零
          PS2CLOCK = 1;//释放PS2时钟总线
        }
      }
    }
    else PS2Buffers.PS2KeyPopError = 0xed;//置停止位错误号0xed
  }
  else PS2Buffers.PS2KeyCount = 0;//PS2键盘出错
}
/*------------------------------------------------------------------
         利用函数指针数组运行PS2键盘散转命令
-------------------------------------------------------------------*/
void PS2CommandExec(unsigned char key)
{
unsigned int i;
code void *funcpushbuffers[] = {//命令散转表(汇编中的16个DW)
/*------------------------------------------------------------------
         15个压键、放键及长压键事件处理函数指针地址
-------------------------------------------------------------------*/
  (void *)ClrWdt            + 0x0000,
/*---------------------------------------------
           10个功能键压键事件处理(独立管理)
----------------------------------------------*/
  (void *)PS2F1KeyPush      + 0x5b7d,      //功能键F1压键事件处理
  (void *)PS2F2KeyPush      + 0xa6ea,      //功能键F2压键事件处理
  (void *)PS2F3KeyPush      + 0xf157,      //功能键F3压键事件处理
  (void *)PS2F4KeyPush      + 0x4cc4,      //功能键F4压键事件处理
  (void *)PS2F5KeyPush      + 0x9731,      //功能键F5压键事件处理
  (void *)PS2F6KeyPush      + 0xe2ae,      //功能键F6压键事件处理
  (void *)PS2EnterKeyPush   + 0x3d1b,      //功能键Enter压键事件处理
  (void *)PS2EscKeyPush     + 0x8888,      //功能键Esc压键事件处理
  (void *)PS2BkspKeyPush    + 0xd3f5,      //功能键Bksp压键事件处理
  (void *)PS2KpKeyPush      + 0x2e62,      //功能键Kp压键事件处理
/*---------------------------------------------
           2个放键事件处理(集中管理)
----------------------------------------------*/
  (void *)PS2NumberKeyPop   + 0x79df,      //数字键放键事件处理
  (void *)PS2FuncKeyPop     + 0xc44c,      //功能键放键事件处理
/*---------------------------------------------
           2个长压键事件处理(集中管理)
----------------------------------------------*/
  (void *)PS2NumberKeyPushL + 0x1fb9,      //数字键长压键事件处理
  (void *)PS2FuncKeyPushL   + 0x6a26,      //功能键长压键事件处理
/*---------------------------------------------
           1个数字键压键事件处理(集中管理)
----------------------------------------------*/
  (void *)PS2NumberKeyPush  + 0xb593       //数字键0~9压键事件处理
  };
/*--------------------------------------------*/
  i = key;
  key &= 0x3f;//去掉键释放及长压键标志,取真键码
  key --;
  if (key < 20){//只有20个键
    if (key < 10){//数字键0~9
      if (i <= 10) key = 15;//(散转号0)压数字键0~9
      else{
        if (i & 0x80) key = 11;//(散转号11)放数字键0~9
        else key = 13;//(散转号13)长压数字键0~9
      }
    }
    else{//压功能键F1~F6,Enter..KP
      if ((i & 0xc0) == 0) key -= 9;//(散转号1~10)压功能键F1~F6,Enter..KP
      else{
        if (i & 0x80) key = 12;//(散转号12)放功能键
        else key = 14;//(散转号14)长压功能键
      }
    }
    ClrWdt();//喂狗(鬼知道键盘程序要运行多久,就替它先喂一次吧)
    i = ((key * 53 & 0xf) * 0x1000)+ ((key * 43 & 0xf) * 0x100) + ((key * 23 &
0xf) * 0x10) + (key * 13 & 0xf);
    _icall_((void *)funcpushbuffers[key] - i);//取键盘散转表并执行键盘命令
  }
}
这个程序与一般网上的有很大区别,它充分利用了外部中断(0字)hotpower[1次]

 

http://www.ppmy.cn/news/312956.html

相关文章

USB转换PS2接线原理

USB的A点对应PS2的3点&#xff0c;是接地&#xff1b; USB的D点对应PS2的4点&#xff0c;提供&#xff0b;5V电压&#xff1b; USB的B点对应PS2的5点&#xff0c;提供数据时钟&#xff1b; USB的C点对应PS2的1点&#xff0c;是数据接口。 不用任何芯片&#xff0c;直连通。…

ps2

1,钢笔工具P 绘制方法&#xff1a;点击绘制直线&#xff1b;点击拖动绘制曲线 ALT&#xff1a;点击节点可以将曲线变为直线&#xff1b;拖动节点可以将直线变为曲线&#xff1b;可以旋转手柄&#xff0c;将双手柄旋转变为单手柄旋转&#xff1b;点击端点节点可以去掉一个手柄。…

PS2摇杆

#include <PS2X_lib.h> //for v1.6 #include <Wire.h> #include "./Adafruit_PWMServoDriver.h" Adafruit_PWMServoDriver pwm Adafruit_PWMServoDriver(0x40); /** 定义端口号 */ #define PS2_DAT 13 //14 #define PS2_CMD 11 //…

PS2正确使用方法

首先是主机的部分 要放直的一定要使用纵置STAND(别卖.1500税拔) 这样可以避免再运转时震动的声音 以及因为用转过速而失去平衡倒下 还有放置地点的电气影响 所以一定要使用纵置STANT 没有纵置STAND的玩家就请忍耐一下 先放平的吧 放入的CD规格也有限制 纵置的…

ps2 烧机

2003年是PS2翻新机的年代、2004年是PS2“烧机”的年代 可能很多的PS2玩家都已经知道&#xff0c;PS2-5000X的主机会出现烧机的问题&#xff0c;烧机是什么一回事&#xff1f;烧机改如何维修&#xff1f;需要多少钱才能维修&#xff1f;怎么才能杜绝或者说是如何才能减少PS2烧机…

PS2键盘接口协议

一.电气特性 1 DATA Key Data 2 n/c Not connected 3 GND Gnd 4 VCC Power , 5 VDC 5 CLK Clock 6 n/c Not connected 二.数据格式 1个起始位总是逻辑08个数据位&#xff08;LSB&#xff09;低位在前1个奇偶校验位奇校验1个停止位总是逻辑11个应答位仅用在主…

本周大新闻|索尼PS VR2立项近7年;传腾讯将引进Quest 2

本周大新闻&#xff0c;AR方面&#xff0c;传立讯精密开发苹果初代AR头显&#xff0c;第二代低成本版将交给富士康&#xff1b;iOS 16.4代码曝光新的“计算设备”&#xff1b;EM3推出AR眼镜Stellar Pro&#xff1b;努比亚将在MWC2023推首款AR眼镜。 VR方面&#xff0c;传闻腾讯…

linux ps1 ps2 ps3 ps4

Linux用户命令行字符环境变量 - [Linux | UNIX] Apr 3, 2009 Tag&#xff1a; linux, PS1, PS2 版权声明&#xff1a;转载时请以超链接形式标明文章原始出处和作者信息及本声明http://fbirdzp.blogbus.com/logs/37423250.html 用户登录Linux系统的字符界面后&#xff0c;就会出…

PS2手柄通讯协议解析---附资料和源码

文章目录 一.PS2介绍二.PS2通讯协议介绍&#xff08;1&#xff09;PS2端口介绍&#xff08;2&#xff09;PS2通讯过程 三.基于STM32的PS2通信源码四.文档与源码下载链接 一.PS2介绍 今天就带大家来认识一下PS2的通讯协议&#xff0c;如果你需要用PS2无线手柄搭配单面机来DIY制作…

PS2接口和协议

这段时间在处理一个PS2键盘的问题&#xff1a;用自己设计的矩阵键盘模拟PS2键盘&#xff0c;用单片机的I/O口模拟PS2的接口&#xff0c;和主机通讯。 基本介绍&#xff1a; 虽然现在PS2在实际应用中越来越少&#xff0c;但是PS2在USB出来之前发挥了很大的作用。比如说我们的PS2…

PS2接口

一、简介。 PS2是一种非常古老的接口&#xff0c;随着USB接口的普及&#xff0c;目前已经有很多电脑不支持PS2接口了。 PS2接口主要应用在鼠标、键盘。 PS2缺点是体积大&#xff0c;不支持热插拔&#xff1b;优点是全键无冲突。&#xff08;也有部分USB键盘可以做到全键无冲…

【STM32 嵌入式设计】PS2索尼游戏手柄解析和代码开发

基于PS2索尼游戏手柄开发 最近师妹拿了个PS2手柄给我 安排&#xff01;&#xff01;&#xff01;&#xff01; 代码下载链接 在32上面 成功用PS2 控制显示屏输出 PS2是一个很好学习通讯时序的的工具 这里写下他的实现代码和我的学习思路 123456789DI/DATDO/CMDNCVDDGNDCS/S…

SONY无线PS2遥控手柄与stm32单片机通信

SONY的PS2无线手柄是索尼游戏机的遥控手柄&#xff0c;控制协议已被全球创客破解&#xff0c;可以方便用于机器人控制器&#xff0c;作为遥控输入设备。 这款手柄价格便宜&#xff0c;性价比极高。 原理 PS2无线手柄按键比较多&#xff0c;例如在一款游戏中的设定&#xff1…

异常数据检测 | Python实现孤立森林(IsolationForest)异常数据检测

文章目录 文章概述模型描述源码分享学习小结文章概述 异常数据检测 | Python实现孤立森林(IsolationForest)异常数据检测 模型描述 IsolationFores算法它是一种集成算法(类似于随机森林)主要用于挖掘异常(Anomaly)数据,或者说离群点挖掘,总之是在一大堆数据中,找出与其它数据…

计算机网络知识点笔记(1)概述

文章目录 1.计算机网络在信息时代中的作用2.互联网概述2.1.网络的网络2.2.互联网基础结构发展的三个阶段2.3.互联网的标准化工作 3.互联网的组成3.1.互联网的边缘部分3.1.1.客户-服务器方式3.1.2.对等连接方式&#xff08;P2P方式&#xff09; 3.2.互联网的核心部分3.2.1.电路交…

软件测试—冒烟测试

1. 核心 冒烟测试就是完成一个新版本的开发后&#xff0c;对该版本最基本的功能进行测试&#xff0c;保证基本的功能和流程能走通。 如果不通过&#xff0c;则打回开发那边重新开发&#xff1b; 如果通过测试&#xff0c;才会进行下一步的测试(功能测试&#xff0c;集成测试…

《剑指 Offer--LeetCode 学习计划》-- 字符串

剑指 Offer 05. 替换空格&#xff08;Easy&#xff09; 题目描述 请实现一个函数&#xff0c;把字符串 s 中的每个空格替换成"%20"。限制&#xff1a;0 < s 的长度 < 10000。 举例说明 示例 1&#xff1a; 输入&#xff1a;s “We are happy.”。输出&…

Xshell 上下左右键乱码^[[A^[[B^[[C^[[D

查看/etc/passwd文件 原来我的用户名后面没有指定/bin/bash 即 zhou:x:0:0::/home/zhou: 修改为&#xff1a; zhou:x:0:0::/home/zhou:/bin/bash 乱码得到永久解决

详解ref---->如何获取dom元素

受控组件: 基于修改数据/状态&#xff0c;让视图更新,达到需要的效果「推荐」 非受控组件: 基于ref获取D0M元素&#xff0c;我们操作DOM元素&#xff0c; 来实现需求和效果「偶尔」 获取ref的三种方式&#xff1a; class Demo extends React.Component {constructor(props) …

第1113期AI100_机器学习日报(2017-10-05)

AI100_机器学习日报 2017-10-05 爱奇艺视频场景下的自然语言处理应用 蚁工厂基于Xgboost LR Keras 建模评估用户信用状态 wx:人工神经网络和生物神经网络详细对比 wx:机器学习对话管理引擎 爱可可-爱生活DeepMind WaveNet语音合成技术正式产品化 爱可可-爱生活 好东西传送门…