天天看點

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;

}

}

繼續閱讀