linux按键检测结束,关于Linux下按键的检测

写这篇博客是因为自己想做一个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 fd=0;

struct termios saveterm,nt;

tcgetattr(fd,&saveterm);

nt=saveterm;

nt.c_lflag &=~ECHO;

nt.c_lflag &=~ISIG;

nt.c_lflag &= ~ICANON;

tcsetattr(fd,TCSANOW,&nt);

char buf[10];

while(1){

int num=read(fd,buf,sizeof(buf));

for(int i=0;i

通过这段代码,我们可以不需要回车就可以读取按键的值了,而且没有回显。但是出现了下面的两个问题。

2、read是阻塞的,只有通过按键才能执行。

再经过一番百度,又找到了,嘿嘿。http://www.cplusplus.me/1088.html

测试代码:

#include#include#include#includeint main(){

int fd=0;

int flags;

flags=fcntl(fd,F_GETFL);

flags|=O_NONBLOCK;

if(fcntl(fd,F_SETFL,flags)==-1){

exit(1);

}

char buf[10];

while(1){

int num=read(fd,buf,sizeof(buf));

for(int i=0;i当然这段代码又有了第一份缺陷不过是非阻塞的了。

3、在第一个基础上,如果一直按下F键,则一直显示f,这时按下J键,则开始显示J,在放开J,这不显示任何东西了,这不是我想要的,我想要的是放开J之后任然知道F是按下的。

继续百度,哈哈,找到了,http://blog.csdn.net/zgrjkflmkyc/article/details/39499521

使用event,这里不添代码了。这有一个问题就是需要得到键盘是哪个event,一般是event1,这个就不多说了;还有就是退出后会将按键显示在控制台。

最后,满足我的需求,需要将三段代码结合起来。

第一步:初始化。。。

void InitJoy(){

inputfd=open("/dev/input/event1",O_RDWR);

tcgetattr(0,&saveterm);

nt=saveterm;

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(value==1|value==2)

joypad[joy].value|=code;

else if(value==0)

joypad[joy].value&=(~code);

}

void NES_UpdateJoyValue(){

for(int ii=0;ii<5;ii++){

int num=read(inputfd,&t,sizeof(t));

read(0,buf,sizeof(buf));

if(num==sizeof(t)){

if(t.type==EV_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;//A

case 37:update(0,t.value,0x02);break;//B

case 2: update(0,t.value,0x04);break;//select

case 3: update(0,t.value,0x08);break;//start

case 4:nesruning=0;break;

default:break;

}

}

}

}

}最后只要调用这个函数就可以得到想要的东西了

unsigned char NES_GetJoyPadVlaue(int JoyId){

unsigned char value=0;

NES_UpdateJoyValue();

if (JoyId==JOY2){return value;}

value=((joypad[JoyId].value >>joypad[JoyId].index) & 0x01);

joypad[JoyId].index++;

if (joypad[JoyId].index==23){joypad[JoyId].index=0;}

return value;

}

到这里fc输入就完美的解决了配一张运行中的图片,在虚拟机里面跑模拟器cpu占20%左右,感觉还行:

28ae42cd0fe176f9c654e58542b72192.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(翻译)Tricks of the windows game programming Gurus(Windows游戏大师之路) --- 前言(作者:ANDRE LAMOTHE 1999)...

前言&#xff1a;在一篇零编程学习游戏编程的文章文章中提及此书&#xff0c;而且书评很不错&#xff0c;在当时反响很剧烈。因此下了个PDF版的慢慢学习。虽然接触游戏编程很久&#xff0c;玩的五花八门的游戏也有很多&#xff0c;但真正完成的游戏只有一个扫雷游戏。文章中建议…

C语言那年踩过的坑--局部变量,静态变量,全局变量在内存中存放的位置

先看几个概念&#xff1a; 1、bss是英文block started by symbol的简称&#xff0c;通常是指用来存放程序中未初始化的全局变量的一块内存区域&#xff0c;在程序载入时由内核清0。bss段属于静态内存分配。它的初始值也是由用户自己定义的连接定位文件所确定&#xff0c;用户应…

如何阅读3,500万个博客?

博客至今已经出现5年了&#xff0c;目前这股热潮正在愈演愈烈。博客又叫网络日志&#xff0c;现在已经非常普及&#xff1b;跟踪3,500多万个博客的Technorati Inc.称&#xff0c;博客的总数量每6个月就增加一倍。这就带来了一个问题&#xff1a;如何从浩如烟海的信息中找到想要…

u-boot与bootloader及其区别

Bootloader比Bootloader从字面上来看就是启动加载的意思。用过电脑的都知道&#xff0c;windows开机时会首先加载bios&#xff0c;然后是系统内核&#xff0c;最后启动完毕。那么bootloader就相当于手机的bios&#xff0c;它在手机启动的时候根据基带初始化硬件&#xff0c;然后…

assets目录与res/raw目录下文件的区别

assets目录与res/raw目录下文件的区别 assets目录下的文件不会被编译成二进制&#xff0c;直接被打包到apk中。 assets目录中的文件不会在R.Java中建立索引。 assets目录下的文件需借助AssetManager访问。 assets目录下可以建立自己的子目录。 res/raw目录下的文件会被编译成二…

linux gdb 忽略信号,linux gdb调试基本命令

近年来,随着嵌入式技术飞速发展,嵌入式产品随处可见,Linux的应用也越来越广泛。接下来是小编为大家收集的linux gdb调试基本命令&#xff0c;希望能帮到大家。linux gdb调试基本命令1.启动调试前置条件&#xff1a;编译生成执行码时带上 -g&#xff0c;如果使用Makefile&#x…

Adobe Dreamweaver 添加库、标签和属性

您可以在 Dreamweaver 中使用标签库编辑器添加标签库&#xff0c;并将标签和属性添加到标签库中。 添加一个标签库在标签库编辑器&#xff08;“编辑”>“标签库”&#xff09;中&#xff0c;单击加号 () 按钮&#xff0c;然后选择“新建标签库”。在“库名称”框中&#xf…

白话debounce和throttle

遇到的问题 在开发过程中会遇到频率很高的事件或者连续的事件&#xff0c;如果不进行性能的优化&#xff0c;就可能会出现页面卡顿的现象&#xff0c;比如&#xff1a; 鼠标事件&#xff1a;mousemove(拖曳)/mouseover(划过)/mouseWheel(滚屏)键盘事件&#xff1a;keypress(基于…

Windows平台下使用Active Directory对Subversion进行权限控制(非完美解决方案)

Windows平台下使用Active Directory对Subversion进行权限控制&#xff08;非完美解决方案&#xff09; Windows平台下使用Active Directory对Subversion进行权限控制&#xff08;非完美解决方案&#xff09; 目前网上找到的Subversion的配置说明中&#xff0c;关于用户权限控制…

wireshark抓包工具的使用及分析

前段时间看到群里在讨论Wireshark抓包工具&#xff0c;想写一篇使用笔记但一直没来得及写&#xff0c;本篇就通过实例来分享wireshark抓包工具的使用。Wireshark简介 Wireshark 是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包&#xff0c;并尽可能显示出最为详…

EventLoop笔记

node环境 Event Loop各阶段&#xff1a; - timers 阶段&#xff1a;这个阶段执行 setTimeout 和 setInterval 的回调函数。- I/O callbacks 阶段&#xff1a;不在 timers 阶段、close callbacks 阶段和 check 阶段这三个阶段执行的回调&#xff0c;都由此阶段负责&#xff0c…

如何实现android和服务器长连接呢?推送消息的原理

转载地址&#xff1a;http://blog.csdn.net/q376420785/article/details/8653958 前言&#xff1a;现在的大多数移动端应用都有实时得到消息的能力&#xff0c;简单来说&#xff0c;有发送消息的主动权和接受消息的被动权。例如&#xff1a;微信&#xff0c;QQ&#xff0c;天气…

linux入门系统那个好,初学Linux哪个发行版本好?这些更合适!

Linux是非常受欢迎的技术&#xff0c;现在很多人都开始转行学习Linux&#xff0c;不过大家都知道Linux发行版本众多&#xff0c;在学习的时候我该选择哪个发行版本呢?为大家介绍一下。其实在挑选Linux发行版本之前&#xff0c;我们首先要根据自己的需求决定。如果抱着试试的心…

git 使用及常用命令介绍

一、git 常用命令 git clone 地址 克隆项目 git status 查看当前状态 git add 文件或文件夹 &#xff08;加入本地暂存目录&#xff09; git commit -m "注释" 提交到本地版本库&#xff08;暂存区&#xff09; git commit -a -m "注释" 提交全部改动文件 …

asp.net中的记忆盲区

<1> 连接数据库 用read方法取出数据 在web.config取出连接字符串 string sqlconn ConfigurationManager.ConnectionStrings["db_showHouseConnectionString"].ToString(); SqlConnection connnew SqlConnection (sqlconn ); SqlComman…

调试网络收发不通问题

今天在做之前一个项目重构的事情&#xff0c;需要把之前的代码重新做功能&#xff0c;我们有两个设备&#xff0c;他们通过网线连接&#xff0c;用UDP来传输数据。很多人都怀疑UDP丢包什么&#xff0c;不及时什么之类的&#xff0c;如果想把事情做得足够快&#xff0c;最好还是…

VB6.0和VB.Net对照表

想在网上找一下VB.Net中&#xff0c;哪些是VB6.0遗留下来的东西&#xff0c;哪些是VB.Net增加的东西。结果中文的没有找到&#xff0c;找到了一个日文网页。简单的翻译了一下&#xff0c;放在这里&#xff0c;供需要的人参考。 VB6.0和VB.Net的对照表VB6.0VB.NETAddItem Object…

hibernate的初次使用

转载地址&#xff1a;http://blog.csdn.net/aboy123/article/details/10222675 一、Hibernate概述 &#xff08;一&#xff09;什么是Hibernate&#xff1f; hibernate核心内容是ORM&#xff08;关系对象模型&#xff09;。可以将对象自动的生成数据库中的信息&#xff0c;使…

linux 关联数组,linux 普通数组和关联数组

数组&#xff1a;就是借助索引将多个数据存储为一个集合。普通数组&#xff1a;数组的索引只能使用整数关联数组&#xff1a;数组的索引可以使用整数和字符串(要bash4.0以上的版本才支持关联数组)数组通常与循环或者其他判断式交互使用才有比较高的意义普通数组的定义array1(a …

layui之在table的编辑的按钮的思考

点编辑的时候&#xff0c;如果没有在html界面写form&#xff0c;而是在同级目录下写的 修改html的话呢&#xff0c; 就可以在点 编辑 按钮的时候&#xff0c;调用打开tab的方法&#xff0c;把form的html打开&#xff0c;而不用去后台转发转载于:https://www.cnblogs.com/fuckin…