只亮 5 6 7三个灯,把8号灯代码复制到5号前就亮8 5 6
明明写了四个灯的 不管怎么改顺序,只亮前三个
; asm.s 我的跑马灯程序
GPBCON EQU 0x56000010
GPBDAT EQU 0x56000014
GPBUP EQU 0x56000018
EXPORT LEDTEST
AREA LEDTESTASM,CODE,READONLY ;该伪指令定义一个代码段,段名为LEDTESTASM,属性只读
ENTRY
CODE32
LEDTEST
;;;设置GPF4-GPF7为OUTPUT
ldr r0,=GPBCON ;
;ldr r1,[r0]
;bic r1,r1,#0xff00 ;bicBIC{cond}{S} Rd,Rn,operand2 BIC指令将Rn 的值与操作数operand2 的反码按位逻辑”与”,结果存放到目的寄存器Rd 中。指令示例:BIC R0,R0,#0x0F ;将R0最低4位清零,其余位不变。
ldr r1,=0x00015400 ; 1 0101 0100 0000 0000
str r1,[r0] ;GPFCON8 [17:16] 01=OUTPUT ,,, GPFCON5 [11:10] 01=0UTPUT ,,,GPFCON6 [13:12] 为01 ,,,GPFCON7 [15:14] 也为01
;;;禁止GPF4-GPF7端口的上拉电阻
;ldr r0,=GPBUP ;GPFUP 是8位的
;ldr r1,=0x1e0
;orr r1,r1,#0x1e0 ;r1 赋值为 1 1110 0000
;str r1,[r0] ;将GPF[5:8] 位赋值为1 1是禁止
looptest
;;;将数据端口F的数据寄存器的地址附给寄存器r2
;;;先让5号灯先亮
ldr r2,=GPBDAT ;
ldr r3,[r2] ;
bic r3,r3,#0x1e0 ;清0 %%%%%%%%%%%%%%%%%%%%%%%%%%% 这样写是有BUG的(参看led6的这一行) 应该用32位的指令ldr
orr r3,r3,#0x1c0 ; 低4位 置0 低4位不是led的 ,,,0001 1100 0000 让GPFDAT5 号灯亮 0代表低电位,灯亮
str r3,[r2]
ldr r0,=0x8ffff ;这句什么意思? 答: 这个给r0设个初值:这样就可以 在delay 这个子函数中,用每次减1的方法进行循环
bl delay ;调用延迟子程序
;;;6号该亮了
ldr r2,=GPBDAT
ldr r3,[r2]
bic r3,r3,#0x1e0 ;
orr r3,r3,#0x1a0 ; 0001 1010 0000 6号开亮
str r3,[r2]
ldr r0,=0x8ffff
bl delay
;b li ;B或BL指令引起处理器转移到“子程序名”处开始执行。两者的不同之处在于BL指令在转移到子程序执行之前,将其下一条指令的地址拷贝到R14(LR,链 接寄存器)
;可用 mov pc,lr就可以返回
;;;7号
ldr r2,=GPBDAT
;ldr r3,[r2]
;bic r3,r3,#0x1e
;orr r3,r3,#0xf7f ;
mov r3,#0x060 ; 0001 0110 0000 %%%%%%%%%应该这样写
str r3,[r2]
ldr r0,=0x8ffff
bl delay
;;;8号
ldr r2,=GPBDAT
;;ldr r3,[r2]
;;bic r3,r3,#0x1e
;;orr r3,r3,#0x0e0
mov r3,#0x0e0 ; 0000 1110 0000
str r3,[r2]
ldr r0,=0x8ffff ;
bl delay
;li
;;; 跳回到looptest 进行循环
b looptest
delay
;;; 跑马灯延时程序
sub r0,r0,#1 ;sub 减法
cmp r0,#0x0 ;将r0 与0比较
bne delay ;b是跳 ne 是不相等 ,不相等就跳到delay
mov pc,lr ;lr 里存的是调用函数时的下一条指令,让Pc指针指向lr就可以完成函数的返回
END ;程序结束符