kohacraft Lab
/
kc_matrixclock_withRTC
Dot Matrix LED clock with RTC ver1.0
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Wed Jul 13 2022 08:03:41 by 1.7.2