您的位置:首页 > 其它

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

2016-03-27 14:14 369 查看
《朱老师物联网大讲堂》学习笔记

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

#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

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: