/* * 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( ' '); //スペース(空白)を表示させます。 } }