公司建设网站申请信用卡,辛集建设局官方网站,创客贴网站做海报技能,廊坊集团网站建设写这篇博客是因为自己想做一个fc模拟器#xff0c;核心代码(6502和ppu的模拟代码)用的原子开发板的代码#xff0c;人家是从pc向单片机移植#xff0c;我是反过来了#xff0c;不过因为写的不错#xff0c;用函数指针代替了switch方法可以学习一下#xff0c;so就用了它的…写这篇博客是因为自己想做一个fc模拟器核心代码(6502和ppu的模拟代码)用的原子开发板的代码人家是从pc向单片机移植我是反过来了不过因为写的不错用函数指针代替了switch方法可以学习一下so就用了它的。在写按键控制的时候碰到一点点问题怎么才能获取按键的状态。写代码的时候碰到三个问题一个一个的解决。1、一般使用read、getchar()都要回车才能执行。经过一番百度http://blog.sina.com.cn/s/blog_7be4196901014dxl.html这个博客解决了这个问题。使用termios解决测试代码#include#include#include#includeint main(){int fd0;struct termios saveterm,nt;tcgetattr(fd,saveterm);ntsaveterm;nt.c_lflag ~ECHO;nt.c_lflag ~ISIG;nt.c_lflag ~ICANON;tcsetattr(fd,TCSANOW,nt);char buf[10];while(1){int numread(fd,buf,sizeof(buf));for(int i0;i通过这段代码我们可以不需要回车就可以读取按键的值了而且没有回显。但是出现了下面的两个问题。2、read是阻塞的只有通过按键才能执行。再经过一番百度又找到了嘿嘿。http://www.cplusplus.me/1088.html测试代码#include#include#include#includeint main(){int fd0;int flags;flagsfcntl(fd,F_GETFL);flags|O_NONBLOCK;if(fcntl(fd,F_SETFL,flags)-1){exit(1);}char buf[10];while(1){int numread(fd,buf,sizeof(buf));for(int i0;i当然这段代码又有了第一份缺陷不过是非阻塞的了。3、在第一个基础上如果一直按下F键则一直显示f这时按下J键则开始显示J在放开J这不显示任何东西了这不是我想要的我想要的是放开J之后任然知道F是按下的。继续百度哈哈找到了http://blog.csdn.net/zgrjkflmkyc/article/details/39499521使用event这里不添代码了。这有一个问题就是需要得到键盘是哪个event一般是event1这个就不多说了还有就是退出后会将按键显示在控制台。最后满足我的需求需要将三段代码结合起来。第一步初始化。。。void InitJoy(){inputfdopen(/dev/input/event1,O_RDWR);tcgetattr(0,saveterm);ntsaveterm;nt.c_lflag ~ECHO;nt.c_lflag ~ISIG;nt.c_lflag ~ICANON;tcsetattr(0,TCSANOW,nt);int flags fcntl(inputfd,F_GETFL);flags | O_NONBLOCK;if(fcntl(inputfd,F_SETFL,flags)-1){exit(1);}flags fcntl(0,F_GETFL);flags | O_NONBLOCK;if(fcntl(0,F_SETFL,flags)-1){exit(1);}Nes_JoyInit();cout下面的函数是读取按键更新按键的值。这一步重要的是读两次一次读event一次读输入0这个是必要的要不然程序退出时会在控制台出现你刚才输入过的东西。void update(int joy,int value,unsigned char code){if(value1|value2)joypad[joy].value|code;else if(value0)joypad[joy].value(~code);}void NES_UpdateJoyValue(){for(int ii0;ii5;ii){int numread(inputfd,t,sizeof(t));read(0,buf,sizeof(buf));if(numsizeof(t)){if(t.typeEV_KEY){switch(t.code){case 17:break;case 31:update(0,t.value,0x10);break;case 30:update(0,t.value,0x40);break;case 32:update(0,t.value,0x80);break;case 36:update(0,t.value,0x01);break;//Acase 37:update(0,t.value,0x02);break;//Bcase 2: update(0,t.value,0x04);break;//selectcase 3: update(0,t.value,0x08);break;//startcase 4:nesruning0;break;default:break;}}}}}最后只要调用这个函数就可以得到想要的东西了unsigned char NES_GetJoyPadVlaue(int JoyId){unsigned char value0;NES_UpdateJoyValue();if (JoyIdJOY2){return value;}value((joypad[JoyId].value joypad[JoyId].index) 0x01);joypad[JoyId].index;if (joypad[JoyId].index23){joypad[JoyId].index0;}return value;}到这里fc输入就完美的解决了配一张运行中的图片在虚拟机里面跑模拟器cpu占20%左右感觉还行