OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4625|回复: 13

怎么在NES 模拟器的基础上加入按键功能?

[复制链接]

19

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2016-8-21
在线时间
47 小时
发表于 2016-8-22 15:46:03 | 显示全部楼层 |阅读模式
1金钱
joy0_W                ;4016  手柄1+选通
;----------------------------------------------------------------------------
        tst r0,#1
        orr lr,#0x01                ;lr最低位置1防止进入arm状态
        bxne lr

        ldr r0,=0x40011408 ; 端口输入数据寄存器(GPIOD_IDR)0x40011408        按键端口
        ldr r0,[r0]                  ;         PD9    11     12    13    14    15设置成的输入           按下为0
                                   ;   key 6     1      2          3            4          5

                        ;        ((右  <<7)|(左  <<6)|(下  <<5)|(上  <<4)|Start<<3)|Select<<2)|(B  <<1)| A   )
                        ;                          5                  3                4                        2                        1                                            6        按键编号
       
        lsr r0,r0,#8          ;>>8  只要高8位
        rsb r0,r0,#0xff   ; R0 = #0xff-R0      反向减法?   取反                  nes需要按下为1
;        mvn r0,r0                  ;        加载一个数的NOT 值(取到逻辑反的值)
                                        ;                         76543210                8位数据的位
                                        ;                         54321*6*                 按键编号
                                        ;                         53421**6                 nes按键编号

        and r2,r0,#0x80   ;按键5 在对应位

        and r1,r0,#0x20   ;按键3
        orr r2,r1,lsl#1          ;                        <<1

        and r1,r0,#0x8 ;按键1
        orr r2,r1                 ;按键1 在对应位

        and r1,r0,#0x40 ;按键4
        orr r2,r1,lsr#1                          ;>>1

        and r1,r0,#0x10 ;按键2
        orr r2,r1                ;按键2 在对应位

        and r1,r0,#0x02 ;按键6
        orr r2,r1,lsr#1  ;    >>1                  r2是键值
;        orr r2,r2,#0x08                   ;20位表示控制器在位        ??

        str r2,joy0serial
        bx lr
;--------------------------------------------------------------------------------       

    IMPORT Apu_Read4015  ;apu.c
apu_4015R        ;4015
;----------------------------------------------------------------------------------       
        stmfd sp!,{r3,lr}        ;LR 寄存器放栈      
        bl Apu_Read4015
        ldmfd sp!,{r3,lr}
        orr lr,#0x01                ;lr最低位置1防止进入arm状态
        bx lr
;----------------------------------------------------------------------------
joy0_R                ;4016
;----------------------------------------------------------------------------       

        ldr r0,joy0serial           ;串行数据  当前读取位
        mov r1,r0,lsr#1
        str r1,joy0serial
        and r0,r0,#1       
        orr r0,r0,#0x40

    orr lr,#0x01                ;lr最低位置1防止进入arm状态
        bx lr

我在论坛上找到了网友给的代码,不过不太懂汇编,请问这段代码是怎么实现按键功能的?
或者说一下实现的思路?谢谢大家了

最佳答案

