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;
}
}