kohacraft Lab
/
kc_matrixclock_withRTC
Dot Matrix LED clock with RTC ver1.0
main.cpp@3:179ec78e9158, 2015-08-11 (annotated)
- Committer:
- kohacraft
- Date:
- Tue Aug 11 08:59:44 2015 +0000
- Revision:
- 3:179ec78e9158
- Parent:
- 2:9c618daf65f5
Dot Matrix LED clock with RTC ver1.0
Who changed what in which revision?
User | Revision | Line number | New 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 | 3:179ec78e9158 | 171 | |
kohacraft | 1:5577d93280da | 172 | //DS3231初期設定 |
kohacraft | 1:5577d93280da | 173 | ds3231_cntl_stat_t data = {0,0}; //SQWに1秒のクロックを出力する |
kohacraft | 1:5577d93280da | 174 | rtc.set_cntl_stat_reg( data ); |
kohacraft | 1:5577d93280da | 175 | |
kohacraft | 1:5577d93280da | 176 | secInt.rise( &secUp ); //RTCの1秒クロックでカウントアップする |
kohacraft | 0:c872b97ce7ea | 177 | |
kohacraft | 1:5577d93280da | 178 | //DS3231に記録されている時間を読み出す |
kohacraft | 1:5577d93280da | 179 | ds3231_time_t time; |
kohacraft | 2:9c618daf65f5 | 180 | rtc.get_time(&time); |
kohacraft | 1:5577d93280da | 181 | hour = time.hours; |
kohacraft | 1:5577d93280da | 182 | if( hour > 12 ) |
kohacraft | 1:5577d93280da | 183 | hour -=12; |
kohacraft | 1:5577d93280da | 184 | min = time.minutes; |
kohacraft | 1:5577d93280da | 185 | sec = time.seconds; |
kohacraft | 1:5577d93280da | 186 | |
kohacraft | 1:5577d93280da | 187 | //スイッチの初期化 |
kohacraft | 1:5577d93280da | 188 | fastSw.mode(PullDown); |
kohacraft | 1:5577d93280da | 189 | slowSw.mode(PullDown); |
kohacraft | 1:5577d93280da | 190 | |
kohacraft | 1:5577d93280da | 191 | |
kohacraft | 0:c872b97ce7ea | 192 | unsigned short LEDS[16]; |
kohacraft | 0:c872b97ce7ea | 193 | |
kohacraft | 0:c872b97ce7ea | 194 | while(1) { |
kohacraft | 2:9c618daf65f5 | 195 | |
kohacraft | 2:9c618daf65f5 | 196 | //スイッチが押されていないか |
kohacraft | 2:9c618daf65f5 | 197 | if( slowSw == 1 ) |
kohacraft | 2:9c618daf65f5 | 198 | { |
kohacraft | 2:9c618daf65f5 | 199 | sec++; |
kohacraft | 2:9c618daf65f5 | 200 | swChange = 1; |
kohacraft | 2:9c618daf65f5 | 201 | } |
kohacraft | 2:9c618daf65f5 | 202 | if( fastSw == 1 ) |
kohacraft | 2:9c618daf65f5 | 203 | { |
kohacraft | 2:9c618daf65f5 | 204 | min++; |
kohacraft | 2:9c618daf65f5 | 205 | swChange = 1; |
kohacraft | 2:9c618daf65f5 | 206 | } |
kohacraft | 2:9c618daf65f5 | 207 | changeClock(); |
kohacraft | 0:c872b97ce7ea | 208 | |
kohacraft | 0:c872b97ce7ea | 209 | //16行分ダイナミック点灯させる |
kohacraft | 0:c872b97ce7ea | 210 | for( int colmn=0 ; colmn<16 ; colmn++ ) |
kohacraft | 0:c872b97ce7ea | 211 | { |
kohacraft | 0:c872b97ce7ea | 212 | for( int h=0; h<16 ; h++ ) |
kohacraft | 0:c872b97ce7ea | 213 | LEDS[h] = 0; |
kohacraft | 0:c872b97ce7ea | 214 | LEDS[colmn] = (unsigned short)brightMax; |
kohacraft | 0:c872b97ce7ea | 215 | if( colmn<8 ) |
kohacraft | 2:9c618daf65f5 | 216 | fontOut( decfont( min , colmn ) ); |
kohacraft | 0:c872b97ce7ea | 217 | else |
kohacraft | 2:9c618daf65f5 | 218 | fontOut( hourDecfont( hour , colmn-8 ) ); |
kohacraft | 0:c872b97ce7ea | 219 | |
kohacraft | 0:c872b97ce7ea | 220 | update_led ( LEDS); |
kohacraft | 0:c872b97ce7ea | 221 | |
kohacraft | 0:c872b97ce7ea | 222 | } |
kohacraft | 0:c872b97ce7ea | 223 | |
kohacraft | 0:c872b97ce7ea | 224 | } |
kohacraft | 0:c872b97ce7ea | 225 | } |