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
我在论坛上找到了网友给的代码,不过不太懂汇编,请问这段代码是怎么实现按键功能的?
或者说一下实现的思路?谢谢大家了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
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
一周热门 更多>