任天堂 小霸王 FC NES 模拟器 USB 手柄 连发程序

背景

主要是怀旧 红白机游戏: 双截龙2,双截龙3,魂斗罗1, 魂斗罗2…

  1. Windows上 VirtuaNES.exe 的连发功能不好用, 双截龙3的旋风腿 经常变成飞踢. 按的我的大拇指都起水泡了, 手柄都快按坏了, 旋风腿非常难用.
  1. MacOS 苹果笔记本, OpenEum NES 的手柄设定,没有 连发键.完全是任天堂原始手柄键位.没有连发功能.
  1. Linux 系统的NES模拟器也很难用.
  1. 安卓模拟器 连发也很难用.
  1. 小时候山寨版的小霸王, 连发很好用. 但那是接电视玩的. 手柄是9孔的. 这个手柄没办法接在电脑上.
    想玩NES的时候, 随身带着NES游戏机 + AV显示器,不现实.

想法:

  1. 就在电脑上玩NES, 电脑方便携带
  2. 万能连发手柄, 兼容所有平台.

硬件

MCU :STC15F104E
编译器: Keil uVision4 4.72.9
烧录选项:11.0592 Mhz

程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75

#include<intrins.h>
#include "STC15F104E.H"

sbit KEY_A = P3^1;
sbit OUT_A = P3^4;

sbit KEY_B = P3^0;
sbit OUT_B = P3^5;

int init() //1毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xCD; //设置定时初值
TH0 = 0xD4; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时

EA=1;
ET0 = 1; //使能定时器0中断
return 0;
}

int time = 0;

void INT_1(void) interrupt 1
{
if(time < 100)
{
time++;
return;
}

time = 0;

if(1 == KEY_A && 1 == KEY_B)
{
OUT_A = OUT_B = 1; //reset
return;
}


if(0 == KEY_A && 0 == KEY_B)
{
OUT_A = OUT_B = ~OUT_A; //连发
return;
}

if(0 == KEY_A)
{
OUT_A = ~OUT_A;
OUT_B = 1; //互斥
return;
}

if(0 == KEY_B)
{
OUT_B = ~OUT_B;
OUT_A = 1; //互斥
return;
}

}

int main()
{
init();

while(1)
{
_nop_();
}

}

程序编译

程序烧录

硬件连线

连发设定

游戏测试