Dot Matrix LED clock with RTC ver1.0

Dependencies:   ds3231 mbed

Committer:
kohacraft
Date:
Tue Aug 11 08:05:41 2015 +0000
Revision:
2:9c618daf65f5
Parent:
1:5577d93280da
Child:
3:179ec78e9158
Fix RTC write bug.;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kohacraft 0:c872b97ce7ea 1 #include "mbed.h"
kohacraft 0:c872b97ce7ea 2 #include "font.h"
kohacraft 1:5577d93280da 3 #include "ds3231.h"
kohacraft 0:c872b97ce7ea 4 #include "TLC5940.h"
kohacraft 0:c872b97ce7ea 5 int num_ics = 1; //何個TLC5940がつながっているか
kohacraft 0:c872b97ce7ea 6
kohacraft 0:c872b97ce7ea 7 DigitalOut col1 = dp11;
kohacraft 0:c872b97ce7ea 8 DigitalOut col2 = dp13;
kohacraft 0:c872b97ce7ea 9 DigitalOut col3 = dp14;
kohacraft 0:c872b97ce7ea 10 DigitalOut col4 = dp15;
kohacraft 0:c872b97ce7ea 11 DigitalOut col5 = dp16;
kohacraft 0:c872b97ce7ea 12 DigitalOut col6 = dp17;
kohacraft 0:c872b97ce7ea 13 DigitalOut col7 = dp18;
kohacraft 0:c872b97ce7ea 14 DigitalOut col8 = dp26;
kohacraft 0:c872b97ce7ea 15
kohacraft 1:5577d93280da 16 InterruptIn secInt(dp1); //ピンの変化検出
kohacraft 1:5577d93280da 17
kohacraft 0:c872b97ce7ea 18 DigitalIn fastSw = dp28;
kohacraft 0:c872b97ce7ea 19 DigitalIn slowSw = dp25;
kohacraft 0:c872b97ce7ea 20 #define brightMax 4095
kohacraft 0:c872b97ce7ea 21
kohacraft 1:5577d93280da 22 Ds3231 rtc( dp5 , dp27 ); //リアルタイムクロック
kohacraft 0:c872b97ce7ea 23 int sec = 0;
kohacraft 0:c872b97ce7ea 24 int min = 0;//
kohacraft 0:c872b97ce7ea 25 int hour =1;//
kohacraft 1:5577d93280da 26 bool minChange = 0;//
kohacraft 1:5577d93280da 27 bool hourChange = 0;//
kohacraft 2:9c618daf65f5 28 bool swChange = 0;//スイッチが押された
kohacraft 0:c872b97ce7ea 29
kohacraft 0:c872b97ce7ea 30 //時間の数字をドッドの数字に変換
kohacraft 0:c872b97ce7ea 31 unsigned char hourDecfont( int num , int colm )
kohacraft 0:c872b97ce7ea 32 {
kohacraft 0:c872b97ce7ea 33 unsigned char fontTemp = 0;
kohacraft 0:c872b97ce7ea 34 unsigned char fontTemp2 = 0;
kohacraft 0:c872b97ce7ea 35 int numTemp = 0 ;
kohacraft 0:c872b97ce7ea 36 numTemp = num / 10;
kohacraft 0:c872b97ce7ea 37 if( numTemp >0 )
kohacraft 0:c872b97ce7ea 38 {
kohacraft 0:c872b97ce7ea 39 fontTemp = numFont[ numTemp ][ colm ];
kohacraft 0:c872b97ce7ea 40 fontTemp = fontTemp << 5;
kohacraft 0:c872b97ce7ea 41 }
kohacraft 0:c872b97ce7ea 42 numTemp = num - numTemp*10;
kohacraft 0:c872b97ce7ea 43 fontTemp2 = numFont[ numTemp ][ colm ];
kohacraft 0:c872b97ce7ea 44 fontTemp2 = fontTemp2 << 2;
kohacraft 0:c872b97ce7ea 45 fontTemp = fontTemp | fontTemp2 | numFont[ 10 ][ colm ];
kohacraft 0:c872b97ce7ea 46
kohacraft 0:c872b97ce7ea 47 return fontTemp;
kohacraft 0:c872b97ce7ea 48 }
kohacraft 0:c872b97ce7ea 49
kohacraft 0:c872b97ce7ea 50 //数字をドッドの数字に変換
kohacraft 0:c872b97ce7ea 51 unsigned char decfont( int num , int colm )
kohacraft 0:c872b97ce7ea 52 {
kohacraft 0:c872b97ce7ea 53 unsigned char fontTemp = 0;
kohacraft 0:c872b97ce7ea 54 int numTemp = 0 ;
kohacraft 0:c872b97ce7ea 55 numTemp = num / 10;
kohacraft 0:c872b97ce7ea 56 fontTemp = numFont[ numTemp ][ colm ];
kohacraft 0:c872b97ce7ea 57 fontTemp = fontTemp << 4;
kohacraft 0:c872b97ce7ea 58 numTemp = num - numTemp*10;
kohacraft 0:c872b97ce7ea 59 fontTemp = fontTemp | numFont[ numTemp ][ colm ];
kohacraft 0:c872b97ce7ea 60
kohacraft 0:c872b97ce7ea 61 return fontTemp;
kohacraft 0:c872b97ce7ea 62 }
kohacraft 0:c872b97ce7ea 63
kohacraft 0:c872b97ce7ea 64 //指定したフォントの、それぞれの行のピンをONOFFする
kohacraft 0:c872b97ce7ea 65 void fontOut( unsigned char font )
kohacraft 0:c872b97ce7ea 66 {
kohacraft 0:c872b97ce7ea 67 unsigned char mask = 0x01;
kohacraft 0:c872b97ce7ea 68 unsigned char temp = font;
kohacraft 0:c872b97ce7ea 69 if( ( temp & mask ) !=0 )
kohacraft 0:c872b97ce7ea 70 col1 = 1;
kohacraft 0:c872b97ce7ea 71 else
kohacraft 0:c872b97ce7ea 72 col1 = 0;
kohacraft 0:c872b97ce7ea 73 mask = mask << 1;
kohacraft 0:c872b97ce7ea 74
kohacraft 0:c872b97ce7ea 75 if( ( temp & mask ) !=0 )
kohacraft 0:c872b97ce7ea 76 col2 = 1;
kohacraft 0:c872b97ce7ea 77 else
kohacraft 0:c872b97ce7ea 78 col2 = 0;
kohacraft 0:c872b97ce7ea 79 mask = mask << 1;
kohacraft 0:c872b97ce7ea 80
kohacraft 0:c872b97ce7ea 81 if( ( temp & mask ) !=0 )
kohacraft 0:c872b97ce7ea 82 col3 = 1;
kohacraft 0:c872b97ce7ea 83 else
kohacraft 0:c872b97ce7ea 84 col3 = 0;
kohacraft 0:c872b97ce7ea 85 mask = mask << 1;
kohacraft 0:c872b97ce7ea 86
kohacraft 0:c872b97ce7ea 87 if( ( temp & mask ) !=0 )
kohacraft 0:c872b97ce7ea 88 col4 = 1;
kohacraft 0:c872b97ce7ea 89 else
kohacraft 0:c872b97ce7ea 90 col4 = 0;
kohacraft 0:c872b97ce7ea 91 mask = mask << 1;
kohacraft 0:c872b97ce7ea 92
kohacraft 0:c872b97ce7ea 93 if( ( temp & mask ) !=0 )
kohacraft 0:c872b97ce7ea 94 col5 = 1;
kohacraft 0:c872b97ce7ea 95 else
kohacraft 0:c872b97ce7ea 96 col5 = 0;
kohacraft 0:c872b97ce7ea 97 mask = mask << 1;
kohacraft 0:c872b97ce7ea 98
kohacraft 0:c872b97ce7ea 99 if( ( temp & mask ) !=0 )
kohacraft 0:c872b97ce7ea 100 col6 = 1;
kohacraft 0:c872b97ce7ea 101 else
kohacraft 0:c872b97ce7ea 102 col6 = 0;
kohacraft 0:c872b97ce7ea 103 mask = mask << 1;
kohacraft 0:c872b97ce7ea 104
kohacraft 0:c872b97ce7ea 105 if( ( temp & mask ) !=0 )
kohacraft 0:c872b97ce7ea 106 col7 = 1;
kohacraft 0:c872b97ce7ea 107 else
kohacraft 0:c872b97ce7ea 108 col7 = 0;
kohacraft 0:c872b97ce7ea 109 mask = mask << 1;
kohacraft 0:c872b97ce7ea 110
kohacraft 0:c872b97ce7ea 111 if( ( temp & mask ) !=0 )
kohacraft 0:c872b97ce7ea 112 col8 = 1;
kohacraft 0:c872b97ce7ea 113 else
kohacraft 0:c872b97ce7ea 114 col8 = 0;
kohacraft 1:5577d93280da 115 }
kohacraft 0:c872b97ce7ea 116
kohacraft 1:5577d93280da 117 //1秒のカウントアップ
kohacraft 1:5577d93280da 118 void secUp()
kohacraft 1:5577d93280da 119 {
kohacraft 2:9c618daf65f5 120 sec++;
kohacraft 2:9c618daf65f5 121 }
kohacraft 2:9c618daf65f5 122
kohacraft 2:9c618daf65f5 123 void changeClock()
kohacraft 2:9c618daf65f5 124 {
kohacraft 2:9c618daf65f5 125
kohacraft 1:5577d93280da 126 if( sec >= 60 )
kohacraft 1:5577d93280da 127 {
kohacraft 1:5577d93280da 128 sec = 0;
kohacraft 1:5577d93280da 129 min++;
kohacraft 1:5577d93280da 130 minChange = 1;
kohacraft 1:5577d93280da 131 }
kohacraft 1:5577d93280da 132 if( min >= 60 )
kohacraft 1:5577d93280da 133 {
kohacraft 1:5577d93280da 134 min = 0;
kohacraft 1:5577d93280da 135 hour++;
kohacraft 1:5577d93280da 136 hourChange = 1;
kohacraft 1:5577d93280da 137 }
kohacraft 1:5577d93280da 138 if( hour >= 12 )
kohacraft 1:5577d93280da 139 {
kohacraft 1:5577d93280da 140 hour = 0;
kohacraft 1:5577d93280da 141 hourChange = 1;
kohacraft 1:5577d93280da 142 }
kohacraft 2:9c618daf65f5 143
kohacraft 2:9c618daf65f5 144
kohacraft 2:9c618daf65f5 145 //RTCに現在の時間を記録
kohacraft 2:9c618daf65f5 146 if( swChange != 0 )
kohacraft 2:9c618daf65f5 147 {
kohacraft 2:9c618daf65f5 148 ds3231_time_t rtc_time;
kohacraft 2:9c618daf65f5 149 rtc_time.hours = hour;
kohacraft 2:9c618daf65f5 150 rtc_time.minutes = min;
kohacraft 2:9c618daf65f5 151 rtc_time.seconds = sec;
kohacraft 2:9c618daf65f5 152 rtc_time.mode = 1; //12時間モード
kohacraft 2:9c618daf65f5 153 secInt.disable_irq(); //割り込み禁止
kohacraft 2:9c618daf65f5 154 int value = rtc.set_time( rtc_time ); //書き込み
kohacraft 2:9c618daf65f5 155 secInt.enable_irq(); //割り込み許可
kohacraft 2:9c618daf65f5 156 }
kohacraft 2:9c618daf65f5 157 minChange = 0;
kohacraft 2:9c618daf65f5 158 hourChange = 0;
kohacraft 2:9c618daf65f5 159 swChange = 0;
kohacraft 0:c872b97ce7ea 160 }
kohacraft 0:c872b97ce7ea 161
kohacraft 0:c872b97ce7ea 162 int main() {
kohacraft 0:c872b97ce7ea 163
kohacraft 1:5577d93280da 164
kohacraft 1:5577d93280da 165 //フォント初期化
kohacraft 0:c872b97ce7ea 166 initFont();
kohacraft 1:5577d93280da 167
kohacraft 1:5577d93280da 168 //TLC5940初期設定
kohacraft 0:c872b97ce7ea 169 setup ( num_ics );
kohacraft 1:5577d93280da 170
kohacraft 2:9c618daf65f5 171 wait(0.2);
kohacraft 2:9c618daf65f5 172
kohacraft 1:5577d93280da 173 //DS3231初期設定
kohacraft 1:5577d93280da 174 ds3231_cntl_stat_t data = {0,0}; //SQWに1秒のクロックを出力する
kohacraft 1:5577d93280da 175 rtc.set_cntl_stat_reg( data );
kohacraft 1:5577d93280da 176
kohacraft 1:5577d93280da 177 secInt.rise( &secUp ); //RTCの1秒クロックでカウントアップする
kohacraft 2:9c618daf65f5 178 wait(0.2);
kohacraft 0:c872b97ce7ea 179
kohacraft 1:5577d93280da 180 //DS3231に記録されている時間を読み出す
kohacraft 1:5577d93280da 181 ds3231_time_t time;
kohacraft 2:9c618daf65f5 182 rtc.get_time(&time);
kohacraft 1:5577d93280da 183 hour = time.hours;
kohacraft 1:5577d93280da 184 if( hour > 12 )
kohacraft 1:5577d93280da 185 hour -=12;
kohacraft 1:5577d93280da 186 min = time.minutes;
kohacraft 1:5577d93280da 187 sec = time.seconds;
kohacraft 1:5577d93280da 188
kohacraft 1:5577d93280da 189 //スイッチの初期化
kohacraft 1:5577d93280da 190 fastSw.mode(PullDown);
kohacraft 1:5577d93280da 191 slowSw.mode(PullDown);
kohacraft 1:5577d93280da 192
kohacraft 1:5577d93280da 193
kohacraft 0:c872b97ce7ea 194 unsigned short LEDS[16];
kohacraft 0:c872b97ce7ea 195
kohacraft 0:c872b97ce7ea 196 while(1) {
kohacraft 2:9c618daf65f5 197
kohacraft 2:9c618daf65f5 198 //スイッチが押されていないか
kohacraft 2:9c618daf65f5 199 if( slowSw == 1 )
kohacraft 2:9c618daf65f5 200 {
kohacraft 2:9c618daf65f5 201 sec++;
kohacraft 2:9c618daf65f5 202 swChange = 1;
kohacraft 2:9c618daf65f5 203 }
kohacraft 2:9c618daf65f5 204 if( fastSw == 1 )
kohacraft 2:9c618daf65f5 205 {
kohacraft 2:9c618daf65f5 206 min++;
kohacraft 2:9c618daf65f5 207 swChange = 1;
kohacraft 2:9c618daf65f5 208 }
kohacraft 2:9c618daf65f5 209 changeClock();
kohacraft 0:c872b97ce7ea 210
kohacraft 0:c872b97ce7ea 211 //16行分ダイナミック点灯させる
kohacraft 0:c872b97ce7ea 212 for( int colmn=0 ; colmn<16 ; colmn++ )
kohacraft 0:c872b97ce7ea 213 {
kohacraft 0:c872b97ce7ea 214 for( int h=0; h<16 ; h++ )
kohacraft 0:c872b97ce7ea 215 LEDS[h] = 0;
kohacraft 0:c872b97ce7ea 216 LEDS[colmn] = (unsigned short)brightMax;
kohacraft 0:c872b97ce7ea 217 if( colmn<8 )
kohacraft 2:9c618daf65f5 218 fontOut( decfont( min , colmn ) );
kohacraft 0:c872b97ce7ea 219 else
kohacraft 2:9c618daf65f5 220 fontOut( hourDecfont( hour , colmn-8 ) );
kohacraft 0:c872b97ce7ea 221
kohacraft 0:c872b97ce7ea 222 update_led ( LEDS);
kohacraft 0:c872b97ce7ea 223
kohacraft 0:c872b97ce7ea 224 }
kohacraft 0:c872b97ce7ea 225
kohacraft 0:c872b97ce7ea 226 }
kohacraft 0:c872b97ce7ea 227 }