ps2-controller源码解读:PS2I2C类如何把6字节I2C数据变成16个按键和4根摇杆
ps2-controller源码解读PS2I2C类如何把6字节I2C数据变成16个按键和4根摇杆【免费下载链接】ps2-controller源师兄扩展项目: PS2 | 由源师兄组织创建项目地址: https://gitcode.com/yuanshixiong/ps2-controllerps2-controller是源师兄开源的 PS2 手柄扩展项目通过 I2C 总线把 PS2 无线手柄接入「大师兄板」提供一套完整的 I2C 驱动与积木块。这篇文章做一次源码解读带你一步步看懂PS2I2C类是如何把 6 字节 I2C 数据拆解成 16 个按键和 4 个摇杆轴值的适合刚入门 I2C 和位运算的读者。一、30秒认识项目文件都藏在哪整个仓库非常精简核心驱动其实全部内嵌在一个文件里文件作用blocksdef.js定义积木块并把完整的 Python 驱动PS2I2C类作为代码模板内嵌其中category.json声明「PS2手柄」积木分类及其下的 3 个积木config.json项目元信息适配设备为大师兄板名称「PS2手柄」也就是说blocksdef.js 里pythonGenerator.definitions_[ps2_i2c_driver]这段模板就是本文要拆解的主角——一个标准的 PS2 无线手柄 I2C 驱动。二、先看数据帧6 字节里装着什么驱动假设手柄以7 位地址0x13挂在 I2C 总线上其中数据寄存器REG_PS2_DATA0xBB一次返回6 个字节字节0 字节1 字节2 字节3 字节4 字节5 方向键/系统 肩键/动作键 RX轴 RY轴 LX轴 LY轴 (8个按键) (8个按键) 0~255 0~255 0~255 0~255规律一目了然字节0、字节1各是一个 8 位位图每个 bit 代表一个按键两个字节正好 16 键字节2~5是 4 根摇杆轴的模拟量取值 0~255。这就是标题的答案雏形6 字节 16 个按键位 4 个摇杆通道。三、源码逐段拆解PS2I2C 类的 4 个核心方法1. 初始化一条 400kHz 的 I2C 总线def __init__(self, addressPS2_I2C_ADDRESS): self._bus I2C(1, freq400000) self._addr address self._buf bytearray(6)见 blocksdef.js。创建I2C(1)总线400kHz 快速模式并预分配一个 6 字节的缓冲区_buf用来缓存手柄数据。2._ensure_data()10ms 缓存避免刷屏式读取now self._ticks_ms() if self._last_update_ms and (now - self._last_update_ms) 10: return self._bus.writeto(self._addr, bytearray([REG_PS2_DATA])) data self._bus.readfrom(self._addr, 6)见 blocksdef.js。逻辑是先读寄存器0xBB选通数据再读 6 字节写入缓存10ms 内的重复查询直接复用缓存。这对游戏循环通常每秒几十次轮询非常关键——既保证响应灵敏又不会把 I2C 总线打满。3.is_button_pressed()位运算查按键按下 0value self._buf[byte_index] return (value (1 bit_index)) 0见 blocksdef.js。关键有两点按键→位置映射表类属性_BUTTON_MAP把每个按键名映射为(byte_index, bit_index)例如LEFT是字节0 的第7位、SQUARE是字节1 的第7位共 16 项见 blocksdef.js低电平有效该硬件约定按下的位为 0所以用屏蔽后判断是否等于 0。另外它还内置了一张形状符号兼容表传△、○、×、□及其变体也能正确识别对小朋友写积木程序非常友好。4.get_axis()4 个摇杆通道一次查表拿走if a LX: return self._buf[4] if a LY: return self._buf[5] if a RX: return self._buf[2] if a RY: return self._buf[3]见 blocksdef.js。摇杆没有位运算直接按字节下标取 0~255 的模拟值即可。四、从源码到积木3 个积木块让新手零门槛使用PS2I2C驱动对积木层是透明的category.json 里声明了 3 个积木与源码方法一一对应积木类型生成的 Python 代码手柄(I2C) 初始化ohcode_extend_ps2_i2c_init自动引入驱动并执行ps2 PS2I2C()PS2 按键是否按下ohcode_extend_ps2_i2c_button_pressedps2.is_button_pressed(CROSS)PS2 摇杆数值ohcode_extend_ps2_i2c_get_axisps2.get_axis(LX)初始化积木下拉 16 个按键选项、摇杆积木下拉 LX/LY/RX/RY 四轴——拼积木的过程本质上就是调用上文拆解过的两个方法这就是积木化封装的价值新手不用懂 I2C 和位运算也能驱动手柄。五、速查表16 个按键的位位置字节bit7bit6bit5bit4bit3bit2bit1bit0字节0LEFTDOWNRIGHTUPSTARTR3L3SELECT字节1SQUARECROSSCIRCLETRIANGLER1L1R2L2摇杆字节2RX字节3RY字节4LX字节5LY均 0~255。六、新手避坑指南按下是 0 不是 1判断逻辑是(value (1 bit)) 0改代码时千万别写反未知按键安全返回 Falseis_button_pressed对不认识的按键名直接返回False不会抛异常⏱️善用 10ms 缓存在快速循环里连续调用查询接口是安全的缓存机制已兜底地址别写错7 位地址是0x13寄存器0xAA读模式 IDget_id见 blocksdef.js0xBB读 6 字节数据。写在最后ps2-controller用一个不足 100 行的 Python 类完整演示了 I2C 从设备的典型套路固定寄存器 位图按键 模拟量轴 短时缓存再用 3 个积木块把它变成新手友好的可视化接口。读懂 blocksdef.js 这一个文件你也就拿到了自己的 I2C 外设驱动模板。【免费下载链接】ps2-controller源师兄扩展项目: PS2 | 由源师兄组织创建项目地址: https://gitcode.com/yuanshixiong/ps2-controller创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

