日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

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

發(fā)布時間:2023/12/20 linux 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux按键检测结束,关于Linux下按键的检测 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

寫這篇博客是因為自己想做一個fc模擬器,核心代碼(6502和ppu的模擬代碼)用的原子開發(fā)板的代碼,人家是從pc向單片機移植,我是反過來了,不過因為寫的不錯,用函數(shù)指針代替了switch方法可以學習一下,so就用了它的。

在寫按鍵控制的時候碰到一點點問題,怎么才能獲取按鍵的狀態(tài)。

寫代碼的時候碰到三個問題,一個一個的解決。

1、一般使用read、getchar()都要回車才能執(zhí)行。

經(jīng)過一番百度,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

通過這段代碼,我們可以不需要回車就可以讀取按鍵的值了,而且沒有回顯。但是出現(xiàn)了下面的兩個問題。

2、read是阻塞的,只有通過按鍵才能執(zhí)行。

再經(jīng)過一番百度,又找到了,嘿嘿。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是按下的。

繼續(xù)百度,哈哈,找到了,http://blog.csdn.net/zgrjkflmkyc/article/details/39499521

使用event,這里不添代碼了。這有一個問題就是需要得到鍵盤是哪個event,一般是event1,這個就不多說了;還有就是退出后會將按鍵顯示在控制臺。

最后,滿足我的需求,需要將三段代碼結(jié)合起來。

第一步:初始化。。。

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<

下面的函數(shù)是讀取按鍵,更新按鍵的值。這一步重要的是讀兩次一次讀event,一次讀輸入0,這個是必要的要不然程序退出時,會在控制臺出現(xiàn)你剛才輸入過的東西。

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;

}

}

}

}

}最后只要調(diào)用這個函數(shù)就可以得到想要的東西了

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%左右,感覺還行:

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的linux按键检测结束,关于Linux下按键的检测的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。