PS2无线手柄解码 附单片机程序

2019-10-29来源: 51hei关键字:PS2  无线手柄  解码  单片机

参考前辈大虾的资料,用Atmega128A对PS2无线手柄进行解码,并在8位数码管上显示按键值

自己总结如下:
蹬蹬蹬。。。主角登场:
无线PS2手柄+遥控接收器+便于接线的转接板
 


遥控接收器和转接板插接在一起后的样子 

转接板上的接线引脚有以下几个:
DAT->手柄到单片机 同步传送于时钟下降沿 时序图中的DI
CMD->单片机到手柄  同步传送于时钟下降沿 时序图中的DO      
CS->提供手柄触发信号,通讯期间处于低电平
CLK->时钟信号,由单片机发出

 


引用其他资料的说明如下:
1.“通讯过程中, 一串数据通讯完成后 CS 才会由低转高,不是 1 个字节通讯完成后就由低转高,在通讯期间,一直处于低电平。”
2.“在时钟下降沿时,完成数据的发送与接收,发送和接收是同时完成的。当单片机想读手柄数据或向手柄发送命令时,将会拉低 CS 线电平,并发出一个命令“0x01”;手 柄会回复它的 ID “0x41=绿灯模式,0x73=红灯模式”;在手柄发送 ID 的同时,单片机将传送 0x42,请求数据;随后手柄发送出 0x5A,告诉单片机‘数据来了’”
3.“一个通讯周期有 9 个字节(8 位),这些数据是依次按位传送”


  以上说白了就是:
  按照时序图,每次通讯周期,都是先给手柄(也就是单片机给接收器)通过CMD引脚(DO)依次发9组数据,分别是:
  0x01,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00

  与此同时,通过DAT引脚(DI)收到相对位的9组数据,程序中我将收到的数据存在了re_code[ ]这个数组中;
  手柄上的按键码值被存储的位置如下:
  re_code[3]==0xEF  //左4个按键的 上
  re_code[3]==0xBF  //左4个按键的 下
  re_code[3]==0x7F  //左4个按键的 左
  re_code[3]==0xDF  //左4个按键的 右
  re_code[3]==0xFE  //SELECT键
  re_code[3]==0xF7  //START键

  re_code[4]==0xEF  //右4个按键的 △
  re_code[4]==0xBF  //右4个按键的 ×
  re_code[4]==0x7F  //右4个按键的 □
  re_code[4]==0xDF  //右4个按键的 ○

  re_code[4]==0xFB  //左1,2个按键的 L1
  re_code[4]==0xFE  //左1,2个按键的 L2
  re_code[4]==0xF7  //右1,2个按键的 R1
  re_code[4]==0xFD  //右1,2个按键的 R2

没有按键按下时,以上各位数组中的值为FF,按键按下数组值变化,并且支持按键组合键值输出。
当手柄MODE LED灯不亮时,左右摇杆功能等同左四右四按键

当按下MODE键手柄MODE LED红灯亮起
 

这个时候,左右两个摇杆就能线性输出了,有点像汽车油门有个逐渐变化量
左右摇杆处于中位时的左右值为80,上下值为7F

  re_code[5] 00——80——FF 右摇杆从左到右
  re_code[6] 00——7F——FF 右摇杆从上到下
  re_code[7] 00——80——FF 左摇杆从左到右
  re_code[8] 00——7F——FF 左摇杆从上到下

--------------------------------------------------------------------------------------------------
数码管从左至右每2位对应的分别是
左摇杆的左右值(re_code[7] 里的值)
左摇杆的上下值(re_code[8] 里的值)
左4个按键的键值(re_code[3] 里的值)
右4个按键及侧面LR的键值(re_code[4] 里的值)
正常模式时,如图左侧的小红灯(MODE LED)不亮,头四位数码管不会变化只显示FFFF
 


按下←键的显示
 


按下右侧 “×” 键的键值显示
 