查看完整内容[请看2#楼]

你只需要根据规则,将按键值赋值给PADdata0/PADdata1即可。 位域:手柄1键值 [7:0]右7 左6 下5 上4 Start3 Select2 B1 A0 [mw_shl_code=cpp,true]//读取游戏手柄数据 void nes_get_gamepadval(void) { u8 *pt; while((usbx.bDeviceState&0XC0)==0X40)//USB设备插入了,但是还没连接成功,猛查询. { usbapp_pulling(); //轮询处理USB事务 } usbapp_pulling(); //轮询处理USB事务 if(usbx.hdevclass==4) //U ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-8-22 15:46:04 | 显示全部楼层

你只需要根据规则,将按键值赋值给PADdata0/PADdata1即可。
位域:手柄1键值 [7:0]右7 左6 下5 上4 Start3 Select2 B1 A0

[mw_shl_code=cpp,true]//读取游戏手柄数据
void nes_get_gamepadval(void)
{  
        u8 *pt;
        while((usbx.bDeviceState&0XC0)==0X40)//USB设备插入了,但是还没连接成功,猛查询.
        {
                usbapp_pulling();        //轮询处理USB事务
        }
        usbapp_pulling();                //轮询处理USB事务
        if(usbx.hdevclass==4)        //USB游戏手柄
        {       
                PADdata0=fcpad.ctrlval;
                PADdata1=0;
        }else if(usbx.hdevclass==3)//USB键盘模拟手柄
        {
                KEYBRD_FCPAD_Decode(pt,0);
                PADdata0=fcpad.ctrlval;
                PADdata1=fcpad1.ctrlval;
        }       
}   [/mw_shl_code]

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

19

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2016-8-21
在线时间
47 小时
 楼主| 发表于 2016-8-22 15:46:25 | 显示全部楼层
求助!
回复

使用道具 举报

19

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2016-8-21
在线时间
47 小时
 楼主| 发表于 2016-8-22 16:25:02 | 显示全部楼层
!!!!!!!!!!!!!!
回复

使用道具 举报

19

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2016-8-21
在线时间
47 小时
 楼主| 发表于 2016-8-22 17:13:01 | 显示全部楼层
@正点原子  求助
回复

使用道具 举报

19

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2016-8-21
在线时间
47 小时
 楼主| 发表于 2016-8-22 18:39:27 | 显示全部楼层
为什么程序进不到这里?
joy0_R                ;4016
;----------------------------------------------------------------------------
        ldr r0,joy0data           ;串行数据  当前读取位;joy0data是键值
    mov r1,r0,lsr#1       ;>>1
        str r1,joy0data
       
        and r0,r0,#1      ;&1       
        orr r0,r0,#0x40   ;|0x40

    orr lr,#0x01                ;lr最低位置1防止进入arm状态
        bx lr
回复

使用道具 举报

19

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2016-8-21
在线时间
47 小时
 楼主| 发表于 2016-8-22 18:41:05 | 显示全部楼层
@正点原子  原子哥,求助!
回复

使用道具 举报

19

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2016-8-21
在线时间
47 小时
 楼主| 发表于 2016-8-22 18:41:22 | 显示全部楼层
@正点原子
回复

使用道具 举报

19

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2016-8-21
在线时间
47 小时
 楼主| 发表于 2016-8-22 18:42:38 | 显示全部楼层
求帮助!
回复

使用道具 举报

19

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2016-8-21
在线时间
47 小时
 楼主| 发表于 2016-8-22 19:25:35 来自手机 | 显示全部楼层
求助呀
回复

使用道具 举报

19

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2016-8-21
在线时间
47 小时
 楼主| 发表于 2016-8-22 21:29:00 | 显示全部楼层
不要这样抛弃我
回复

使用道具 举报

19

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2016-8-21
在线时间
47 小时
 楼主| 发表于 2016-8-25 12:36:33 | 显示全部楼层
正点原子 发表于 2016-8-22 15:46
你只需要根据规则,将按键值赋值给PADdata0/PADdata1即可。
位域:手柄1键值 [7:0]右7 左6 下5 上4 Star ...

谢谢,我已经弄好了,不过为什么帧率很低,只有30多,已经超频到128M了,stm32f103
回复

使用道具 举报

19

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2016-8-21
在线时间
47 小时
 楼主| 发表于 2016-8-25 16:36:49 | 显示全部楼层
正点原子 发表于 2016-8-22 15:46
你只需要根据规则,将按键值赋值给PADdata0/PADdata1即可。
位域:手柄1键值 [7:0]右7 左6 下5 上4 Star ...

跳6帧后 挺流畅的,声音也连续多了,
回复

使用道具 举报

19

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2015-12-6
在线时间
47 小时
发表于 2017-1-8 00:27:54 | 显示全部楼层
z0011k 发表于 2016-8-25 16:36
跳6帧后 挺流畅的,声音也连续多了,

弄好了的程序可以放上来参考一下吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-12 10:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表