/*#include<avr/io.h>
#include<avr/delay.h>
#define uchar unsigned char
#define uint unsigned int
//注: 内部函数_delay_ms() 最高延时 262.144mS@1MHz 即 32.768ms@8MHz
//该函数可以实现较精确的定时for()/while()指令很难计算延时时间
//为了使 _delay_ms()函数的延时正确,须在makefile中设定F_CPU为实际的系统时钟,系统时钟设定为8MHz
//本程序的实现PB口左移轮流熄灭,PD口右移轮流熄灭,而从中间两路分开向两边移动熄灭的功能
//本程序是下行注释,可能是我刚开始学习AVR起步的第一个原创跑马灯程序
/*void delay_ms(uint ms) //延迟
{
uint i;
for(i=0;i<ms;i++)
_delay_loop_2(250);
} */
/*int main(void)
{
unsigned char i,j,k,m ;
//定义变量
DDRB=0xFF ;
//让PB口全部为输出口
DDRD=0xFF ;
//让PD口全部为输出口
PORTB=0xFF ;
//端口PORTB输出高电平,灯灭
PORTD=0xFF ;
//端口PORTD输出高电平,灯灭
while(1)
{
i=0x01 ;
m=0x80 ;
//循环8次,即PB0~~PB7,PD0~PD7轮流闪亮
for(j=0;j<8;j++)
{
PORTB=~i ;
//反相输出,低电平有效
PORTD=~m ;
//反相输出,低电平有效
for(k=0;k<10;k++)
_delay_ms(500);
//延时 30*10=300毫秒,可自行调节
//delay_ms(100);可以用此定义的延迟函数代替#include<avr/delay.h>库函数_delay_ms()
i=i<<1 ;
//左移一位
m=m>>1 ;
//右移一位
}
i=0x80 ;
m=0x01 ;
//循环8次,即PB0~~PB7,PD0~PD7轮流闪亮
for(j=0;j<8;j++)
{
PORTB=~i ;
PORTD=~m ;
for(k=0;k<10;k++)
_delay_ms(500);
i=i>>1 ;
m=m<<1 ;
}
}
}*/
/*这份代码经源码格式软件格式化过
yang_hx@neusoft.com */
//----------------------------------------------------------
// ATMega16 板演示程序 系列(一)跑马灯
// LED 显示
// 编译环境 WINAVR
// 2005.6.1
// changyuan009 & ICBEAN
// 注意函数1<<x和_BV(x)函数的效果是一样的,都是将X位置一
//----------------------------------------------------------
#include <avr/io.h>
//#include "ATmega16.h"
#include <avr/delay.h>
#define uchar unsigned char
#define uint unsigned int
void delay_ms(uint ms) //延迟
{
uint i;
for(i=0;i<ms;i++)
_delay_loop_2(250);
}
void RightDisplay( void )
{
uchar RightCount ;
for( RightCount = 7; RightCount <8; RightCount--) //PD口从右向左步进跳动,闪烁
{
delay_ms(500);
PORTD = _BV(RightCount);
} delay_ms(500);
PORTD= 0x80; //PD口的PD0脚点亮
PORTD= 0x00; //PD口的灯全部熄灭
for( RightCount = 7; RightCount <8; RightCount--) //PB口从右向左步进跳动,闪烁
{
delay_ms(500);
PORTB = _BV(RightCount);
}
//delay_ms(5000); //PB口的灯全部熄灭
PORTB = 0x00;
}
void DbSideDisplay( void )
{
uchar DbSideLeft;
uchar DbSideRight;
for( DbSideLeft = 0, DbSideRight = 7; DbSideLeft < 8; DbSideLeft ++,DbSideRight --) //PB口从左,PD口从右同时向中间快速跳动,闪烁
{
delay_ms(500);
//PORTB |=(1<<DbSideLeft); 此语句和下一句PORTB |=_BV(DbSideLeft)是等同的效果
//PORTD |=(1<<DbSideRight);
PORTB |=_BV(DbSideLeft);
PORTD |=_BV(DbSideRight);
}
PORTB = 0x00;
PORTD = 0x00;
for( DbSideLeft = 0, DbSideRight = 7; DbSideLeft < 8; DbSideLeft ++,DbSideRight --) //PB口从右,PD口从左同时从中间向两边快速跳动,分开
{
delay_ms(500);
PORTB |=_BV(DbSideRight);
PORTD |=_BV(DbSideLeft);
//PORTD |=(1<<DbSideLeft);
//PORTB |=(1<<DbSideRight);
}
PORTB = 0x00;
PORTD = 0x00;
}
int main( void)
{
DDRB = 0xff;
DDRD = 0xff;
while(1)
{
RightDisplay();
DbSideDisplay();
}
}