按下【MODE】按钮,小红灯亮起,摇杆处于中间位置时的数码管显示
807F就显示了左侧摇杆位于中位的左右值和上下值
 


左摇杆被摇动时的线性值显示
 

 



程序中柄遥控接收器接口定义:
// DAT->  in  PD0     设置为输入
// CMD-> out PD1   设置为输出        
// CS->    out PD2
// CLK->  out PD3



这个PS2手柄还有震动功能,本次没有弄出来,还请哪位大虾指点一二。
为了不浪费大家的黑币(我的黑币就总不够用),我就直接将程序贴出来了,如下,不对的地方还请指正——————————————————————————————————————————————————————

#include  

#include

#define uchar unsigned char

#define uint unsigned int


#define cmd_set     (PORTD |=(1<

#define cmd_clr     (PORTD &=~(1<

#define cs_set        (PORTD |=(1<

#define cs_clr        (PORTD &=~(1<

#define clk_set       (PORTD |=(1<

#define clk_clr       (PORTD &=~(1<


  //DO数据

uchar scan[9]={0x01,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

  //存放DI数据

uchar re_code[9];                                             

uint m;


//共阴数码管段码 

uchar ddd[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};

//位码

uchar www[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};                                                                                


void port_init(void)

{

  DDRE=0xff;

  PORTE=0x00;  //段选


  DDRB=0xff; 

  PORTB=0xff;  //位选        

        

  //PD0->DAT输入;PD1->CMD输出;PD2->CS输出;PD3->CLK输出

  DDRD  =(0<

  PORTD =0;

}


void delay(uint n)

{

        uint i;

        for(i=0;i

}


uchar scanout(uchar command)   //向手柄发送命令并接受反馈的子程序

{

    uchar i,j=1;

    uchar res=0; 

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

    {

          if(command&0x01)      cmd_set;

          else                            cmd_clr;

          command=command>>1;

          delay(1);

          clk_clr;

          delay(1);                              //这里延时很关键,太多了手柄就反应迟钝了

          if(PIND&0x01) res=res+j;      //这里就开始同步接收DI值了 

          j=j<<1; 

          clk_set;

          delay(2);                 

    }

    return res;        

}

void Read_PS2(void)        //向手柄发送DO并将反馈DI存入re_code[ ]中

{

         uchar i;

         cs_clr;

         for(i=0;i<9;i++)        re_code=scanout(scan);

         cs_set;        

}                                              

void main(void)

        port_init();

        delay(50);

  while(1)

         {

         Read_PS2(); 

         delay(200);

         

         m=re_code[3]*256+re_code[4];

                 

         PORTE=ddd[m/256/16];

         PORTB=www[3];

         delay(50);

         PORTE=ddd[m/256%16];

         PORTB=www[2];

         delay(50);

         PORTE=ddd[m%256/16];

         PORTB=www[1];

         delay(50);

         PORTE=ddd[m%256%16];

         PORTB=www[0];

         delay(50);

                 

         PORTE=ddd[out[7]/16];

         PORTB=www[7];

         delay(50);

         PORTE=ddd[out[7]%16];

         PORTB=www[6];

         delay(50);

         PORTE=ddd[out[8]/16];

         PORTB=www[5];

         delay(50);

         PORTE=ddd[out[8]%16];

         PORTB=www[4];

         delay(50);        

[1] [2]
关键字:PS2  无线手柄  解码  单片机 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic478600.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:warning: #1295-D: Deprecated declaration spistar - give arg types
下一篇:AVR片内两个串口互相通信的单片机源码

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

PS7219的PIC单片机接口程序
; Copyright (c) 1998, MICROCHIP Technology Inc ;******************************************* TITLE "PS7219 TEST" ;标题 LIST P=16C711 ;处理器为PIC16C711单片机 #INCLUDE P16c711.INC   TIMER1 EQU H'000C' ;定义延时寄存器 TIMER2 EQU H'000D' SENT_ADDRESS EQU H'000E'
发表于 2019-10-22
索尼PS5更多参数揭秘:GPU频率高达2GHz
6 TFLOPs和4.2 TFLOPs。  最近有传言称,索尼将于2020年2月12日举办PlayStation大会,届时PS5有望发布。
发表于 2019-08-22
欧洲团队研发新型固态快离子导体 加快充放电速度
(图源:UCLouvain官网)据外媒报道,研究人员发现一种新的固态快离子导体LiTi2(PS4)3,也可称为LTPS。如果通过测试,使用这种材料的电池储能更高、充放电更快,而且安全性也更高,可以应用于智能手机、电动自行车和汽车等领域。目前,锂离子电池中常用的液态有机电解质非常易燃,影响电池的使用。向固态电池转变,具有多方面优势,包括安全性。但是,固态锂离子的流动性比不上液态锂离子,从而限制了电池的充放电性能。研究人员称,了解晶体结构如何决定离子扩散,是促进快离子导体发展的根本。据介绍,LiTi2(PS4)3的锂离子扩散系数,要高于当前最先进的锂超离子固态导体Li10GeP2S12。这是因为LiTi 2(PS 4) 3独特的
发表于 2019-08-11
欧洲团队研发新型固态快离子导体 加快充放电速度
索尼下一代VR头显设计图曝光,无线传输方案
近期外媒ultragamerz曝光了一组疑似索尼下代VR头显的设计图,其表示PS VR 2可能采用无线传输方案,虽然这个方案并不是第一次听说,但是这次似乎消息要证明更为明确。 首先,根据其从消息人士(来自索尼设计中心)表示,下一代PS VR将为无线方案,因为VR一体机和PC VR无线化是一个大的趋势。  当然,这张图可能是设计中的一种方案而已,其中LLW就是这里的关键,其在头显前方和头箍后分别又一个LLW无线模块接口。 LLW通常指的是超低延迟WiFi,是一种无线传输技术。目前,DisplayLink在2017年推出基于60GHz的无线传输方案,HTC官方无线适配器就采用和英特尔合作的
发表于 2019-07-23
索尼下一代VR头显设计图曝光,无线传输方案
群联搭上PCIe 4.0快车,研发新SSD主控速度可达6.5GB/s
群联(Phison) 表示固态硬盘的传输速度在2020年有望达到6.5GB/s(6500MB/s)。目前影驰、十铨、技嘉、海盗船、博帝、Essencore/Klevv等厂商已经推出了采用群联PS5016-E16主控的PCIe 4.0固态硬盘,连续读取速度大约有5GB/s,而相比而言目前最新的NVMe固态硬盘的连续读取性能在3.5GB/s左右。  群联PS5016-E16作为全新旗舰型号,采用双核心CoXProcessor处理器,支持8个通道和32颗闪存芯片,接口数据率800MT/s,持续读写性能可达5GB/s、4.4GB/s,相比PCIe 3.0 x4提升多达43%、33%。  群联表示目前
发表于 2019-06-14
索尼无线手柄推出四款配色 售价420元
昨日晚间,索尼PlayStation官方公布了DUALSHOCK4无线手柄四款全新配色,售价420元,将于9月6日上市。  据官方称,DUALSHOCK4无线手柄的产品系列目前已有超过25种不同配色设计,为索尼PlayStation用户提供了丰富多彩的个性化选择。此次推出了电光紫、迷彩红、钛金蓝和玫瑰金配色共四种全新配色。  电光紫配色采用两种颜色的紫色设计,右边按键图案使用白色,更加突出;迷彩红主色采用红色,辅以黑色和棕色形成迷彩图案;钛金蓝采用金属质感的配色,后方的颜色略深;玫瑰金也使用了两种颜色搭配设计。      此外,索尼还公布了全新色彩的无线立体声耳机(玫瑰金色)将于10月25日上市,建议
发表于 2019-08-22
索尼无线手柄推出四款配色 售价420元
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved