切换到宽版
爱科技/爱创意/爱折腾/爱极致;技术知识分享平台,点击进入新版数码之家网站
  • 4052阅读
  • 26回复

[外设]心情不好,做个东西逗自己玩(新加了固件源码) [复制链接]

上一主题 下一主题
离线coolcall
 

发帖
27
M币
192
专家
1
粉丝
5
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2013-02-26

先看看成品~
街机摇杆游戏控制器
用起来还是不错的 ^_^
模拟键盘按键,可支持6键同时按下
主要材料:1、摇杆和按钮 2、M8单片机 3、厚压缩板




下面来看看制作过程
1、程序开发调试(程序搞不好也不用做其他了,整个项目流产)


M8单片机测试,用于处理按键信息转换USB键盘信号



够乱吧,哈哈 xD

程序做好之后就要准备其他东西了
淘宝的两个摇杆和20按钮连运费一共58,也不知道是便宜还是贵

找朋友给了块厚木板


打印一张比例差不多的街机按键尺寸图,直接在圆的中间点戳个洞
用笔穿过洞,点在板上




又问朋友借
了把电钻和开孔器,开工


安装上按钮看看效果

做边框和底部

接线

基本完成了,找个砖家来试车,按键的反应点调了好久才调的差不多




电路板暂用平时的开发板,等有空再焊一块专用吧

开始玩游戏罗~哈哈,谢谢收看

下面是源码,我这程序好像有点不稳定,有时会USB通讯错误,看不出那的原因,还望各位大哥指教
  1. /* Name: HIDKEY.c
  2. * Project: HID-Test
  3. * Creation Date: 2013-01-28
  4. */
  5. #define F_CPU 12000000L /* evaluation board runs on 4MHz */
  6. #include <avr/io.h>
  7. #include <avr/interrupt.h>
  8. #include <avr/pgmspace.h>
  9. #include <avr/wdt.h>
  10. #include <util/delay.h> /* for _delay_ms() */
  11. #include "usbdrv.h"
  12. #include "oddebug.h"
  13. static uchar reportBuffer[7]={0}; /* buffer for HID reports */
  14. static uchar idleRate; /* in 4 ms units */
  15. /* ----------------------- hardware I/O abstraction ------------------------ */
  16. /* pin assignments:
  17. PB0 USB-
  18. PB1 USB+
  19. PB2 Key
  20. PB3 Key
  21. PB4 Key
  22. PB5 Key
  23. PC0 Key
  24. PC1 Key
  25. PC2 Key
  26. PC3 Key
  27. PC4 Key
  28. PC5 Key
  29. PC6 Key
  30. PD0 key
  31. PD1 key
  32. PD2 USB+ (int0)
  33. PD3 Key
  34. PD4 Key
  35. PD5 Key
  36. PD6 Key
  37. PD7 Key
  38. */
  39. static void hardwareInit(void)
  40. {
  41. PORTC = 0x3f; /* activate all pull-ups pc6脚为复位键下降沿即触发所以不可用*/
  42. DDRC = 0; /* all pins input m8的引脚只有7个,除掉pc6脚后就是0x3f*/
  43. PORTD = 0xfb; /*activate all pull-ups pd2为中断口,不能占用,故用0xfb*/
  44. DDRD = 0; /* all pins input */
  45. }
  46. /* ----------------------------- USB interface ----------------------------- */
  47. /* ------------------------------------------------------------------------- */
  48. //描述报告的大小要修改usbconfig.h的大小#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 35 /* total length of report descriptor */项
  49. PROGMEM char usbHidReportDescriptor[35] = { /* USB report descriptor */
  50. 0x05, 0x01, // USAGE_PAGE (Generic Desktop)
  51. 0x09, 0x06, // USAGE (Keyboard)
  52. 0xa1, 0x01, // COLLECTION (Application)
  53. 0x05, 0x07, // USAGE_PAGE (Keyboard)
  54. 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
  55. 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
  56. 0x15, 0x00, // LOGICAL_MINIMUM (0)
  57. 0x25, 0x01, // LOGICAL_MAXIMUM (1)
  58. 0x75, 0x01, // REPORT_SIZE (1)
  59. 0x95, 0x08, // REPORT_COUNT (8)
  60. 0x81, 0x02, // INPUT (Data,Var,Abs)
  61. 0x95, 0x06, // REPORT_COUNT (6)
  62. 0x75, 0x08, // REPORT_SIZE (8)
  63. 0x25, 0x65, // LOGICAL_MAXIMUM (101)
  64. 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
  65. 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
  66. 0x81, 0x00, // INPUT (Data,Ary,Abs)
  67. 0xc0 // END_COLLECTION
  68. };
  69. /* We use a simplifed keyboard report descriptor which does not support the
  70. * boot protocol. We don't allow setting status LEDs and we only allow one
  71. * simultaneous key press (except modifiers). We can therefore use short
  72. * 2 byte input reports.
  73. * The report descriptor has been created with usb.org's "HID Descriptor Tool"
  74. * which can be downloaded from http://www.usb.org/developers/hidpage/.
  75. * Redundant entries (such as LOGICAL_MINIMUM and USAGE_PAGE) have been omitted
  76. * for the second INPUT item.
  77. */
  78. /* Keyboard usage values, see usb.org's HID-usage-tables document, chapter
  79. * 10 Keyboard/Keypad Page for more codes.
  80. */
  81. #define MOD_CONTROL_LEFT (1<<0)
  82. #define MOD_SHIFT_LEFT (1<<1)
  83. #define MOD_ALT_LEFT (1<<2)
  84. #define MOD_GUI_LEFT (1<<3)
  85. #define MOD_CONTROL_RIGHT (1<<4)
  86. #define MOD_SHIFT_RIGHT (1<<5)
  87. #define MOD_ALT_RIGHT (1<<6)
  88. #define MOD_GUI_RIGHT (1<<7)
  89. #define KEY_A 4
  90. #define KEY_B 5
  91. #define KEY_C 6
  92. #define KEY_D 7
  93. #define KEY_E 8
  94. #define KEY_F 9
  95. #define KEY_G 10
  96. #define KEY_H 11
  97. #define KEY_I 12
  98. #define KEY_J 13
  99. #define KEY_K 14
  100. #define KEY_L 15
  101. #define KEY_M 16
  102. #define KEY_N 17
  103. #define KEY_O 18
  104. #define KEY_P 19
  105. #define KEY_Q 20
  106. #define KEY_R 21
  107. #define KEY_S 22
  108. #define KEY_T 23
  109. #define KEY_U 24
  110. #define KEY_V 25
  111. #define KEY_W 26
  112. #define KEY_X 27
  113. #define KEY_Y 28
  114. #define KEY_Z 29
  115. #define KEY_1 30
  116. #define KEY_2 31
  117. #define KEY_3 32
  118. #define KEY_4 33
  119. #define KEY_5 34
  120. #define KEY_6 35
  121. #define KEY_7 36
  122. #define KEY_8 37
  123. #define KEY_9 38
  124. #define KEY_0 39
  125. #define KEY_F1 58
  126. #define KEY_F2 59
  127. #define KEY_F3 60
  128. #define KEY_F4 61
  129. #define KEY_F5 62
  130. #define KEY_F6 63
  131. #define KEY_F7 64
  132. #define KEY_F8 65
  133. #define KEY_F9 66
  134. #define KEY_F10 67
  135. #define KEY_F11 68
  136. #define KEY_F12 69
  137. /* ------------------------------------------------------------------------- */
  138. /* The following function returns an index for the first key pressed. It
  139. * returns 0 if no key is pressed.
  140. */
  141. uchar gamepad[]={0,0,KEY_W,KEY_A,KEY_D,KEY_S,KEY_U,KEY_C,KEY_K,KEY_X,KEY_I,KEY_J};
  142. uchar change=0,x1=0,y1=0;
  143. uchar pinkey[10]={0};
  144. uchar check=0;
  145. uchar delaycheck=0;//防止KeyRead第一次延时
  146. static uchar KeyRead( void )
  147. {
  148. uchar mask, x,y,xi=0;
  149. x = PINC;
  150. y = PIND;
  151. mask = 1;
  152. if((x1 != x) || (y1 != y)){y1=y;x1=x;change=1;}else{change = 0;}
  153. if(delaycheck > 0){
  154. for(int i=0;change && i<6;i++){
  155. if((x1 & mask) == 0){
  156. _delay_us(9500);
  157. if((x1 & mask) == 0) {
  158. pinkey[xi]=0;
  159. if(change && x1 != 0x3f){
  160. pinkey[xi++]=i;
  161. }}}
  162. mask <<= 1;
  163. }
  164. mask=1;
  165. for(int i=0;change && i<7;i++){
  166. if((y1 & mask) == 0){
  167. _delay_us(9500);
  168. if((y1 & mask) == 0) {
  169. pinkey[xi]=0;
  170. if(change && y1 != 0xfb){
  171. pinkey[xi++]=i+6;
  172. }}}
  173. if(i==1){mask <<= 1;}
  174. mask <<= 1;
  175. }
  176. xi=0;
  177. if(change){
  178. if(pinkey[0] != 0)
  179. {
  180. while(check == 0)
  181. {
  182. if(usbInterruptIsReady())
  183. {
  184. reportBuffer[0]=0; //特殊功能键
  185. reportBuffer[1]=gamepad[pinkey[0]];//键值
  186. reportBuffer[2]=gamepad[pinkey[1]];//键值
  187. reportBuffer[3]=gamepad[pinkey[2]];//键值
  188. reportBuffer[4]=gamepad[pinkey[3]];//键值
  189. reportBuffer[5]=gamepad[pinkey[4]];//键值
  190. reportBuffer[6]=gamepad[pinkey[5]];//键值
  191. usbSetInterrupt(reportBuffer, sizeof(reportBuffer));
  192. check = 1;
  193. }
  194. }
  195. check=0;
  196. }
  197. }
  198. if(PINC == 0x3f && PIND == 0xfb){
  199. _delay_ms(5);
  200. if(change && (PINC == 0x3f && PIND == 0xfb))
  201. {
  202. while(check == 0)
  203. {
  204. if(usbInterruptIsReady())
  205. {
  206. reportBuffer[0]=0; //特殊功能键
  207. reportBuffer[1]=0;//键值
  208. reportBuffer[2]=0;//键值
  209. reportBuffer[3]=0;//键值
  210. reportBuffer[4]=0;//键值
  211. reportBuffer[5]=0;//键值
  212. reportBuffer[6]=0;//键值
  213. usbSetInterrupt(reportBuffer, sizeof(reportBuffer));
  214. check = 1;
  215. }
  216. }
  217. check=0;
  218. }
  219. }
  220. xi=0;
  221. while(pinkey[xi] != 0)
  222. {
  223. pinkey[xi++]=0;
  224. }
  225. }//delaycheck one time
  226. delaycheck = 1;
  227. return 0;
  228. }
  229. /* ------------------------------------------------------------------------- */
  230. uchar usbFunctionSetup(uchar data[8])
  231. {
  232. usbRequest_t *rq = (void *)data;
  233. usbMsgPtr = reportBuffer;
  234. if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS){ /* class request type */
  235. if(rq->bRequest == USBRQ_HID_GET_REPORT){ /* wValue: ReportType (highbyte), ReportID (lowbyte) */
  236. /* we only have one report type, so don't look at wValue */
  237. }else if(rq->bRequest == USBRQ_HID_GET_IDLE){
  238. usbMsgPtr = &idleRate;
  239. return 1;
  240. }else if(rq->bRequest == USBRQ_HID_SET_IDLE){
  241. idleRate = rq->wValue.bytes[1];
  242. }
  243. }else{
  244. /* no vendor specific requests implemented */
  245. }
  246. return 0;
  247. }
  248. /* ------------------------------------------------------------------------- */
  249. int main(void)
  250. {
  251. wdt_enable(WDTO_2S);
  252. odDebugInit();
  253. usbInit();
  254. sei();
  255. DBG1(0x00, 0, 0);
  256. hardwareInit();
  257. for(;;){ /* main event loop */
  258. wdt_reset();
  259. usbPoll();
  260. KeyRead();
  261. }
  262. return 0;
  263. }
  264. /* ------------------------------------------------------------------------- */


[ 此帖被coolcall在2013-02-26 18:20重新编辑 ]
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共23条打赏M币+136专家+1
离线芮井松

发帖
532
M币
237
专家
0
粉丝
18
只看该作者 1楼 发表于: 2013-02-26
请登录后查看
离线风间尘

发帖
21204
M币
6780
专家
290
粉丝
2444
只看该作者 2楼 发表于: 2013-02-26
请登录后查看
离线素食猫

发帖
4226
M币
1232
专家
6
粉丝
51
只看该作者 3楼 发表于: 2013-02-26
请登录后查看

发帖
361
M币
38
专家
-1
粉丝
14
只看该作者 4楼 发表于: 2013-02-26
请登录后查看
离线real168
发帖
2495
M币
2274
专家
2
粉丝
44
只看该作者 5楼 发表于: 2013-02-26
请登录后查看
离线cnqjscn

发帖
321
M币
17
专家
1
粉丝
16
只看该作者 6楼 发表于: 2013-02-26
请登录后查看
离线monkey125

发帖
1203
M币
4065
专家
6
粉丝
44
只看该作者 7楼 发表于: 2013-02-26
请登录后查看
离线amwihcss

发帖
258
M币
632
专家
5
粉丝
32
只看该作者 8楼 发表于: 2013-02-26
请登录后查看
离线百慕大

发帖
1015
M币
654
专家
2
粉丝
28
只看该作者 9楼 发表于: 2013-02-26
请登录后查看
快速回复
限80 字节
温馨提示:欢迎交流讨论,请勿发布纯表情、纯引用等灌水帖子;以免被删除
 
上一个 下一个