一步步点亮LED5_汇编编写延时函数并实现LED闪烁效果

《朱老师物联网大讲堂》学习笔记


上一节课,我们实现了可以自由选择的复杂点亮,下面是上一节的代码

#define GPJ0CON	0xE0200240 
#define GPJ0DAT	0xE0200244

.global _start
_start:
	ldr r0, =0x11111111
	ldr r1, =GPJ0CON
	str r0, [r1]

	ldr r0, =( (1<<3) | (0<<4) | (1<<5) )
	ldr r1, =GPJ0DAT
	str r0, [r1]

	b.


下面我们将在上一节的基础上,实现LED闪烁的效果



LED闪烁效果的实现,其实就是

亮 + 延时 + 灭 + 延时 + 亮 。。。


延时实现
用一些没有效果,没有目的代码消耗时间,达到延时的效果。


需要注意的是,不能把函数写到主体代码里面,就好像c语言中,子函数不能写进main函数里面,而是要写成独立的函数。


下面是具体代码的实现

#define GPJ0CON	0xE0200240 
#define GPJ0DAT	0xE0200244

.global _start
_start:
	ldr r0, =0x11111111
	ldr r1, =GPJ0CON
	str r0, [r1]
	
	ldr r0, =( (0<<3) | (0<<4) | (0<<5) )
	ldr r1, =GPJ0DAT
	str r0, [r1]
	
	bl delay
	这句执行的同时,就已经将返回地址写进lr里面了
	
	ldr r0, =( (1<<3) | (1<<4) | (1<<5) )
	ldr r1, =GPJ0DAT
	str r0, [r1]

	bl delay
	
	ldr r0, =( (0<<3) | (0<<4) | (0<<5) )
	ldr r1, =GPJ0DAT
	str r0, [r1]	

	bl delay

	ldr r0, =( (1<<3) | (1<<4) | (1<<5) )
	ldr r1, =GPJ0DAT
	str r0, [r1]
	
flag:
	b flag
	
delay:
	ldr r2, =10000000
	ldr r3, =0x0
delay_loop:
	sub r2, r2, #1
	cmp r2, r3
	比较之后会,如果计算结果为0,自动置位CPSR中Z标志位
	如果r2等于r3,Z会等于1,下一句中的eq就会成立

	bne delay_loop
	mov pc, lr 
	函数调用返回
	

汇编中调用函数用bl指令,子函数中最后用mov pc, lr来返回,这里和C语言中不同,准确说是C语言帮我们实现了。

这样实现的循环,有一种手动的感觉,如何实现像c中的循环呢?

在第一次亮的那段代码前加一个标号flash,然后在最后一次灭的后面加一个bl flash

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值