中级会员
 
- 积分
- 211
- 金钱
- 211
- 注册时间
- 2016-8-21
- 在线时间
- 47 小时
|
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 ...
|