/*
* avr010_sw_count.c
*
* SW0スイッチを押した回数をLCDに表示します。
* カウントアップはスイッチを押す毎に行います。
* スイッチはループで待ちます。
* スイッチSW0のONでカウンタを1プラスします。
* スイッチSW1をONでカウンタを0にクリアします。
* スイッチかOFFになるまでループで待ちます。
* チャタリング対策を付加します。
* カウントの最大値は65535とします。(unsigned intの最大値です。)
* 最大値を超えると最大値でカウント停止します。
* 優先されるスイッチはスイッチSW1です。
* unsigned intの範囲は0~65535です。
*/
#define F_CPU 1000000UL // 1MHz
#include <util/delay.h>
#include <avr/io.h>
#include "hd44780.h" // EZ-LCDインクルードファイル
void InitHard( void); // ポートの初期化及び割込設定
void LcdDisp( unsigned int); // カウント値をLCDに表示
void LcdDispClr( void); // LCDの表示をブランクにします。
int main(void)
{
unsigned int count = 0;
InitHard(); // ポートの初期化をします。
lcd_init (); // LCDの初期化をします。
LcdDisp( 0); // 初期値'0'を表示します。
while(1)
{
if( !(PIND & 0x01)) // リセットスイッチsw0がONならば
{
_delay_ms(10); // チャタリング10ms待ちます。
if ( !( PIND & 0x01)) // 再度確認します。
{
count = 0; // 0にクリアします。
LcdDispClr(); // LCD表示をブランクにします。
LcdDisp( count); // '0'を表示します。
}
}
else if ( !( PIND & 0x02)) // カウントアップsw1がONならば
{
_delay_ms(10); //チャタリング10ms待ちます。
if ( !(PIND & 0x02))
{
if ( count < 65535) // unsigned intの最大値より小さければカウンタを+1します。
{ // countがオーバーフローしない対策です。
count++; // カウンタを+1します。
}
LcdDisp( count);
}
}
else
{
continue;
}
while( (PIND & 0x03) != 0x03); // スイッチPD0及びPD1がOFFになるまでここで待ちます。
_delay_ms(10); // チャタリング10ms待ちます。
}
}
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( unsigned int cnt) // カウント値をLCDに表示
{
int i =0, j;
char str[5]; // カウンタの最大値は5桁65535です。
do // 剰余を演算子します。
{
str[i++] = cnt % 10 + 0x30;
cnt /= 10;
}while( cnt);
lcd_locate( 0, 0);
for ( j = 0; j < i; j++) //LCDに表示します。
{
lcd_putc( str[ i - j - 1]);
}
}
void LcdDispClr( void) // LCD表示をクリアする。
{
int i;
lcd_locate( 0, 0);
for ( i =0; i < 5; i++) // 表示桁5桁分
{
lcd_putc( ' '); //スペース(空白)を表示させます。
}
}