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

来源:互联网 发布:js 数组循环 编辑:程序博客网 时间:2024/05/23 01:25

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


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

#define GPJ0CON0xE0200240 #define GPJ0DAT0xE0200244.global _start_start:ldr r0, =0x11111111ldr r1, =GPJ0CONstr r0, [r1]ldr r0, =( (1<<3) | (0<<4) | (1<<5) )ldr r1, =GPJ0DATstr r0, [r1]b.


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



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

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


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


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


下面是具体代码的实现

#define GPJ0CON0xE0200240 #define GPJ0DAT0xE0200244.global _start_start:ldr r0, =0x11111111ldr r1, =GPJ0CONstr r0, [r1]ldr r0, =( (0<<3) | (0<<4) | (0<<5) )ldr r1, =GPJ0DATstr r0, [r1]bl delay这句执行的同时,就已经将返回地址写进lr里面了ldr r0, =( (1<<3) | (1<<4) | (1<<5) )ldr r1, =GPJ0DATstr r0, [r1]bl delayldr r0, =( (0<<3) | (0<<4) | (0<<5) )ldr r1, =GPJ0DATstr r0, [r1]bl delayldr r0, =( (1<<3) | (1<<4) | (1<<5) )ldr r1, =GPJ0DATstr r0, [r1]flag:b flagdelay:ldr r2, =10000000ldr r3, =0x0delay_loop:sub r2, r2, #1cmp r2, r3比较之后会,如果计算结果为0,自动置位CPSR中Z标志位如果r2等于r3,Z会等于1,下一句中的eq就会成立bne delay_loopmov pc, lr 函数调用返回

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

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

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

 


0 0
原创粉丝点击