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){