下面我们写流水灯的程序。LED程序的书写是我们学习单片机很基础的,但我是我觉的还是很重要的。能写好LED程序对我们理解AVR IO口的操作很有好处呀。
先这里简单的介绍下我的硬件,8个LED接到PA口上,公共端接地。
程序:
#include //调用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亮起。
这样流水灯的效果就出来了。
关键字:AVR程例 流水灯
引用地址:
Linglong之AVR程例3 流水灯
推荐阅读最新更新时间:2024-03-16 14:46
畅学多功能MSP430F149实验箱流水灯实验
/******************************************************* 程序功能:单色流水灯测试 开发环境:IAR For MSP430 5.30 硬件环境:EESKILL多功能开发学习板/实验箱(2017版),MSP430F149核心板 接线说明:核心板P4口接底板JP15,具体为:P40-I1,P41-I2,P42-I3,P43-I4,P44-I5,P45-I6,P46-I7,P47-I8 跳线说明:无 实验现象:8个流水灯依次点亮 技术网站:http://www.eeskill.com 淘宝店铺:http://cepark.taobao.com 作
[单片机]
ARM学习1-LED流水灯
通过近段时间的不懈努力终于找到一个可以用来编译ARM 的Keil ,再利用Protuse软件进行模拟仿真。 开始了我的ARM学习之路 本实例是我学习ARM的第一个实例,仿真软件是利用的是Porteus,编译软件用的是Keil的RealView.MDK.3.2。 本程序是花样流水。一共有三个花样,可以通过按键选择不同的花样。通过此程序学习了ARM GPIO的处理和按键处理。 原理图: 程序代码: /*********************************************/ /* */ /* led.c: 花样流水
[单片机]
用51单片机点亮流水灯
1. 直接按位操作一个一个点亮 #include reg51.h //头文件 sbit LED0=P2^0; //位定义单片机接LED灯的端口 sbit LED1=P2^1; sbit LED2=P2^2; sbit LED3=P2^3; sbit LED4=P2^4; sbit LED5=P2^5; sbit LED6=P2^6; sbit LED7=P2^7; void delay()//延时函数 { unsigned char a,b; for(a=0;a 200;a++) for(b=0;b 200;b++); } void main()//主函数 { while(1) { LED0
[单片机]
Linglong之AVR程例5 数码管4位显示
现在我们让4位数码管显示4位数字,这里用的动态扫描法。 这里说一个这个写这个程序要注意的地方: 1 动态描的循序。首先是将数据送入段选端,再打开要显示位的位选端,再延时,最后就是开闭所有的位选端。这个如果没有处理好很容易出现鬼影。 2 延时。我这里是延时5ms。看了下延时效果还不错。 关键是理解动态扫描的思想:我们先点亮第一位数码管,亮5ms.再点亮第二位数码管,亮5ms.这时第一位是不亮的,如此循环下去。因为人眼5ms反映不过来,看上去就是4位数码管都是亮的。 比较简陋的源程序: #include avr/io.h
[单片机]
STM32库开发和流水灯
一、库开发 这里指的库开发使之调用库函数接口完成对相应寄存器的设置,相比较与51单片机编程中直接对寄存器操作而言,代码量跟查找手册看寄存器位再去配置,能节约很多时间。但是相对的对寄存器的位操作看得就没拿明白了,不知道库函数接口是如何配置各个寄存器位的了,这个时候可以将函数名复制下来去STM32固件库使用手册中查看相应了用法了。如下图所示复制了库函数之后,打开STM32固件库使用手册,复制到这里 然后回车,就会跳到相应的库函数说明那里,一下就清楚了它是如何配置寄存器位的,如下图 这个函数解释的很清楚了,使能和失能APB1的外设时钟,如果不理解参数是什么,可以复制参数能在末尾的表中找到相应的参数解释。 说一下我对库开
[单片机]
51 main.c/点阵式流水灯
/********************************************************************** * 文件名称: main.c/点阵式流水灯 * 程序作者: Kevin Chin * 程序版本: V1.0 * 编制日期: 2010/07/15 * 功能描述: 8*8的点阵式,流水灯。从左上角第一个点开始亮到最后一个点,如此循环。 * 编译器:Keil3 * 芯片:STC89C54,外部12MHZ晶振 * 邮箱:kevinchin@qq.com * 论坛:bbs.cepark.com * 基于浩豚电子的mini80e开发板 *********************************
[单片机]
单片机32位LED花样流水灯程序+原理图
最近有点忙,可还是腾出空来打造了一款 单 片机32位LED花样流水灯 !......................那是没办法的,那*丝急了 这是原理图: 呵呵,原理不怎么难吧 LED心形排布图: 这是PCB,我改过了的,减少了一些限流电阻! 将PCB打印好,弄好板,装好原件,再焊接好,看,这就是成品了 部分程序: #include reg52.h #define uchar unsigned char uchar flag=200; //////////////////////////////////////////////////////////////////
[单片机]
STM32按键控制流水灯 转换|加速|减慢
单片机源程序如下: #include stdio.h #include stm32f4xx.h #include led.h #include key.h int main(void) { int pwm_cmd; SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); LED_Init(); KEY_Init(); EXTI_Config(); while(1) { }
[单片机]