背景
主要是怀旧 红白机游戏: 双截龙2,双截龙3,魂斗罗1, 魂斗罗2…
- Windows上 VirtuaNES.exe 的连发功能不好用, 双截龙3的旋风腿 经常变成飞踢. 按的我的大拇指都起水泡了, 手柄都快按坏了, 旋风腿非常难用.
- MacOS 苹果笔记本, OpenEum NES 的手柄设定,没有 连发键.完全是任天堂原始手柄键位.没有连发功能.
- Linux 系统的NES模拟器也很难用.
- 安卓模拟器 连发也很难用.
- 小时候山寨版的小霸王, 连发很好用. 但那是接电视玩的. 手柄是9孔的. 这个手柄没办法接在电脑上.
想玩NES的时候, 随身带着NES游戏机 + AV显示器,不现实.
想法:
- 就在电脑上玩NES, 电脑方便携带
- 万能连发手柄, 兼容所有平台.
硬件
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_(); }
}
|
程序编译
程序烧录
硬件连线
连发设定
游戏测试