|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
(DIY)AVR 90S2313制作PDA游戏手柄全过程! |
作者:janeslee 栏目:单片机 |
周六闲了一点,拿PDA玩了一阵傲气雄鹰,NND,破方向键实在是恼人,一气之下想自己DIY一个手柄玩玩。 搞了一下午,到晚上终于成功了。下面把详细制作过程汇报一下,也让AVR刚入门的或尚未入门的同学参考参考,老TX就不要踢了。 1、参考资料: 串口游戏手柄,顾名思义就是通过串口把按键数据发送到PDA,PDA上需要一个驻留的DRIVER,随时监控串口,与键盘同步及接收按键数据,并把按键数据映射产生按键键码。由于没有PDA上的CE编程经验,也觉得没必要搞那么复杂,就想利用现成的游戏手柄驱动,但找了半天,对于成品的游戏手柄无法获知其通讯协议,无从下手。后来搜到ThinkOutside公司的通用键盘驱动,并发现了一份技术资料,找到了突破口,参考资料如下: a)http://www.splorp.com/pdf/stowawayhwref.pdf 这篇文档为在IPAQ上移植LINUX时与stowaway键盘接口的驱动程序源代码,值得参考。 2、制作过程: a) 在ThinkOutside公司网站下载驱动程序,在Microsoft WM2003模拟器上装,并将COM1仿真成WM2003设备串口,按stowaway接口方式把COM2接到COM1上,COM2用SSCOM32来驱动,通过在COM2发送HEX键码测试,成功的在WM2003仿真器中收到键码。 注:COM2的RTS到COM1的DCD,以模拟DCD同步脉冲 b) 通过模拟看到胜利的曙光,还磨蹭啥?动手呗,选型?当然再熟悉不过的AVR啦,焊板子啦! 。。。。。。。。。。。。。。。。折腾1小时左右 本来想找个现成手柄改的,可惜以前一个红白机手柄咋也找不到了:( 焊好的板子背面: 焊好的板子正面: 我的是dopod686,就直接焊了个22PIN插头。 c) 在PDA上装驱动,ThinkOutside通用驱动中文3.11版: 插上键盘,找到了!!! 打开wold,按键,出现A、S、D等我映射的FIRE1/2/3键码,OK,测试成功,下一步,开玩了! 在傲气雄鹰option中将开火、暂停等键映射到A/S/D即可,方向键本身就是映射为方向,无需修改。 3、DIY资源: a)原理图: 图上的串口接口是5根线,已标注其含义,不同的PDA只需要将每根线接到对应的接口上即可,附DOPOD686接口: ------------------------------------ 22PIN管脚 含义 对应JP1管脚 6 DCD 3 9 RTS 4 10 RXD 2 11 DTR 1 16 GND 5 b)程序,源代码,可扩展更多按键甚至制作完整的QWERTY键盘 (注:未经作者允许请勿用于商业应用) // PPC2003 GamePad or KEYBOARD // date: 06-7-8 17:46:41 // Target: AT90S2313 // Author: LayzerLee MSN:janesleecn@hotmail.com // HEADER file #include <io2313.h> #include <inavr.h> // Definition & Macro #define FALSE 0 #define TRUE 1 #define BTUP PB7 // 上 #define BTRIGHT PB6 // 右 #define BTLEFT PB5 // 左 #define BTDOWN PB4 // 下 #define BTF1 PD5 // Fire 1 #define BTF2 PD4 // Fire 2 #define BTF3 PD3 // Fire 3 #define DCD PD2 // UART DCD 输出 #define TXD PD1 // UART TXD 输出 #define RTS PD0 // UART RTS 输入 #define BUP 0x80 #define BRIGHT 0x40 #define BLEFT 0x20 #define BDOWN 0x10 #define BF1 0x08 #define BF2 0x04 #define BF3 0x02 #define BRTS 0x01 #define FOSC 3579545L // 晶振频率 #define BAUDRATE 9600L // 波特率 #define TMR0FREQ 1000L // Timer0 中断频率 1000Hz #define TMR0CLKDIV 64L // Timer0 分频比 #define KEYDEBOUNCE 30L // 键盘去抖 30ms #define SETB(p,b) (p |= (1 << b)) #define CLRB(p,b) (p &= ~(1 << b)) #define CHKB(p,b) (p & (1 << b)) // GLOBAL variables unsigned CHAR gbSyncFlag, // 已同步标志 gbSync_Req, // 同步请求标志 gbKeyRefresh, // 键码变化标志 gBKeyDebounce, // 去抖寄存器 gBKeyCode, // 键码 gBKeyCode_Old, // 主程序中存储的以前键码 gBKeyCode_Save; // 用于中断判 |
2楼: | >>参与讨论 |
作者: 笑苍天 于 2006/7/10 15:32:00 发布:
强人强文啊 抢个沙发,学习ing。 |
3楼: | >>参与讨论 |
作者: sballbobo 于 2007/3/28 20:33:00 发布:
楼主,虚心的向你请教 楼主,我有几个虚心的问题想先您请教啊。怎样与你取得联系啊? |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |