一步步点亮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

 


©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页