Help us understand the problem. What is going on with this article?

H8/3664ではじめるマイコン制御6 押した回数を7segLEDで表示2 ダイナミック点灯

More than 1 year has passed since last update.

H8/3664ではじめるマイコン制御2
では押した回数を一桁で表示させていましたがその表示を二桁まで拡張させたものが今回のプログラムになります。

7segDisplay2.c
//ボタンの押した回数を二桁でカウントする
#include <stdio.h> 

#define BRR     (*((unsigned char *)0xFFA9))
#define TMA     (*((unsigned char *)0xFFA6))

#define PMR1    (*((unsigned char *)0xFFE0))
#define PMR5    (*((unsigned char *)0xFFE1))

#define PCR1    (*((unsigned char *)0xFFE4))
#define PCR5    (*((unsigned char *)0xFFE8))
#define PCR7    (*((unsigned char *)0xFFEA))
#define PCR8    (*((unsigned char *)0xFFEB))

#define PDR5    (*((unsigned char *)0xFFD8))
#define PDR7    (*((unsigned char *)0xFFDA))
int wait();

main()
   {
   unsigned char LED[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6D,0x7d,0x27,0x7f,0x67};//1の位用配列
    unsigned char LED10[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfc,0xa7,0xff,0xe7};//10の位用配列
    int i,count=0,count10=0;

    //SWの状態記憶用
    int OldState=0;
    int State=0;

    BRR=12;         //16MHZ時には12を デフォルトは7 ボーレート変更   
    PMR1 = 0x00;            /*ポート1を汎用IOに設定*/
    PMR5 = 0x00;            /*ポート1を汎用IOに設定*/

    TMA = 0x98 ; 

    PCR1 = 0xff;    //アドレス FFE4
    PCR5 = 0xff;    //FFE8
    PCR7 = 0x00;    
    PCR8 = 0xff;    //FFED      //00入力  ff出力

    for (;;) {/* 無限ループ */

        PDR5=LED[count];
        wait(500);
        PDR5=0x00;
        wait(50);

        PDR5=LED10[count10];
        wait(500);
        PDR5=0x00;
        wait(50);

        State=0;

        if((PDR7 & 0x40)==0x00)State=1;

        if(OldState!=State && OldState!=1){
            if(count<9){
                count++;
            }
            else{
                count10++;
                count=0;
            }if(count10>=9)count10=0;
        }

        OldState=State;

    }
    return 0;
   }

int wait(int n)
{
    int i;
    for(i=0;i<n;i++);
}

表示方法はダイナミック点灯です。

ダイナミック点灯とは点灯しているLEDを一定周波数で高速に点滅させる点灯方法です。 ... 高い周波数で点滅する間隔を短くすれば、人間の目で見た場合に残像現象によって常時点灯しているように見えます。

        PDR5=LED[count];
        wait(500);
        PDR5=0x00;
        wait(50);

        PDR5=LED10[count10];
        wait(500);
        PDR5=0x00;
        wait(50);

表示部分です。
間に0x00を挟んでいるのはゴーストを防ぐためです。
さらにwait()で表示時間を稼いでいます。

そのほか主な追加点は

int OldState=0;
    int State=0;

にスイッチの状態を記憶させて以下のif文の条件に用いています。

if(OldState!=State && OldState!=1){

実行例

93165.jpg

次回H8/3664ではじめるマイコン制御7

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away