13.プッシュスイッチで1~7の数字を得る

プッシュスイッチ

  プッシュスイッチを押して内部のプログラムを変更できるようにします。
長押しすると、ピピッと音と共に白くLEDが光ります。その後スイッチを短く押すとLEDの色が変わり選択できるようになります。そのまま放置するとその値が選択されます。
プッシュスイッチで1~7の数字を得る
// ファイル名 selector.c
// プッシュスイッチで1~7の数字を得る
#include <htc.h>
__CONFIG(PWRTEN&HS&WDTDIS&UNPROTECT&MCLRDIS&BORDIS&IESODIS&FCMDIS);

#define _XTAL_FREQ 20000000
#define true  1
#define false 0
typedef unsigned char byte;
#define PERIOD 100
/*
20MHz/4 = 5MHz
TMR0 * prescale*counter/5MHZ
= (256-PERIOD) * 256*2/5MHZ 
= (256-100) * 256*2/5MHZ = 16m秒
*/

void LED(byte n, byte times);
void Delay50();
void Delay100();
void Delay500();
byte progSW();

unsigned char counter=0;
void interrupt Intr(void)
{
  // 割り込みがtimer0から来る
  counter++;
  TMR0 = PERIOD;
  T0IF = 0;                 // 割り込みフラグクリア
  return;
}

main()
{
  unsigned int pushTime=0;
  PORTA = 0;                  // PORTAを0にする
  TRISA = 0;                  // PORTAを出力に設定する
  ANSEL = 0;                  // アナログ入力をOFF
  // Timer0 の設定
  OPTION = 0;                 // FOSC/4 プリスケーラ1/2
  T0IE=1;                     // Timer0 の割り込みON
  T0IF=0;                     // 割り込みフラグクリア
  GIE=1;                      // CPUへの割り込みON
  
  while(true) {
    if(!RA3) {                // プッシュスイッチが
      if(counter==0){
        if(++pushTime > 500) {// 長押しだったら
          LED(7,2);           // 白で2回点滅
          progSW();           // さらに続けて番号を得る
          pushTime = 0;
        }  
      }  
    }
    else pushTime = 0;  
  }
}

void LED(byte n, byte times)
{
  byte i;
  for(i=0; i<times; i++) {
    PORTA =  n;
    Delay50();          // 50msディレイ
    PORTA =  0;
    Delay50();          // 50msディレイ
  }
}

byte progSW(){
  byte on=0;
  byte state=0;
  int t=0;
  Delay500();
  while(true){
    if(!RA3) {     // 押されたら
      Delay100() ;
      on = true;
      t=0;
    }
    if(on && RA3) {
      on = false;
      if(++state==8) state=0;
      LED(state, 1);
      t=0;
    }
    if(counter++==0) {
      if(t++==1000) return state;    // 0も返す
    }
  }
}

void Delay50()          // 50m秒ディレイ
{
  int i;
  for(i=0; i<5; i++)        
    __delay_ms(10); 
}
void Delay100()          // 100m秒ディレイ
{
  int i;
  for(i=0; i<10; i++)        
    __delay_ms(10); 
}
void Delay500()          // 500m秒ディレイ
{
  int i;
  for(i=0; i<50; i++)        
    __delay_ms(10); 
}

目次へ戻る