历史上的今天

今天是:2024年10月29日(星期二)

正在发生

2019年10月29日 | PS2无线手柄解码 附单片机程序

发布者:Meiren520 来源: 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);        

        }


下面图片中那个红色的atmega128小板就是前些日子被我熔丝位写错导致昏迷后又救回来的那位。。

IMG_20171125_200654R.jpg

IMG_20171125_201018R.jpg

IMG_20171125_202201R.jpg

IMG_20171125_202209R.jpg


关键字:PS2  无线手柄  解码  单片机 引用地址:PS2无线手柄解码 附单片机程序

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

推荐阅读

据报道,日本东京大学的研究人员开发了一种称为DRAGON(龙)的飞行机器人,旨在用于室内。DRAGON也意味着“具有多自由度空中变形能力的双旋翼嵌入式多连接机器人”。DRAGON由涵道风扇提供动力,可以在飞行中变换成不同的形状。 涵道风扇允许机器人变成方形、蛇形或其设计允许的任何其他形状。 能够改变形状的性能可以允许机器人横穿障碍物并穿过洞来达...
在本期,我们将隆重介绍 PiezoListen™,TDK 将在亚洲最大的国际展览之一——2019 日本电子高新科技博览会 (CEATEC 2019)上展出这款备受瞩目的全新压电扬声器。作为世界上最薄的扬声器之一(约 0.49 mm),无论安装在什么位置,PiezoListen 都能够在宽广的范围内产生高声压,因此这款扬声器具有极强的通用性。其应用几乎没有限制,例如,作为车内...
颇负盛名的英国房车锦标赛 (BTCC) 是一项始于 1958 年的悠久赛事。30 多辆精心设计的赛车为获胜竞相角逐,令赛事精彩壮观。2022年,英国房车锦标赛将会增加一个新的维度,并将成为业界首个采用轻度混合动力汽车的大型房车锦标赛。 BTCC 规定,驾驶员可以战术性地使用电动机提升车辆性能,并提高车辆加速能力。此合同已授予 Cosworth Electronics,该公司...
自动驾驶公司Aurora于2021年8月推出了有史以来第一个适用于自动驾驶卡车和乘用车的安全案例框架(Safety Case Framework)初始版本,解决了自动驾驶卡车和乘用车的安全问题。这使Aurora成为目前业内唯一一家公开分享其安全案例框架的自动驾驶公司。本文介绍Aurora自动驾驶安全框架的行业意义、5个安全原则、以及应用。 安全案例框架的意义 Aurora使用基...

史海拾趣

问答坊 | AI 解惑

51单片机控制彩屏电路图

我司有STN 、CSTN、TFT液晶屏控制驱动板,能用51、PIC单片机、DSP控制,能显示256--65536色,价格低廉,编程简单,适合于点阵为320*240  640*480的数字屏,提供各种工控液晶屏,液晶屏驱动方案,控制IC,如有需求,与我联系。  0755-8126 ...…

查看全部问答∨

示波器触发功能详解

触发是数字示波器区别于模拟示波器的最大特征之一。 触发是发现问题之后定位问题的最重要手段。数字示波器的触发功能非常丰富,善于使用触发能轻松定位出您想寻找到的异常信号或感兴趣的信号。很多工程师习惯于“Auto Setup”之后看到屏幕上出现波 ...…

查看全部问答∨

cadence问题求助-----4!

还是用orcad画原理图,发现以下疑问,请教各位高手帮忙解答一下: 1、两种连接符“<□P”和“<<c”的方向问题    选择这两种连接图时可选“left”和“right”等    请问连接方向是否跟输入输出有关系?还是只跟连接结 ...…

查看全部问答∨

【求助】程序调试不通,怎么回事啊?

/*目的是按下按键则蜂鸣器就发出声音,电路板是msp430F169的学习板*/ #include <msp430x16x.h> #define NO_KEY 0 //没有按键 #define KEY_K1 1 //按键1 #define KEY_K2 2 //按键2 #define KEY_K3 3 //按键3 #define STEP_IDEL 0 ...…

查看全部问答∨

430的RC复位电路如此不稳定??

做了一批板子,有10%左右上电不能复位,用的是一般的RC电路,应该不是RC质量问题,板子已经做好了,不可能加器件了,目前用的是100K+104电容,我目前如何才能挽救?CPU是F123…

查看全部问答∨

不知道出售帖算不算违规,想出售zigbee模块,只做了一次毕业设计,九九成新

本帖最后由 ddllxxrr 于 2016-1-7 16:57 编辑 只用了一次,几乎全新,带各种资料,需要的联系QQ372138862 …

查看全部问答∨

IO口中断问题

用P1.3按键进入中断,点亮LED1即P1.0 为什么我加了LPM3就进不了中断了?改成LPM0进不了中断咋回事? 解,LMP0和LPM1等几种模式如何选择? <msp430g2553.h> void main(void) { WDTCTL = WDTPW + WDTHOLD; P1DIR = BIT0 + BIT6; P1DIR ...…

查看全部问答∨

2003~2013元器件清单对比

本帖最后由 paulhyde 于 2014-9-15 03:37 编辑 RT 2003~2013元器件清单对比    …

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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