Dot Matrix LED clock with RTC ver1.0

Dependencies:   ds3231 mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "font.h"
00003 #include "ds3231.h"
00004 #include "TLC5940.h"
00005 int num_ics = 1;    //何個TLC5940がつながっているか
00006 
00007 DigitalOut col1 = dp11;
00008 DigitalOut col2 = dp13;
00009 DigitalOut col3 = dp14;
00010 DigitalOut col4 = dp15;
00011 DigitalOut col5 = dp16;
00012 DigitalOut col6 = dp17;
00013 DigitalOut col7 = dp18;
00014 DigitalOut col8 = dp26;
00015 
00016 InterruptIn secInt(dp1);  //ピンの変化検出  
00017 
00018 DigitalIn fastSw = dp28;
00019 DigitalIn slowSw = dp25;
00020 #define brightMax 4095
00021 
00022 Ds3231 rtc( dp5 , dp27 ); //リアルタイムクロック
00023 int sec = 0;
00024 int min = 0;//
00025 int hour =1;//
00026 bool minChange = 0;//
00027 bool hourChange = 0;//
00028 bool swChange = 0;//スイッチが押された
00029 
00030 //時間の数字をドッドの数字に変換
00031 unsigned char hourDecfont( int num , int colm )
00032 {
00033     unsigned char fontTemp = 0;
00034     unsigned char fontTemp2 = 0;
00035     int numTemp = 0 ;
00036     numTemp = num / 10;
00037     if( numTemp >0 )
00038     {
00039         fontTemp = numFont[ numTemp ][ colm ];
00040         fontTemp = fontTemp << 5;
00041     }
00042     numTemp = num - numTemp*10;
00043     fontTemp2 = numFont[ numTemp ][ colm ];
00044     fontTemp2 = fontTemp2 << 2;
00045     fontTemp = fontTemp | fontTemp2 | numFont[ 10 ][ colm ];
00046     
00047     return fontTemp;
00048 }
00049 
00050 //数字をドッドの数字に変換
00051 unsigned char decfont( int num , int colm )
00052 {
00053     unsigned char fontTemp = 0;
00054     int numTemp = 0 ;
00055     numTemp = num / 10;
00056     fontTemp = numFont[ numTemp ][ colm ];
00057     fontTemp = fontTemp << 4;
00058     numTemp = num - numTemp*10;
00059     fontTemp = fontTemp | numFont[ numTemp ][ colm ];
00060     
00061     return fontTemp;
00062 }
00063   
00064 //指定したフォントの、それぞれの行のピンをONOFFする
00065 void fontOut( unsigned char font )
00066 {
00067     unsigned char mask = 0x01;
00068     unsigned char temp = font;
00069     if( ( temp & mask ) !=0 )
00070         col1 = 1;
00071     else
00072         col1 = 0;
00073     mask = mask << 1;
00074 
00075     if( ( temp & mask ) !=0 )
00076         col2 = 1;
00077     else
00078         col2 = 0;
00079     mask = mask << 1;
00080 
00081     if( ( temp & mask ) !=0 )
00082         col3 = 1;
00083     else
00084         col3 = 0;
00085     mask = mask << 1;
00086 
00087     if( ( temp & mask ) !=0 )
00088         col4 = 1;
00089     else
00090         col4 = 0;
00091     mask = mask << 1;
00092 
00093     if( ( temp & mask ) !=0 )
00094         col5 = 1;
00095     else
00096         col5 = 0;
00097     mask = mask << 1;
00098 
00099     if( ( temp & mask ) !=0 )
00100         col6 = 1;
00101     else
00102         col6 = 0;
00103     mask = mask << 1;
00104 
00105     if( ( temp & mask ) !=0 )
00106         col7 = 1;
00107     else
00108         col7 = 0;
00109     mask = mask << 1;
00110 
00111     if( ( temp & mask ) !=0 )
00112         col8 = 1;
00113     else
00114         col8 = 0;
00115 }
00116 
00117 //1秒のカウントアップ
00118 void secUp()
00119 {
00120     sec++;        
00121 }
00122 
00123 void changeClock()
00124 {
00125     
00126     if( sec >= 60 )
00127     {
00128         sec = 0;
00129         min++;
00130         minChange = 1;
00131     }
00132     if( min >= 60 )
00133     {
00134         min = 0;
00135         hour++;
00136         hourChange = 1;
00137     }
00138     if( hour >= 12 )
00139     {
00140         hour = 0;
00141         hourChange = 1;
00142     }
00143     
00144     
00145     //RTCに現在の時間を記録
00146     if( swChange != 0 )
00147     {
00148         ds3231_time_t rtc_time;
00149         rtc_time.hours = hour;
00150         rtc_time.minutes = min;
00151         rtc_time.seconds = sec;
00152         rtc_time.mode = 1; //12時間モード    
00153         secInt.disable_irq();   //割り込み禁止
00154         int value = rtc.set_time( rtc_time );   //書き込み
00155         secInt.enable_irq();    //割り込み許可
00156     }
00157     minChange = 0;
00158     hourChange = 0;
00159     swChange = 0;
00160 }
00161 
00162 int main() {
00163     
00164     
00165     //フォント初期化
00166     initFont();
00167     
00168     //TLC5940初期設定
00169     setup ( num_ics );
00170     
00171    
00172     //DS3231初期設定
00173     ds3231_cntl_stat_t data = {0,0}; //SQWに1秒のクロックを出力する
00174     rtc.set_cntl_stat_reg( data );
00175 
00176     secInt.rise( &secUp ); //RTCの1秒クロックでカウントアップする
00177     
00178     //DS3231に記録されている時間を読み出す
00179     ds3231_time_t time;
00180     rtc.get_time(&time);
00181     hour = time.hours;
00182     if( hour > 12 )
00183         hour -=12;
00184     min = time.minutes;
00185     sec = time.seconds;
00186    
00187    //スイッチの初期化
00188    fastSw.mode(PullDown);
00189    slowSw.mode(PullDown);
00190 
00191    
00192     unsigned short LEDS[16];
00193     
00194     while(1) {
00195 
00196         //スイッチが押されていないか
00197         if( slowSw == 1 )
00198         {
00199             sec++;
00200             swChange = 1;
00201         }
00202         if( fastSw == 1 )
00203         {
00204             min++;
00205             swChange = 1;
00206         }
00207         changeClock();
00208             
00209         //16行分ダイナミック点灯させる
00210         for( int colmn=0 ; colmn<16 ; colmn++ )
00211         {
00212             for( int h=0; h<16 ; h++ )
00213                 LEDS[h] = 0;
00214             LEDS[colmn] = (unsigned short)brightMax;
00215             if( colmn<8 )
00216                 fontOut( decfont( min , colmn ) );
00217             else
00218                 fontOut( hourDecfont( hour , colmn-8 ) );
00219             
00220             update_led ( LEDS);
00221           
00222         }
00223         
00224     }
00225 }