微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Linglong之AVR程例3 流水灯

Linglong之AVR程例3 流水灯

时间:11-22 来源:互联网 点击:
下面我们写流水灯的程序。LED程序的书写是我们学习单片机很基础的,但我是我觉的还是很重要的。能写好LED程序对我们理解AVR IO口的操作很有好处呀。

先这里简单的介绍下我的硬件,8个LED接到PA口上,公共端接地。

程序:

#include avr/io.h> //调用AVR IO口头文件

#include //调用GCC本身的调时程序。

int main(void) //主程序

{

unsigned char i = 0; //定义循环变量

DDRA = 0xff; //定义PA口为输出态

while(1) //主程序循环语句

{

PORTA=0x01//循环点亮IO口的灯

if(++i>=8)i=0; //对循环变量的控制,让其循环8次

_delay_ms(1000); //延时程序

}

}
这里我们主要讲讲while(1)语句部分。

第一句:PORTA = 0x01

在主函数中我们定义了i变量,我们并对其赋值为0.(这里其实赋不赋0,效果都是一样的,但是我还是希望大家赋值,这样比较规范)

这一句第一次执行的意思就是0x01左移0次,并将左移后的结果赋结PA口。0x01就是二进值的0000 0001,左移0位还是0000 0001.那么这样就是第一个LED点亮了。

第二句:if(++i>=8)i=0;

这里用的是一个if语句,这句话的意思就是如果i的值大于等于8了,那么将其清0;如果没有i就是其本身的值。

这里一个要重点注意的地方就是++i,而不是i++。这两个的区别就是是先加再执行,还是执行了再加。这是有不同的,大家可以试着改一下,体会下这两个的不一样。

第三句就是延时了没有什么好说的。

现在我们再重新的回顾下这个while(1)语句的一个执行过程。首先0x01左移0位,将0x01赋给PA口,点亮第一个LED。再对i进行自加0+1=1,1〈 8则不对其进行清0操作,最后是延时一会。

第二次执行PORTA=0x01

如此循环下去,当循环8次后i被清0,再从第一个LED亮起。

这样流水灯的效果就出来了。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top