本文へスキップ

アトメル社のAVRマイコンをつかった電子工作および無線を使った電子工作を紹介します。





ホーム > ソフト室 >AVRマイコンで始めるC言語の使い方 >スイッチを押した回数をLCDに表示する。

AVRマイコンで始めるC言語の使い方

スイッチを押した回数をLCDに表示する。

スイッチSW1を押すとLCDに表示されるカウンタの値を+1します。
スイッチSW0を押すとLCDのカウンタの値を'0'にクリアします。
チャタリング対策を行います。

フローチャート

(1)スイッチ入力、LCDが使用できるようにポート設定を行います。
(2)LCDを初期化します。
(3)LCDにカウンタの初期値'0'を表示します。
(4)スイッチSW0、SW1を監視します。
    SW0はカウンタのクリア
    SW1はカウンタを+1します。
(5)以下は条件分岐です。
[分岐1]
  1.SW0がONするとカウンタ'0'にクリアします。
  2.SW0がOFFするまで待ちます。
[分岐2]
  1.SW1がONするとカウンタを+1します。
  2.SW1がOFFするまで待ちます。
[分岐3]
  何もせずループします。

スイッチSW0及び、SW1についてチャタリング対策を行います。10ms待った後再度スイッチの状態を読み込みONしていれば次の処理を行い、OFFであればノイズとして何もしないでループします。
スイッチのOFFになる時も同様にチャタリング対策を行います。

プログラム

・LCDへの表示は関数で行います。
・10msディレイはdelay_msを使用します。
・カウンタをクリアした時はLCDに表示されている文字をクリアするためにスペースで5桁分上書きします。
/*
 * 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( ' ');         //スペース(空白)を表示させます。
        }
}

実行結果

カウントアップ

SW1を押すとカウントアップします。

カウンタクリア

SW0を押すとカウンタをクリア'0'にします。
前ページ次ページ