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向左或向右移动。
实验电路:
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;
}
}