参考前辈大虾的资料,用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< //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< } 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小板就是前些日子被我熔丝位写错导致昏迷后又救回来的那位。。
上一篇:warning: #1295-D: Deprecated declaration spistar - give arg types
下一篇:AVR片内两个串口互相通信的单片机源码
推荐阅读
史海拾趣
随着国内市场的日益饱和,博林公司开始积极拓展海外市场。公司制定了详细的国际化战略,通过参加国际展览、建立海外销售渠道等方式,不断提升品牌知名度和影响力。同时,博林公司还积极寻求与国际知名企业的合作机会,通过技术合作和市场共享等方式,实现互利共赢。这些举措使得博林公司的市场份额不断扩大,国际竞争力日益增强。
随着产品线的不断丰富和技术实力的不断提升,Aborn Electronics开始积极寻求市场拓展。公司先后在国内外多个地区设立了销售网点和分支机构,并通过参加各类行业展会和论坛,加强与其他企业的交流与合作。同时,Aborn Electronics注重品牌建设,通过提升产品质量和服务水平,逐渐树立起了良好的企业形象和口碑。
在LED照明产品的生产过程中,DDP Engineered LED Solutions公司始终坚守品质控制的原则。公司建立了严格的生产流程和质检标准,确保每一件产品都符合质量要求。同时,公司还积极引入先进的生产设备和管理系统,提升生产效率和产品质量。正是这些努力,让DDP的产品在市场上赢得了客户的信任和好评,为公司赢得了良好的口碑。
Analytic Instruments Corp成立于XXXX年,最初由几位热衷于电子测量与分析技术的工程师创立。他们凭借对行业的深刻理解和敏锐的市场洞察力,研发出了一款具有创新性的电子测量仪器,该仪器在精度和稳定性上均优于市场上的同类产品。这一技术突破使得公司在创业初期就获得了市场的认可,为后续的发展奠定了坚实的基础。
背景:FRONTIER Electronics作为一家专注于无源元件和集成无源元件设计与制造的公司,自成立以来便致力于技术创新。
发展故事:在21世纪初,FRONTIER Electronics凭借其在电感器、变压器、二极管等领域的深厚技术积累,成功推出了一系列高性能、高可靠性的电子产品。随着市场需求的不断增长,公司逐步扩大生产规模,并在全球范围内建立了完善的销售网络。通过持续的技术研发和市场拓展,FRONTIER Electronics逐渐在电子行业中崭露头角,成为该领域的领军企业之一。
随着企业规模的扩大和影响力的提升,泽耀科技(Ashining)开始积极承担社会责任,推动可持续发展。公司注重环保和节能技术的应用,致力于生产环保型电子产品,减少生产过程中的能源消耗和环境污染。同时,泽耀科技还积极参与社会公益事业,为社会的发展贡献自己的力量。
这些故事展示了泽耀科技(Ashining)在电子行业中的发展历程和取得的成就,也体现了公司不断创新、追求卓越的精神。未来,泽耀科技将继续秉持这一精神,为电子行业的发展贡献更多的力量。
我司有STN 、CSTN、TFT液晶屏控制驱动板,能用51、PIC单片机、DSP控制,能显示256--65536色,价格低廉,编程简单,适合于点阵为320*240 640*480的数字屏,提供各种工控液晶屏,液晶屏驱动方案,控制IC,如有需求,与我联系。 0755-8126 ...… 查看全部问答∨ |
|
还是用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 ...… 查看全部问答∨ |
|
做了一批板子,有10%左右上电不能复位,用的是一般的RC电路,应该不是RC质量问题,板子已经做好了,不可能加器件了,目前用的是100K+104电容,我目前如何才能挽救?CPU是F123… 查看全部问答∨ |
不知道出售帖算不算违规,想出售zigbee模块,只做了一次毕业设计,九九成新 本帖最后由 ddllxxrr 于 2016-1-7 16:57 编辑 只用了一次,几乎全新,带各种资料,需要的联系QQ372138862 … 查看全部问答∨ |