前回は押しボタンそれぞれに数字を割り振っていましたが今回はボタンが押された回数を数えるプログラムです。
//黒の押しボタンが押された回数を一桁で数字を表示するプログラム
# 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))
void wait();//プロトタイプ宣言
main()
{
int i,count=0;
unsigned char LED[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x67};
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 (;;) {/* 無限ループ */
while ((PDR7 & 0x40)!= 0);/* 押されていないとき待機 */
wait(30000); /* チャタリング対策 */
if(count<9){
count++;
}
else{
count=0;
}
PDR5=LED[count];
while ((PDR7 & 0x40) == 0);/* 押されているとき待機 */
wait(30000); /* チャタリング対策 */
}
return 0;
}
void wait(int n)
{
int i;
for(i=0;i>n;i++);
}
前半部分はほとんど同じです。変更点はmain内のfor文と関数wait()の追加です。
while ((PDR7 & 0x40)!= 0);// 押されていないとき待機
wait(30000); // チャタリング対策
if(count<9){
count++;
}
else{
count=0;
}
PDR5=LED[count];
while ((PDR7 & 0x40) == 0);// 押されているとき待機
wait(30000); // チャタリング対策
while ((PDR7 & 0x40)!= 0);// 押されていないとき待機
wait(30000); // チャタリング対策
while ((PDR7 & 0x40) == 0);// 押されているとき待機
wait(30000); // チャタリング対策
このwhileでスイッチの立ち上がり、立下りを見ています。
さらにその後wait()でチャタリングが起こる時間より長い時間処理を待たせます。
もしこのプログラムでもチャタリングがおこるなら()内の数字を増やしてください。最後は表示プログラムです。
if(count<9){
count++;
}
else{
count=0;
}
PDR5=LED[count];
前回用意した0~9を表示する配列をcountによって変化させていき9をこえたら0に戻す条件文です。