フローチャート説明
1.スイッチSW0がONになっているか確認します。OFFであればここでループしてONになるまで待ちます。
while((PIND & 0x01) != 0); // '1'(スイッチSW0がOFFしている)の間はwhile内でループ。またはwhile(
PIND & (1 << PORTD0));という書き方もあります。
2.スイッチSW0がONであれば10ms待ちます。スイッチのチャタリング時間待った後に次の処理に進むことでチャタリングによる誤作動を防ぎます。
_delay_ms(10); // delay_ms関数を使用します。
3.LED4を点灯させます。
PORTD |= 1 << PORTD4;
4.スイッチSW0がOFFになるのを確認します。ONであればここでループしてOFFになるまで待ちます。
while((PIND & 0x01) == 0); // '0'(スイッチPD0がONしている)の間はwile内でループ。またはwhile(
!(PIND & (1 << PORTD0)));という書き方もあります。
5.スイッチSW0がOFFになったら10ms待ちます。
_delay_ms(10);
6.LED4をOFFします。
PORTD &= ~(1 << PORTD4);
7.1に戻ります。
/*
* avr006_PortLoop.c
*
*スイッチ入力をループで待ちます。
*スイッチONでLED点灯
*スイッチOFFでLED消灯
*/
#define F_CPU 1000000UL // 1MHz
#include <util/delay.h>
#include <avr/io.h>
void InitHard( void); // ポートの初期化
int main(void)
{
InitHard(); //ポートの初期化を行います。
while(1) // プログラム全体のループです。この中にスイッチ入力のプログラムを作ります。
{
while( PIND & 0x01); // スイッチPD0がONになるまでここで待ちます。
_delay_ms(10); // 10ms待ちます。
PORTD |= 1 << PORTD4; // LED_PD4を点灯させます。
while( !(PIND & 0x01)); // スイッチPD0がOFFになるまでここで待ちます。
_delay_ms(10); // 10ms待ちます。
PORTD &= ~(1 << PORTD4); // LED_PD4をOFFします。
}
}
void InitHard( void) // ポートの初期化
{
// ポートB初期設定
DDRB = 0xff; // PB7~PB0を出力に設定します。
PORTB = 0; // PB7~PB0に'L'を出力します。
// ポートC初期設定
DDRC = 0x3f; // PC7,PC6は初期(入力)、PC5~PC0を出力に設定します。
PORTC = 0; // PC7~PC0に'L'を出力します。
// ポートD初期設定
DDRD = 0xf0; // PD7~PD4は出力、PD3~PD0は入力に設定します。
PORTD = 0; // PD7~PD0に'L'を出力します。
}