Dot Matrix LED clock with RTC ver1.0

Dependencies:   ds3231 mbed

main.cpp

Committer:
kohacraft
Date:
2015-08-11
Revision:
3:179ec78e9158
Parent:
2:9c618daf65f5

File content as of revision 3:179ec78e9158:

#include "mbed.h"
#include "font.h"
#include "ds3231.h"
#include "TLC5940.h"
int num_ics = 1;    //何個TLC5940がつながっているか

DigitalOut col1 = dp11;
DigitalOut col2 = dp13;
DigitalOut col3 = dp14;
DigitalOut col4 = dp15;
DigitalOut col5 = dp16;
DigitalOut col6 = dp17;
DigitalOut col7 = dp18;
DigitalOut col8 = dp26;

InterruptIn secInt(dp1);  //ピンの変化検出  

DigitalIn fastSw = dp28;
DigitalIn slowSw = dp25;
#define brightMax 4095

Ds3231 rtc( dp5 , dp27 ); //リアルタイムクロック
int sec = 0;
int min = 0;//
int hour =1;//
bool minChange = 0;//
bool hourChange = 0;//
bool swChange = 0;//スイッチが押された

//時間の数字をドッドの数字に変換
unsigned char hourDecfont( int num , int colm )
{
    unsigned char fontTemp = 0;
    unsigned char fontTemp2 = 0;
    int numTemp = 0 ;
    numTemp = num / 10;
    if( numTemp >0 )
    {
        fontTemp = numFont[ numTemp ][ colm ];
        fontTemp = fontTemp << 5;
    }
    numTemp = num - numTemp*10;
    fontTemp2 = numFont[ numTemp ][ colm ];
    fontTemp2 = fontTemp2 << 2;
    fontTemp = fontTemp | fontTemp2 | numFont[ 10 ][ colm ];
    
    return fontTemp;
}

//数字をドッドの数字に変換
unsigned char decfont( int num , int colm )
{
    unsigned char fontTemp = 0;
    int numTemp = 0 ;
    numTemp = num / 10;
    fontTemp = numFont[ numTemp ][ colm ];
    fontTemp = fontTemp << 4;
    numTemp = num - numTemp*10;
    fontTemp = fontTemp | numFont[ numTemp ][ colm ];
    
    return fontTemp;
}
  
//指定したフォントの、それぞれの行のピンをONOFFする
void fontOut( unsigned char font )
{
    unsigned char mask = 0x01;
    unsigned char temp = font;
    if( ( temp & mask ) !=0 )
        col1 = 1;
    else
        col1 = 0;
    mask = mask << 1;

    if( ( temp & mask ) !=0 )
        col2 = 1;
    else
        col2 = 0;
    mask = mask << 1;

    if( ( temp & mask ) !=0 )
        col3 = 1;
    else
        col3 = 0;
    mask = mask << 1;

    if( ( temp & mask ) !=0 )
        col4 = 1;
    else
        col4 = 0;
    mask = mask << 1;

    if( ( temp & mask ) !=0 )
        col5 = 1;
    else
        col5 = 0;
    mask = mask << 1;

    if( ( temp & mask ) !=0 )
        col6 = 1;
    else
        col6 = 0;
    mask = mask << 1;

    if( ( temp & mask ) !=0 )
        col7 = 1;
    else
        col7 = 0;
    mask = mask << 1;

    if( ( temp & mask ) !=0 )
        col8 = 1;
    else
        col8 = 0;
}

//1秒のカウントアップ
void secUp()
{
    sec++;        
}

void changeClock()
{
    
    if( sec >= 60 )
    {
        sec = 0;
        min++;
        minChange = 1;
    }
    if( min >= 60 )
    {
        min = 0;
        hour++;
        hourChange = 1;
    }
    if( hour >= 12 )
    {
        hour = 0;
        hourChange = 1;
    }
    
    
    //RTCに現在の時間を記録
    if( swChange != 0 )
    {
        ds3231_time_t rtc_time;
        rtc_time.hours = hour;
        rtc_time.minutes = min;
        rtc_time.seconds = sec;
        rtc_time.mode = 1; //12時間モード    
        secInt.disable_irq();   //割り込み禁止
        int value = rtc.set_time( rtc_time );   //書き込み
        secInt.enable_irq();    //割り込み許可
    }
    minChange = 0;
    hourChange = 0;
    swChange = 0;
}

int main() {
    
    
    //フォント初期化
    initFont();
    
    //TLC5940初期設定
    setup ( num_ics );
    
   
    //DS3231初期設定
    ds3231_cntl_stat_t data = {0,0}; //SQWに1秒のクロックを出力する
    rtc.set_cntl_stat_reg( data );

    secInt.rise( &secUp ); //RTCの1秒クロックでカウントアップする
    
    //DS3231に記録されている時間を読み出す
    ds3231_time_t time;
    rtc.get_time(&time);
    hour = time.hours;
    if( hour > 12 )
        hour -=12;
    min = time.minutes;
    sec = time.seconds;
   
   //スイッチの初期化
   fastSw.mode(PullDown);
   slowSw.mode(PullDown);

   
    unsigned short LEDS[16];
    
    while(1) {

        //スイッチが押されていないか
        if( slowSw == 1 )
        {
            sec++;
            swChange = 1;
        }
        if( fastSw == 1 )
        {
            min++;
            swChange = 1;
        }
        changeClock();
            
        //16行分ダイナミック点灯させる
        for( int colmn=0 ; colmn<16 ; colmn++ )
        {
            for( int h=0; h<16 ; h++ )
                LEDS[h] = 0;
            LEDS[colmn] = (unsigned short)brightMax;
            if( colmn<8 )
                fontOut( decfont( min , colmn ) );
            else
                fontOut( hourDecfont( hour , colmn-8 ) );
            
            update_led ( LEDS);
          
        }
        
    }
}