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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android 开源fc模拟器_战舰开发板触摸屏运行NES模拟器

發(fā)布時間:2024/3/24 编程问答 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 开源fc模拟器_战舰开发板触摸屏运行NES模拟器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本帖最后由 xcc521 于 2019-4-3 23:14 編輯

先上圖

ScreenCut003.png (8.39 KB, 下載次數(shù): 0)

2019-4-1 00:58 上傳

ScreenCut004.png (7.29 KB, 下載次數(shù): 0)

2019-4-1 00:58 上傳

使用觸摸屏檢測作為手柄數(shù)據(jù)輸入

之前還嘗試過NRF24L1無線手柄(見這里 http://www.openedv.com/forum.php?mod=viewthread&tid=278263&extra=)以及自己寫的APP使用藍(lán)牙連接

0DCGRV[ES(NX}UG~X7({G3T.png (234.31 KB, 下載次數(shù): 0)

2019-4-1 00:58 上傳

7EMVA`S}BM({FDU9]@GU5}K.png (174.16 KB, 下載次數(shù): 0)

2019-4-1 00:58 上傳

947EE`1VGJ8WWN~H{AWUY.jpg (189.69 KB, 下載次數(shù): 1)

2019-4-1 00:58 上傳

Screenshot_2019-04-01-00-27-43-299_xdtech.joystic.png (82.57 KB, 下載次數(shù): 0)

2019-4-1 00:58 上傳

Screenshot_2019-04-01-00-27-49-053_xdtech.joystic.png (146.82 KB, 下載次數(shù): 0)

2019-4-1 00:58 上傳

Screenshot_2019-04-01-00-28-00-980_com.android.se.png (82.67 KB, 下載次數(shù): 0)

2019-4-1 00:58 上傳

Screenshot_2019-04-01-00-28-25-494_xdtech.joystic.png (91.93 KB, 下載次數(shù): 0)

2019-4-1 00:58 上傳

Screenshot_2019-04-01-00-28-36-472_xdtech.joystic.png (158.93 KB, 下載次數(shù): 0)

2019-4-1 00:58 上傳

藍(lán)牙模塊連接串口3,安卓APP發(fā)送字符表示按鍵

//讀取游戲手柄數(shù)據(jù)

void nes_get_gamepadval(void)

{

if(USART3_RX_STA & 0x08000)

{

//printf("usart3 data:%s\r\n",USART3_RX_BUF);

if(USART3_RX_BUF[0] == 'A')

{

PADdata0 |= 0x10;

}

else

{

PADdata0 &= ~0x10;

}

if(USART3_RX_BUF[1] == 'B')

{

PADdata0 |= 0x20;

}

else

{

PADdata0 &= ~0x20;

}

if(USART3_RX_BUF[2] == 'C')

{

PADdata0 |= 0x40;

}

else

{

PADdata0 &= ~0x40;

}

if(USART3_RX_BUF[3] == 'D')

{

PADdata0 |= 0x80;

}

else

{

PADdata0 &= ~0x80;

}

if(USART3_RX_BUF[4] == 'E')

{

PADdata0 |= 0x01;

}

else

{

PADdata0 &= ~0x01;

}

if(USART3_RX_BUF[5] == 'F')

{

PADdata0 |= 0x02;

}

else

{

PADdata0 &= ~0x02;

}

if(USART3_RX_BUF[6] == 'G')

{

PADdata0 |= 0x04;

}

else

{

PADdata0 &= ~0x04;

}

if(USART3_RX_BUF[7] == 'H')

{

PADdata0 |= 0x08;

}

else

{

PADdata0 &= ~0x08;

}

USART3_RX_STA = 0;

}

//PADdata0=JOYPAD_Read();? ?? ???//讀取手柄1的值

//PADdata1=0;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???//沒有手柄2,故不采用.

}

注意運(yùn)行NES的時候倍頻需要修改串口3的設(shè)置

void usart3_fast_init(u32 pclk2,u32 bound)

{

NVIC_InitTypeDef NVIC_InitStructure;

float temp;

u16 mantissa;

u16 fraction;

temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV

mantissa=temp;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?//得到整數(shù)部分

fraction=(temp-mantissa)*16; //得到小數(shù)部分

mantissa<<=4;

mantissa+=fraction;

RCC->APB2ENR|=1<<3;? ?? ?? ???//使能PORTB口時鐘

GPIOB->CRH&=0XFFFF00FF;? ?? ???//IO狀態(tài)設(shè)置

GPIOB->CRH|=0X00008B00;? ?? ???//IO狀態(tài)設(shè)置

RCC->APB1ENR|=1<<18;? ?? ?? ? //使能串口時鐘

RCC->APB1RSTR|=1<<18;? ?//復(fù)位串口3

RCC->APB1RSTR&=~(1<<18);//停止復(fù)位

//波特率設(shè)置

USART3->BRR=mantissa; // 波特率設(shè)置

USART3->CR1|=0X200C;??//1位停止,無校驗位.

#if EN_USART1_RX? ?? ?? ?? ?? ?? ?//如果使能了接收

//使能接收中斷

USART3->CR1|=1<<5;? ?? ?? ?? ?//接收緩沖區(qū)非空中斷使能2

NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//搶占優(yōu)先級3

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;? ?? ?? ?? ?? ? //子優(yōu)先級3

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;? ?? ?? ?? ?? ?? ?? ?? ?//IRQ通道使能

NVIC_Init(&NVIC_InitStructure);? ?? ???//根據(jù)指定的參數(shù)初始化VIC寄存器

#endif

TIM7_Int_Init(99,7199);? ?? ?? ?? ?? ? //10ms中斷

USART3_RX_STA=0;? ?? ?? ?? ?? ? //清零

TIM_Cmd(TIM7,DISABLE);? ?? ?? ?? ?? ?? ?? ?? ?//關(guān)閉定時器7

}

安卓負(fù)責(zé)連接藍(lán)牙監(jiān)聽按鈕狀態(tài)

class mImageListenter implements View.OnTouchListener

{

@Override

public boolean onTouch(View view,MotionEvent motionEvent)

{

// TODO Auto-generated method stub

switch (motionEvent.getAction())

{

case MotionEvent.ACTION_DOWN:

case MotionEvent.ACTION_MOVE:

if (view.getId() == R.id.im_joy_a_mode)

{

send_data[4] = 'E';

}

if (view.getId() == R.id.im_joy_b)

{

send_data[1] = 'B';

}

if (view.getId() == R.id.im_joy_b_mode)

{

send_data[5] = 'F';

}

if (view.getId() == R.id.im_joy_f)

{

send_data[0] = 'A';

}

if (view.getId() == R.id.im_joy_l)

{

send_data[2] = 'C';

}

if (view.getId() == R.id.im_joy_r)

{

send_data[3] = 'D';

}

if (view.getId() == R.id.im_joy_sel)

{

send_data[6] = 'G';

}

if (view.getId() == R.id.im_joy_sta)

{

send_data[7] = 'H';

}

break;

case MotionEvent.ACTION_UP:

if (view.getId() == R.id.im_joy_a_mode)

{

send_data[4] = '0';

}

if (view.getId() == R.id.im_joy_b)

{

send_data[1] = '0';

}

if (view.getId() == R.id.im_joy_b_mode)

{

send_data[5] = '0';

}

if (view.getId() == R.id.im_joy_f)

{

send_data[0] = '0';

}

if (view.getId() == R.id.im_joy_l)

{

send_data[2] = '0';

}

if (view.getId() == R.id.im_joy_r)

{

send_data[3] = '0';

}

if (view.getId() == R.id.im_joy_sel)

{

send_data[6] = '0';

}

if (view.getId() == R.id.im_joy_sta)

{

send_data[7] = '0';

}

break;

default:

break;

}

return true;

}

}

如此就可以控制NES游戲了

轉(zhuǎn)回主題,使用觸摸屏控制

首先創(chuàng)建界面

_btn_obj * tbtn_game[8];? ?? ?? ?? ?? ? //總共8個按鈕

void load_ctr_ui(void)

{

u16 button_w,button_h,W,H;

uint8_t rval=0;

uint8_t i;

if(lcddev.width == 480)

{

button_w = 60;

button_h = 40;

}

else

{

button_w = 30;

button_h = 18;

}

W = (lcddev.width - button_w * 6) / (6 + 1);//計算縫隙寬度

H = (lcddev.height??- 552 - button_h * 3) / (3 + 1);//計算縫隙高度

tbtn_game[0]=btn_creat(button_w * 1 + W * 2, 552 + button_h * 0 + H * 1,button_w,button_h,0,0x02);? ?? ???//創(chuàng)建按鈕

tbtn_game[1]=btn_creat(button_w * 1 + W * 2, 552 + button_h * 2 + H * 3,button_w,button_h,1,0x02);? ?? ???//創(chuàng)建按鈕

tbtn_game[2]=btn_creat(button_w * 0 + W * 1, 552 + button_h * 1 + H * 2,button_w,button_h,2,0x02);? ?? ???//創(chuàng)建按鈕

tbtn_game[3]=btn_creat(button_w * 2 + W * 3, 552 + button_h * 1 + H * 2,button_w,button_h,3,0x02);? ?? ???//創(chuàng)建按鈕

tbtn_game[4]=btn_creat(button_w * 4 + W * 5, 552 + button_h * 0 + H * 1,button_w,button_h,4,0x02);? ?? ???//創(chuàng)建按鈕

tbtn_game[5]=btn_creat(button_w * 4 + W * 5, 552 + button_h * 2 + H * 3,button_w,button_h,5,0x02);? ?? ???//創(chuàng)建按鈕

tbtn_game[6]=btn_creat(button_w * 3 + W * 4, 552 + button_h * 1 + H * 2,button_w,button_h,6,0x02);? ?? ???//創(chuàng)建按鈕

tbtn_game[7]=btn_creat(button_w * 5 + W * 6, 552 + button_h * 1 + H * 2,button_w,button_h,7,0x02);? ?? ???//創(chuàng)建按鈕

for(i=0;i<8;i++)

{

if(tbtn_game==NULL)

{

rval=1;

break;

}

tbtn_game->bcfucolor=BLACK;//松開時為黑色

tbtn_game->bcfdcolor=WHITE;//按下時為白色

tbtn_game->bkctbl[0]=0X453A;//邊框顏色

tbtn_game->bkctbl[1]=0X5DDC;//第一行的顏色

tbtn_game->bkctbl[2]=0X5DDC;//上半部分顏色

tbtn_game->bkctbl[3]=0X453A;//下半部分顏色

if(i==0)tbtn_game->caption="Select";

if(i==1)tbtn_game->caption="Start";

if(i==2)tbtn_game->caption="Left";

if(i==3)tbtn_game->caption="Right";

if(i==4)tbtn_game->caption="Up";

if(i==5)tbtn_game->caption="Down";

if(i==6)tbtn_game->caption="A";

if(i==7)tbtn_game->caption="B";

}

if(rval==0)//無錯誤

{

for(i=0;i<8;i++)btn_draw(tbtn_game);? ?? ???//畫按鈕

}

}

創(chuàng)建就有刪除,所以

void delete_ctr_ui(void)

{

uint8_t i;

for(i=0;i<8;i++)

btn_delete(tbtn_game);//刪除按鈕

}

然后是檢測按鍵邏輯

uint8_t get_ctr_res(void)

{

uint8_t res = 0,i,val = 0;

tp_dev.scan(0);

in_obj.get_key(&tp_dev,IN_TYPE_TOUCH);? ?? ???//得到按鍵鍵值

for(i=0;i<8;i++)

{

res=game_btn_check(tbtn_game,&in_obj);//確認(rèn)按鈕檢測

if(res)

{

if((tbtn_game->sta&0X80)==0)//有有效操作

{

switch(i)

{

case 0:

val |= 1 << 2;

break;

case 1:

val |= 1 << 3;

break;

case 2:

val |= 1 << 6;

break;

case 3:

val |= 1 << 7;

break;

case 4:

val |= 1 << 4;

break;

case 5:

val |= 1 << 5;

break;

case 6:

val |= 1 << 0;

break;

case 7:

val |= 1 << 1;

break;

}

}

}

}

return val;

}

game_btn_check本來用的是之前的btn_check,但是不支持實(shí)時監(jiān)測,于是修改成了

static uint8_t game_btn_check(_btn_obj * btnx,void * in_key)

{

_in_obj *key=(_in_obj*)in_key;

uint8_t btnok=0;

if((btnx->sta&0X03)==BTN_INACTIVE)return 0;//無效狀態(tài)的按鍵,直接不檢測

switch(key->intype)

{

case IN_TYPE_TOUCH:? ?? ???//觸摸屏按下了

if(btnx->topy&&key->ytop+btnx->height)&&btnx->leftx&&key->xleft+btnx->width))//在按鍵內(nèi)部

{

btnx->sta&=~(0X03);

btnx->sta|=BTN_PRESS;//按下

//btn_draw(btnx);//畫按鈕??屏蔽重繪按鈕,嚴(yán)重影響幀數(shù)

btnok=1;

}else

{

btnx->sta&=~(0X03);

btnx->sta|=BTN_RELEASE;? ?? ???//松開

//btn_draw(btnx);? ?? ?? ?? ?? ?? ?? ?? ?//畫按鈕

}

break;

default:

break;

}

return btnok;

}

主循環(huán)

LCD_Set_Window(0,0,lcddev.width,lcddev.height);//恢復(fù)屏幕窗口用于更新屏幕按鍵狀態(tài)以及顯示文字

nes_get_gamepadval();? ?? ???//每3幀查詢一次USB

nes_set_window();//因為檢測屏幕按鍵時候更新了按鈕狀態(tài)所以需要重新設(shè)置窗口

apu_soundoutput();? ?? ?? ?? ?? ? //輸出游戲聲音

這樣折騰了一晚上就可以按觸摸屏一直輸出按鈕值,不然的話每一次查詢按鍵都要手動點(diǎn)一次放開根本跟不上

但是又發(fā)現(xiàn)了個問題,就是按鈕值無法組合,也就是只能檢測任一個按鍵,不能多按鍵同時檢測,本來以為就是其中的8個按鈕都單獨(dú)調(diào)用一次掃描觸屏函數(shù)就會好,但是一想每次檢測的應(yīng)該還是第一個按下的坐標(biāo),這可能就得需要掃描多點(diǎn)觸摸時的坐標(biāo)了,嗯,暫時就是這樣想的,后面再從底層重寫掃描函數(shù)吧,快一點(diǎn)了,睡覺,哈哈哈

藍(lán)牙手柄APP.zip

(1.84 MB, 下載次數(shù): 10)

2019-4-1 00:58 上傳

點(diǎn)擊文件名下載附件

IMG_20190401_000056.jpg (2.83 MB, 下載次數(shù): 0)

2019-4-3 23:13 上傳

IMG_20190401_000125.jpg (2.93 MB, 下載次數(shù): 0)

2019-4-3 23:14 上傳

好奇怪附件會亂

總結(jié)

以上是生活随笔為你收集整理的android 开源fc模拟器_战舰开发板触摸屏运行NES模拟器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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