ATMEGA32第一个学习例子:
学单片机得先弄懂它的IO口,所以第一个例子先以控制IO口的输出。最好的方法就是做个LED流水灯。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
LED灯的连接定义如下:
led1---PORTD.5, led2--PORTD.4,
led3---PORTD.3, Led4---PORTD.2,
led5---PORTB.7, led6---PORTB.6,
Led7---PORTB.5, led8---PORTB.4,
led9---PORTB.3, led10---PORTB.2,
led11---PORTB.1, led12---PORTB.0.
程序如下:
//ICC-AVR application builder : 2008-07-02 下午 03:28:23
// Target : M32
// Crystal: 8.0000Mhz
#include
#include
#define uchar unsigned char
void port_init(void) //端口定义
{
PORTA = 0x00; //低电平
DDRA = 0xFF; //输出
PORTB = 0x00; //低电平
DDRB = 0xFF; //输出
PORTC = 0x00;
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x3C;
}
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
//1微秒延时
void delay_1us(void)
{ uchar i="8";
asm("nop");
i--;
}
//长微秒延时
void delay_nus(uchar t)
{ while(t--)
delay_1us();
}
//1毫秒延时
void delay_1ms(void)
{
delay_nus(1000);
}
//长毫秒延时
void delay_nms(uchar t)
{ while(t--)
delay_1ms();
}
//定义LED等
void led_out(void)
{ uchar i;
for(i=1;i<5;i++)
{PORTD|=BIT(6-i);
delay_nms(500);}
for(i=5;i<13;i++)
{PORTB|=BIT(12-i);
delay_nms(500);}
for(i=12;i>4;i--)
{
PORTB&=~BIT(12-i);
delay_nms(500);
}
for(i=4;i!=0;i--)
{
PORTD&=~BIT(6-i);
delay_nms(500);
}
}
//主程序开始
void main(void)
{
init_devices();
while(1)
{
led_out();
}
//insert your functional code here...
}
文章评论(0条评论)
登录后参与讨论