AVRマイコンでキャラクタLCDに時間を表示する(その1)


アニメ『タイムボカン24』
昔見てた『タイムボカン』とは違うものですね。今風のかわいいキャラになっていますが、むず痒さを感じます。3悪も登場しますが、キャラが薄い気が。でも、設定は面白いんですよね。世間が知っている歴史は間違った歴史で、でも、真実が暴かれると、教科書を変えないといけないから、企業人の3人組が真実を暴かれないように頑張るっていう。説明が3悪視点ですが。。。

キャラクタLCDに時計を表示します。
ポート制御にビットフィールドを使う」で作ったプログラムを改造します。今回は時計とまではいかなくて、時を刻むだけのものです。

元のソースです。

int main(void)
{
        clcd_init();

        clcd_print("Bit Field!!");

        while(1)
                ;

        return 0;
}

まず、時を刻み続けたいので、whileの中に、キャラクタLCDへの表示処理を入れます。1秒毎に表示更新するため、_delay_ms(1000)とします。

int main(void)
{
	char str[10];

        clcd_init();

	str[0] = '0';
	str[1] = '0';
	str[2] = ':';
	str[3] = '0';
	str[4] = '0';
	str[5] = ':';
	str[6] = '0';
	str[7] = '0';
	str[8] = 0;

        while(1){
	        clcd_print(str);
		_delay_ms(1000)
	}

        return 0;
}

まだこの段階では00:00:00しか表示されません。しかも、ディスプレイのカーソルを左端に戻していないので、00:00:00の表示は、どんどん増えていきます。
では、カーソル位置を左端に戻すため文字列表示前にコマンドを発行します。ただし、カーソルを戻す時間分待つ必要があるので、_delay_ms(2)を追加します。時間の辻褄を合わせるため_delay_ms(1000)の方は、998にしています。

        while(1){
                /* Return Home
                       RS,RW DB7---4  DB3---0 */
                COMMAND(0,0, 0,0,0,0, 0,0,1,0);
                _delay_ms(2);

	        clcd_print(str);
		_delay_ms(998)
	}

次に数値を文字列にする関数を作りましょう。2桁限定ですが、時間を表すために使うだけなのでこれで十分です。

char* to_string(char *str, int num)
{
        if(num >=  10){
                *str++ = (num / 10)+'0';
                num %= 10;
        }else{
                *str++ = '0';
        }
        *str++ = num +'0';
        *str = 0;
        return str;
}

時分秒それぞれ数値を文字列にする関数も用意しておきます。

void get_clock_string(char *str, int h, int m, int s)
{
        str = to_string(str,h);
        *str++ = ':';
        str = to_string(str,m);
        *str++ = ':';
        str = to_string(str,s);
}

最終的に、main関数はこのようになりました。マイコンを起動すると、00:00:00から時を刻み始めます。

int main(void)
{
        char str[10];
        int h,m,s;

        h=0;
        m=0;
        s=0;

        clcd_init();

        while(1){
                /* Return Home
                       RS,RW DB7---4  DB3---0 */
                COMMAND(0,0, 0,0,0,0, 0,0,1,0);
                _delay_ms(2);

                get_clock_string(str,h,m,s);

                clcd_print(str);

                _delay_ms(998);
                if(++s >= 60){
                        s=0;
                        if(++m >= 60){
                                m=0;
                                if(++h >= 24){
                                        m=h;
                                }
                        }
                }
                 
        }

        return 0;
}

しかし、内部クロックなので精度が良いとは言えません。ストップウォッチと時間がズレてます。
avr-clock-001

レポジトリ。

~$ git clone https://github.com/takkete/bread.git
~$ cd bread/mcu/avr/attiny2313/device/clock

コメント

  1. […] ← AVRマイコンでキャラクタLCDに時間を表示する(その1) […]

  2. […] 「AVRマイコンでキャラクタLCDに時間を表示する(その1)」の、クロックの精度を上げたいと思います。 […]

タイトルとURLをコピーしました