AVRマイコンで始めるC言語の使い方
閏年を計算する。
目的
演算子の使い方について、閏年のプログラムを作り学習します。
ここで取り上げる演算子は比較演算子、論理演算子、剰余演算子です。
方針
閏年の時は'leap year'と表示します。閏年でない時は’not leap year’と表示します。
計算は1900年、2000年、2001年、2004年の4つの年とします。
閏年は4で割り切れて、100出割り切れない年です。また、400で割り切れる場合は閏年です。
フローチャート
(1)閏年のチェックはサブルーチン(関数)を使用します。
閏年の条件は
・400で割り切れる年
・4で割り切れて、100で割り切れない年
(2)上記条件を満たす時は閏年として"TRUE"を返します。
満たさない場合は"FALASE"を返します。
(3)ここで使用しているハードウエアは数字の入力する機能を持っていないのでプログラムにチェックする年をint型の配列に格納します。
(4)forループを使用してメインフローの閏年のチェックを行います。
(5)LCDに表示する部分はサブルーチン(関数)を使用します。
プログラム
/*
* avr130.c
*
* 閏年を計算する
*/
#include <avr/io.h>
#include "hd44780.h" // EZ-LCDインクルードファイル
#define TRUE 1 // 閏年
#define FALSE 0 // 閏年でない
void InitHard( void); // ポートの初期化
void LcdDisp( int, int); // 結果をLCDに表示
int main(void)
{
int chk[4] = {1900, 2000, 2001, 2004};
int i, result;
InitHard(); // ポートの初期化をします。
lcd_init (); // LCDの初期化をします。
for ( i = 0; i < 4; i++) // 閏年の計算及び表示ループ
{
lcd_locate( i, 0); // lcdの表示位置をi行、0桁に移動する。
if ( ( (chk[ i] % 400) == 0) || ( ( ( chk[ i] % 4) == 0) && ( ( chk[ i] % 100) != 0))) // 閏年
{
LcdDisp( TRUE, chk[ i]); // LCDに表示
}
else // 閏年でない
{
LcdDisp( FALSE, chk[ i]);
}
}
while(1)
{
//TODO:: Please write your application code
}
}
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'を出力します。
}
void LcdDisp( int flg, int chk) // 結果をLCDに表示します。
{
char str[4];
int i = 3;
do // 年をキャラクタに変換します。
{
str[ i--] = chk % 10 + 0x30;
chk /= 10;
}while( chk);
// 変換した年をlcdをに表示します。
for ( i = 0; i < 4; i++)
{
lcd_putc( str[i]);
}
lcd_putc( ' ');
// 判定結果を表示します。
if ( flg == FALSE) // 閏年でない
{
lcd_putc( 'n');
lcd_putc( 'o');
lcd_putc( 't');
lcd_putc( ' ');
}
lcd_putc( 'l');
lcd_putc( 'e');
lcd_putc( 'a');
lcd_putc( 'p');
lcd_putc( ' ');
lcd_putc( 'y');
lcd_putc( 'e');
lcd_putc( 'a');
lcd_putc( 'r');
}
LCD表示
閏年の計算結果を表示することができました。