PICとメカな日々

Webにも萌えにも限界を感じたオタクがPICマイコンをいじる日々。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

普通のデジタル時計

 7セグLEDが余っていたという理由だけで、なんとなくデジタル時計を作ってみる。ダイナミック点灯は前回のバイナリ時計でやったので、今回の目標はトランジスタの動作確認。

 最初は32Khzのクリスタルで動かそうとしたが、うまいこと発振しないのと(やっぱ発振モードをLPにしないとだめか?)ダイナミック点灯のちらつきが起きそうだったので2Mhzクリスタルに変更。

 なんとなく動いているので電池動作でしばらく確認した後、また古い携帯用のアダプタに電源を変更する予定。

デジタル時計


 回路図はコレ。
20060212195435.jpg


 ソースコード。再利用価値があるとすれば7セグの表示データだろうけど、シンク動作なので0が点灯なのに注意。

/*

  普通の時計 PIC16F84使用
  2.0Mhzクリスタル仕様
  
*/
#include<pic.h>
#include<delay.h>
__CONFIG(0x3FF2);        //CONFIG:CP=OFF,PWRT=ON,WDT=OFF,OSC=HS

void display(void);
void time_adjust(void);
char segment[10]={
          0b01000000,    //0
          0b01111001,    //1
          0b00100100,    //2
          0b00110000,    //3
          0b00011001,    //4
          0b00010010,    //5
          0b00000010,    //6
          0b01011000,    //7
          0b00000000,    //8
          0b00010000,    //9
};

unsigned long timer_count=0;  //タイマ定数設定
unsigned char hour=0;
unsigned char min=0;
unsigned char sec=0;
void main(void)
{
  PSA=0;          //プリスケーラを使用する
  PS2=1;
  PS1=0;
  PS0=0;          //プリスケーラは1:32

  T0CS=0;           //クロックソースは内部命令サイクル
  TMR0=0;           //TMR0をリセット
  T0IF=0;           //T0IFをリセット
  
  T0IE=1;           //TMR0割り込み発生を許可
  GIE=1;           //割り込みを許可
  
  PORTA=0b00001111;      //PORTAをリセット
  PORTB=0b11110000;      //PORTBをリセット
  TRISA=0b00011000;      //RA3・4を出力、RA0~2を入力に設定
  TRISB=0b00000000;      //RB0-7を出力に設定
  
  PORTA=0b00000111;      //PORTAをリセット
  PORTB=0b01111111;      //PORTBをリセット

  while(1)           //無限ループ
  {
    display();        //時刻表示
    time_adjust();      //時刻調整
  }
}

void display()          //時刻表示ルーチン
{
  //hourの10の桁
  PORTA=0b00000000;
  RB7=0;            //全列OFF

  PORTB = (0x80 & PORTB) | (0x7F & segment[hour/10]);  //PORTBの下7bitにhourの10の桁出力
  RA0=1;            //hourの10の桁ON
  DelayMs(1);
  
  //hourの1の桁
  PORTA=0b00000000;
  RB7=0;            //全列OFF
  
  PORTB = (0x80 & PORTB) | (0x7F & segment[hour%10]);  //PORTBの下7bitにhourの1の桁出力
  RA1=1;            //hourの1の桁ON
  DelayMs(1);
  
  //minの10の桁
  PORTA=0b00000000;
  RB7=0;            //全列OFF
  
  PORTB = (0x80 & PORTB) | (0x7F & segment[min/10]);  //PORTBの下7bitにminの10の桁出力
  RA2=1;            //minの10の桁ON
  DelayMs(1);
  
  //minの1の桁
  PORTA=0b00000000;
  RB7=0;            //全列OFF
  
  PORTB = (0x80 & PORTB) | (0x7F & segment[min%10]);  //PORTBの下7bitにminの1の桁出力
  RB7=1;            //minの1の桁ON
  DelayMs(1);
}

void time_adjust()
{
  //hourのカウントアップ
  if(RA4){           //hourスイッチを見る
    DelayMs(30);       //チャタリング待ち
    if(RA4){
      hour++;        //時刻をカウントアップ
      if(hour >=24){
        hour = 0;
      }
    }
    while(RA4){        //ボタンがオフになるまで待つ
      display();      //待っている間の表示
    }
    DelayMs(50);       //も一回押すには0.05秒待ち
  }
  
  //minのカウントアップ
  if(RA3){           //minスイッチを見る
    DelayMs(30);       //チャタリング待ち
    if(RA3){
      min++;        //分をカウントアップ
      sec = 0;      //秒を0に変更
      if(min >= 60){
        min = 0;
      }
    }
    while(RA3){         //ボタンがオフになるまで待つ
      display();       //待っている間の表示
    }
    DelayMs(50);        //も一回押すには0.05秒待ち
  }
}

interrupt clock_count()          //割り込みルーチン
{
  if(T0IF){
    T0IF = 0;            //割り込みフラグクリア
    TMR0 = 131;            //TMR0をオーバーフローまで125カウントに指定 256-125-131
    timer_count++;
    if(timer_count == 125){
      timer_count = 0;      //タイマカウント(1sec=2M=4*32*125*125)
      sec++;
      if(sec >= 60){
        sec = 0;
        min++;
        if(min >= 60){
          min = 0;
          hour++;
          if(hour >= 24){
            hour = 0;
          }
        }
      }
    }
  }
}


スポンサーサイト

コメント

美容ダイエット・脱毛・矯正製品

美容ダイエット・脱毛・矯正製品を探すなら http://www.umaiumai.biz/100939/204245/

  • 2008/11/10(月) 10:58:54 |
  • URL |
  • #-
  • [ 編集]

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://dmidorikawa.blog39.fc2.com/tb.php/30-0439a86d
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。