天天看点

AVR单片机 实验一 单片机基本输入输出(GPIO)实验

AVR单片机 实验一 单片机基本输入输出(GPIO)实验

1 实验目的

掌握ICCAVR 集成开发环境的使用;

了解ATmega16单片机管脚的输入输出寄存器的使用方法;

2 实验内容

建立一个工程,实现流水灯的功能,并通过ISP下载到单片机中,观察实验效果。

3 采用AVR单片机基本输入输出接口设计流水灯实验;通过GPIO读取按键(SW8)的状态,实现如下功能:单片机刚启动后,所有LED不显示,当按下SW8后,流水灯从左向右循环显示,而再按一次SW8后,流水灯恢复为从右向左循环显示,依次类推。请写出相关代码(或描述设计思想)。

注:LED0~LED7对应的IO分别是PC0-PC7,SW8对应的IO是PD3,见实验板原理图, 每个LED的停留显示时间约0.5秒, 且当变换移位方向时,是从目前所显示的LED向左或向右移动。

实验电路:

AVR单片机 实验一 单片机基本输入输出(GPIO)实验

1 实验目的

掌握ICCAVR 集成开发环境的使用;

了解ATmega16单片机管脚的输入输出寄存器的使用方法;

2 实验内容

建立一个工程,实现流水灯的功能,并通过ISP下载到单片机中,观察实验效果。

3 采用AVR单片机基本输入输出接口设计流水灯实验;通过GPIO读取按键(SW8)的状态,实现如下功能:单片机刚启动后,所有LED不显示,当按下SW8后,流水灯从左向右循环显示,而再按一次SW8后,流水灯恢复为从右向左循环显示,依次类推。请写出相关代码(或描述设计思想)。

注:LED0~LED7对应的IO分别是PC0-PC7,SW8对应的IO是PD3,见实验板原理图, 每个LED的停留显示时间约0.5秒, 且当变换移位方向时,是从目前所显示的LED向左或向右移动。

实验电路:

原始程序码:

#include <iom16v.h>

#include <macros.h>

#include <stdio.h>

void delay(int);

void Rkey();

unsigned char key = 0;

main()

{

int i = 0;

unsigned char j;

unsigned char flagj1=j<<1<<1<<1<<1<<1<<1<<1<<1,flagj2=j>>1>>1>>1>>1>>1>>1>>1>>1;

PORTC = 0xff;

DDRC = 0xff;

DDRD |= (1 << 3);

PORTD &= ~(1 << 3);

DDRD &= ~(1 << 4);

PORTD |= (1 << 4);

j=1;

while (1)

{

Rkey();

switch (key)

{

case 1:

if(jflagj1)

j=1;

for (i=0; i < 8; i++)

{

if(jflagj1)

j=1;

PORTC = ~j;

Rkey();

if(key2)

break;

delay(500);

Rkey();

if(key2)

break;

j = j << 1;

};

PORTC = 0xff;

delay(50);

break;

case 2:

if(jflagj2)

{

j = 1;

j = j << 7;

}

for (i=0; i < 8; i++)

{

if(jflagj2)

{

j = 1;

j = j << 7;

}

PORTC = ~j;

Rkey();

if(key1)

break;

delay(500);

Rkey();

if(key1)

break;

j = j >> 1;

};

PORTC = 0xff;

delay(50);

break;

}

}

}

void delay(int x)

{

int i, j;

for (i = x; i > 0; i–)

{

for (j = 100; j > 0; j–);

};

}

void Rkey()

{

if ((PIND&(1 << 4)) == 0)

{

delay(60);

if ((PIND&(1 << 4)) == 0)

key = key + 1;

if (key > 2)

key = 1;

}

}

4 思考题:如何实现,当第一次按下SW8后,LED灯全部亮灭闪烁,再次按下SW8时,则所有LED灯依当前亮灭状态决定全亮显示或全不显示。

#include <iom16v.h>

#include <macros.h>

#include <stdio.h>

void delay(int);

void Rkey();

unsigned char key=0;

int ud=0;

main()

{

int i=0;

unsigned char j;

PORTB=0xff;

DDRB=0xff;

DDRD|=(1<<3);

PORTD&=~(1<<3);

DDRD&=~(1<<4);

PORTD|=(1<<4);

while(1)

{

Rkey();

switch(key)

{

case 1:j=1;

PORTB=0x0;

ud=0;

delay(1000);

Rkey();

if(key>1)

{

PORTB=0x0;

break;

}

PORTB=0xff;

ud=0;

delay(1000);

Rkey();

if(key>1)

{

PORTB=0xff;

break;

}

}

break;

default:

break;

}

}

void delay(int x)

{

int i,j;

for(i=x;i>0;i–)

{

for(j=110;j>0;j–);

};

}

void Rkey()

{

if((PIND&(1<<4))==0)

{

delay(200);

if((PIND&(1<<4))0)

{

if(ud0)

{

ud=1;

key=key+1;

}

}

if(key>2)

key=1;

}

}

继续阅读