lavish-axi接入Claude Code等Agent的4种方式:skill、hook与plugin完整指南

lavish-axi接入Claude Code等Agent的4种方式:skill、hook与plugin完整指南

lavish-axi接入Claude Code等Agent的4种方式:skill、hook与plugin完整指南 【免费下载链接】lavish-axi HTML is the new markdown. Lavish is the new editor for your HTML artifacts. 项目地址: https://gitcode.com/gh_mirrors/la/lavish-axi lavish-axi…

2026/9/25 1:28:30 阅读更多 →
拆解 easy-loading-cj 核心:EasyLoading 组件如何用 Stack + 遮罩承载 27 种动画

拆解 easy-loading-cj 核心:EasyLoading 组件如何用 Stack + 遮罩承载 27 种动画

拆解 easy-loading-cj 核心:EasyLoading 组件如何用 Stack 遮罩承载 27 种动画 【免费下载链接】easy-loading-cj easy-loading提供多种 loading/Toast 动画加载效果 项目地址: https://gitcode.com/Cangjie-TPC/easy-loading-cj easy-loading-cj 是一个基于…

2026/9/25 1:28:30 阅读更多 →
mp3-module TF卡音乐命名指南:0001.wav文件格式与按名播放的差异一次讲清

mp3-module TF卡音乐命名指南:0001.wav文件格式与按名播放的差异一次讲清

mp3-module TF卡音乐命名指南:0001.wav文件格式与按名播放的差异一次讲清 【免费下载链接】CupCode_mp3模块 源师兄扩展项目: MP3模块 | 由源师兄组织创建 项目地址: https://gitcode.com/yuanshixiong/mp3-module 源师兄的 CupCode_mp3 模块是面向源师兄板的…

2026/9/25 1:28:30 阅读更多 →

最新新闻

STM32驱动DHT11温湿度传感器:单总线时序与HAL库实现

STM32驱动DHT11温湿度传感器:单总线时序与HAL库实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 6:41:11 阅读更多 →
STM32 SWD/JTAG通信失败排查指南:从接线到救砖的完整流程

STM32 SWD/JTAG通信失败排查指南:从接线到救砖的完整流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 6:41:11 阅读更多 →
开源30MHz任意波形发生器:DDS原理、原理图与调试波形全解析

开源30MHz任意波形发生器:DDS原理、原理图与调试波形全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 6:41:10 阅读更多 →
随机短视频管理系统源码实战:Vue3后台+FastAPI调度全解析

随机短视频管理系统源码实战:Vue3后台+FastAPI调度全解析

简介:这是一套基于PHPMySQL构建的全新UI随机美女短视频管理系统源码,适合有PHP基础、希望快速搭建短视频内容管理平台的开发者或运营人员使用。系统采用前后端分离设计,前端适配手机、平板与桌面浏览器,后台基于RBAC权限模型支持管…

2026/9/25 6:41:10 阅读更多 →
R与RStudio版本更新全攻略:跨平台操作与包迁移技巧

R与RStudio版本更新全攻略:跨平台操作与包迁移技巧

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 6:41:10 阅读更多 →
探地雷达GPR数据处理全流程:从A-Scan到B-Scan、速度分析与三维切片

探地雷达GPR数据处理全流程:从A-Scan到B-Scan、速度分析与三维切片

简介:GPR.zip打包了一份面向探地雷达从业者与学习者的完整资料,内容涵盖GPR数据原理、无损检测应用及GPRConsole软件源码,适合地质勘查、工程检测、考古等领域的算法研究与二次开发。压缩包共28个文件,以C源码为主,包括…

2026/9/25 6:40:10 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →