Andrew Harpin
/
BinaryClock
main.cpp@0:0bbbe06425db, 2009-12-09 (annotated)
- Committer:
- annodomini2
- Date:
- Wed Dec 09 21:32:36 2009 +0000
- Revision:
- 0:0bbbe06425db
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
annodomini2 | 0:0bbbe06425db | 1 | ///////////////////////////////////////////////////////////////////////////// |
annodomini2 | 0:0bbbe06425db | 2 | // Binary Clock // |
annodomini2 | 0:0bbbe06425db | 3 | // // |
annodomini2 | 0:0bbbe06425db | 4 | // Author Created // |
annodomini2 | 0:0bbbe06425db | 5 | // ------ ------- // |
annodomini2 | 0:0bbbe06425db | 6 | // Andrew Harpin 09 December 2009 // |
annodomini2 | 0:0bbbe06425db | 7 | // // |
annodomini2 | 0:0bbbe06425db | 8 | // Purpose // |
annodomini2 | 0:0bbbe06425db | 9 | // ------- // |
annodomini2 | 0:0bbbe06425db | 10 | // Create a simple program to test the RTC and serial controls // |
annodomini2 | 0:0bbbe06425db | 11 | // on the Mbed device // |
annodomini2 | 0:0bbbe06425db | 12 | // // |
annodomini2 | 0:0bbbe06425db | 13 | // License // |
annodomini2 | 0:0bbbe06425db | 14 | // ------- // |
annodomini2 | 0:0bbbe06425db | 15 | // MIT Open Source // |
annodomini2 | 0:0bbbe06425db | 16 | // // |
annodomini2 | 0:0bbbe06425db | 17 | // Warranty // |
annodomini2 | 0:0bbbe06425db | 18 | // -------- // |
annodomini2 | 0:0bbbe06425db | 19 | // None // |
annodomini2 | 0:0bbbe06425db | 20 | // // |
annodomini2 | 0:0bbbe06425db | 21 | ///////////////////////////////////////////////////////////////////////////// |
annodomini2 | 0:0bbbe06425db | 22 | |
annodomini2 | 0:0bbbe06425db | 23 | #include "mbed.h" |
annodomini2 | 0:0bbbe06425db | 24 | |
annodomini2 | 0:0bbbe06425db | 25 | // Define your outputs |
annodomini2 | 0:0bbbe06425db | 26 | DigitalOut Sec1(p5); |
annodomini2 | 0:0bbbe06425db | 27 | DigitalOut Sec2(p7); |
annodomini2 | 0:0bbbe06425db | 28 | DigitalOut Sec4(p9); |
annodomini2 | 0:0bbbe06425db | 29 | DigitalOut Sec8(p11); |
annodomini2 | 0:0bbbe06425db | 30 | DigitalOut Sec16(p13); |
annodomini2 | 0:0bbbe06425db | 31 | DigitalOut Sec32(p15); |
annodomini2 | 0:0bbbe06425db | 32 | |
annodomini2 | 0:0bbbe06425db | 33 | DigitalOut Min1(p30); |
annodomini2 | 0:0bbbe06425db | 34 | DigitalOut Min2(p28); |
annodomini2 | 0:0bbbe06425db | 35 | DigitalOut Min4(p26); |
annodomini2 | 0:0bbbe06425db | 36 | DigitalOut Min8(p24); |
annodomini2 | 0:0bbbe06425db | 37 | DigitalOut Min16(p22); |
annodomini2 | 0:0bbbe06425db | 38 | DigitalOut Min32(p21); |
annodomini2 | 0:0bbbe06425db | 39 | |
annodomini2 | 0:0bbbe06425db | 40 | DigitalOut Hour1(LED4); |
annodomini2 | 0:0bbbe06425db | 41 | DigitalOut Hour2(LED3); |
annodomini2 | 0:0bbbe06425db | 42 | DigitalOut Hour4(LED2); |
annodomini2 | 0:0bbbe06425db | 43 | DigitalOut Hour8(LED1); |
annodomini2 | 0:0bbbe06425db | 44 | DigitalOut Hour16(p20); |
annodomini2 | 0:0bbbe06425db | 45 | |
annodomini2 | 0:0bbbe06425db | 46 | void setnewtime(); |
annodomini2 | 0:0bbbe06425db | 47 | |
annodomini2 | 0:0bbbe06425db | 48 | int main() |
annodomini2 | 0:0bbbe06425db | 49 | { |
annodomini2 | 0:0bbbe06425db | 50 | // Get the current time |
annodomini2 | 0:0bbbe06425db | 51 | time_t seconds = time(NULL); |
annodomini2 | 0:0bbbe06425db | 52 | |
annodomini2 | 0:0bbbe06425db | 53 | // Check clock is initialised |
annodomini2 | 0:0bbbe06425db | 54 | if((seconds < 500) || (seconds == 0xFFFFFFF)) |
annodomini2 | 0:0bbbe06425db | 55 | { |
annodomini2 | 0:0bbbe06425db | 56 | setnewtime(); |
annodomini2 | 0:0bbbe06425db | 57 | } |
annodomini2 | 0:0bbbe06425db | 58 | |
annodomini2 | 0:0bbbe06425db | 59 | struct tm *tmr; |
annodomini2 | 0:0bbbe06425db | 60 | |
annodomini2 | 0:0bbbe06425db | 61 | // You're doing this forever, MWWWAAHAHAHAAA!!!! |
annodomini2 | 0:0bbbe06425db | 62 | while (1) |
annodomini2 | 0:0bbbe06425db | 63 | { |
annodomini2 | 0:0bbbe06425db | 64 | // Get latest time |
annodomini2 | 0:0bbbe06425db | 65 | seconds = time(NULL); |
annodomini2 | 0:0bbbe06425db | 66 | |
annodomini2 | 0:0bbbe06425db | 67 | // Print to serial |
annodomini2 | 0:0bbbe06425db | 68 | char buffer[32]; |
annodomini2 | 0:0bbbe06425db | 69 | strftime(buffer, 32, "%I:%M %p\n", localtime(&seconds)); |
annodomini2 | 0:0bbbe06425db | 70 | printf("%s", buffer); |
annodomini2 | 0:0bbbe06425db | 71 | |
annodomini2 | 0:0bbbe06425db | 72 | // Put time in accessible format |
annodomini2 | 0:0bbbe06425db | 73 | tmr = localtime(&seconds); |
annodomini2 | 0:0bbbe06425db | 74 | |
annodomini2 | 0:0bbbe06425db | 75 | // Seconds |
annodomini2 | 0:0bbbe06425db | 76 | Sec1 = (bool)(((uint8_t)tmr->tm_sec) & 0x01); |
annodomini2 | 0:0bbbe06425db | 77 | Sec2 = (bool)((((uint8_t)tmr->tm_sec) & 0x02) >> 1); |
annodomini2 | 0:0bbbe06425db | 78 | Sec4 = (bool)((((uint8_t)tmr->tm_sec) & 0x04) >> 2); |
annodomini2 | 0:0bbbe06425db | 79 | Sec8 = (bool)((((uint8_t)tmr->tm_sec) & 0x08) >> 3); |
annodomini2 | 0:0bbbe06425db | 80 | Sec16 = (bool)((((uint8_t)tmr->tm_sec) & 0x10) >> 4); |
annodomini2 | 0:0bbbe06425db | 81 | Sec32 = (bool)((((uint8_t)tmr->tm_sec) & 0x20) >> 5); |
annodomini2 | 0:0bbbe06425db | 82 | |
annodomini2 | 0:0bbbe06425db | 83 | // Minutes |
annodomini2 | 0:0bbbe06425db | 84 | Min1 = (bool)(((uint8_t)tmr->tm_min) & 0x01); |
annodomini2 | 0:0bbbe06425db | 85 | Min2 = (bool)((((uint8_t)tmr->tm_min) & 0x02) >> 1); |
annodomini2 | 0:0bbbe06425db | 86 | Min4 = (bool)((((uint8_t)tmr->tm_min) & 0x04) >> 2); |
annodomini2 | 0:0bbbe06425db | 87 | Min8 = (bool)((((uint8_t)tmr->tm_min) & 0x08) >> 3); |
annodomini2 | 0:0bbbe06425db | 88 | Min16 = (bool)((((uint8_t)tmr->tm_min) & 0x10) >> 4); |
annodomini2 | 0:0bbbe06425db | 89 | Min32 = (bool)((((uint8_t)tmr->tm_min) & 0x20) >> 5); |
annodomini2 | 0:0bbbe06425db | 90 | |
annodomini2 | 0:0bbbe06425db | 91 | // Hours |
annodomini2 | 0:0bbbe06425db | 92 | Hour1 = (bool)(((uint8_t)tmr->tm_hour) & 0x01); |
annodomini2 | 0:0bbbe06425db | 93 | Hour2 = (bool)((((uint8_t)tmr->tm_hour) & 0x02) >> 1); |
annodomini2 | 0:0bbbe06425db | 94 | Hour4 = (bool)((((uint8_t)tmr->tm_hour) & 0x04) >> 2); |
annodomini2 | 0:0bbbe06425db | 95 | Hour8 = (bool)((((uint8_t)tmr->tm_hour) & 0x08) >> 3); |
annodomini2 | 0:0bbbe06425db | 96 | Hour16 = (bool)((((uint8_t)tmr->tm_hour) & 0x10) >> 4); |
annodomini2 | 0:0bbbe06425db | 97 | |
annodomini2 | 0:0bbbe06425db | 98 | wait(1); // Not my favorite method, but its easy |
annodomini2 | 0:0bbbe06425db | 99 | } |
annodomini2 | 0:0bbbe06425db | 100 | } |
annodomini2 | 0:0bbbe06425db | 101 | |
annodomini2 | 0:0bbbe06425db | 102 | void setnewtime() |
annodomini2 | 0:0bbbe06425db | 103 | { |
annodomini2 | 0:0bbbe06425db | 104 | struct tm t; |
annodomini2 | 0:0bbbe06425db | 105 | uint8_t day_limit = 0; |
annodomini2 | 0:0bbbe06425db | 106 | |
annodomini2 | 0:0bbbe06425db | 107 | printf("\n\n*******************************\n"); |
annodomini2 | 0:0bbbe06425db | 108 | printf("Real Time Clock setting utility\n"); |
annodomini2 | 0:0bbbe06425db | 109 | printf("*******************************\n\n"); |
annodomini2 | 0:0bbbe06425db | 110 | |
annodomini2 | 0:0bbbe06425db | 111 | // Years |
annodomini2 | 0:0bbbe06425db | 112 | t.tm_year = -1; // Initialise |
annodomini2 | 0:0bbbe06425db | 113 | |
annodomini2 | 0:0bbbe06425db | 114 | do |
annodomini2 | 0:0bbbe06425db | 115 | { |
annodomini2 | 0:0bbbe06425db | 116 | // Print request and wait for user entry |
annodomini2 | 0:0bbbe06425db | 117 | printf("\nEnter Year 1900- : "); |
annodomini2 | 0:0bbbe06425db | 118 | scanf("%d",&t.tm_year); |
annodomini2 | 0:0bbbe06425db | 119 | |
annodomini2 | 0:0bbbe06425db | 120 | // Validate entry |
annodomini2 | 0:0bbbe06425db | 121 | if((t.tm_year < 1900)) |
annodomini2 | 0:0bbbe06425db | 122 | { |
annodomini2 | 0:0bbbe06425db | 123 | t.tm_year = -1; |
annodomini2 | 0:0bbbe06425db | 124 | printf("\nInvalid Value!!! "); |
annodomini2 | 0:0bbbe06425db | 125 | } |
annodomini2 | 0:0bbbe06425db | 126 | } while(t.tm_year < 0); |
annodomini2 | 0:0bbbe06425db | 127 | |
annodomini2 | 0:0bbbe06425db | 128 | // Months |
annodomini2 | 0:0bbbe06425db | 129 | t.tm_mon = -1; // Initialise |
annodomini2 | 0:0bbbe06425db | 130 | |
annodomini2 | 0:0bbbe06425db | 131 | do |
annodomini2 | 0:0bbbe06425db | 132 | { |
annodomini2 | 0:0bbbe06425db | 133 | // Print request and wait for user entry |
annodomini2 | 0:0bbbe06425db | 134 | printf("\nEnter month 1-12 : "); |
annodomini2 | 0:0bbbe06425db | 135 | scanf("%d",&t.tm_mon); |
annodomini2 | 0:0bbbe06425db | 136 | |
annodomini2 | 0:0bbbe06425db | 137 | // Validate entry |
annodomini2 | 0:0bbbe06425db | 138 | if((t.tm_mon < 1) || (t.tm_mon > 12)) |
annodomini2 | 0:0bbbe06425db | 139 | { |
annodomini2 | 0:0bbbe06425db | 140 | t.tm_mon = -1; |
annodomini2 | 0:0bbbe06425db | 141 | printf("\nInvalid Value!!! "); |
annodomini2 | 0:0bbbe06425db | 142 | } |
annodomini2 | 0:0bbbe06425db | 143 | } while(t.tm_mon < 0); |
annodomini2 | 0:0bbbe06425db | 144 | |
annodomini2 | 0:0bbbe06425db | 145 | // Determine maximum number of days in the assigned month |
annodomini2 | 0:0bbbe06425db | 146 | switch(t.tm_mon) |
annodomini2 | 0:0bbbe06425db | 147 | { |
annodomini2 | 0:0bbbe06425db | 148 | case 1: |
annodomini2 | 0:0bbbe06425db | 149 | case 3: |
annodomini2 | 0:0bbbe06425db | 150 | case 5: |
annodomini2 | 0:0bbbe06425db | 151 | case 7: |
annodomini2 | 0:0bbbe06425db | 152 | case 8: |
annodomini2 | 0:0bbbe06425db | 153 | case 10: |
annodomini2 | 0:0bbbe06425db | 154 | case 12: |
annodomini2 | 0:0bbbe06425db | 155 | day_limit = 31; |
annodomini2 | 0:0bbbe06425db | 156 | break; |
annodomini2 | 0:0bbbe06425db | 157 | |
annodomini2 | 0:0bbbe06425db | 158 | case 2: |
annodomini2 | 0:0bbbe06425db | 159 | day_limit = 28; |
annodomini2 | 0:0bbbe06425db | 160 | break; |
annodomini2 | 0:0bbbe06425db | 161 | |
annodomini2 | 0:0bbbe06425db | 162 | case 4: |
annodomini2 | 0:0bbbe06425db | 163 | case 6: |
annodomini2 | 0:0bbbe06425db | 164 | case 9: |
annodomini2 | 0:0bbbe06425db | 165 | case 11: |
annodomini2 | 0:0bbbe06425db | 166 | day_limit = 30; |
annodomini2 | 0:0bbbe06425db | 167 | break; |
annodomini2 | 0:0bbbe06425db | 168 | } |
annodomini2 | 0:0bbbe06425db | 169 | |
annodomini2 | 0:0bbbe06425db | 170 | // Days |
annodomini2 | 0:0bbbe06425db | 171 | t.tm_mday = -1; // Initialise |
annodomini2 | 0:0bbbe06425db | 172 | |
annodomini2 | 0:0bbbe06425db | 173 | do |
annodomini2 | 0:0bbbe06425db | 174 | { |
annodomini2 | 0:0bbbe06425db | 175 | // Print request and wait for user entry |
annodomini2 | 0:0bbbe06425db | 176 | printf("\nEnter day 1-%d : ",day_limit); |
annodomini2 | 0:0bbbe06425db | 177 | scanf("%d",&t.tm_mday); |
annodomini2 | 0:0bbbe06425db | 178 | |
annodomini2 | 0:0bbbe06425db | 179 | // Validate entry |
annodomini2 | 0:0bbbe06425db | 180 | if((t.tm_mday < 1) || (t.tm_mday > day_limit)) |
annodomini2 | 0:0bbbe06425db | 181 | { |
annodomini2 | 0:0bbbe06425db | 182 | t.tm_mday = -1; |
annodomini2 | 0:0bbbe06425db | 183 | printf("\nInvalid Value!!! "); |
annodomini2 | 0:0bbbe06425db | 184 | } |
annodomini2 | 0:0bbbe06425db | 185 | } while(t.tm_mday < 0); |
annodomini2 | 0:0bbbe06425db | 186 | |
annodomini2 | 0:0bbbe06425db | 187 | |
annodomini2 | 0:0bbbe06425db | 188 | // Hours |
annodomini2 | 0:0bbbe06425db | 189 | t.tm_hour = -1; // Initialise |
annodomini2 | 0:0bbbe06425db | 190 | |
annodomini2 | 0:0bbbe06425db | 191 | do |
annodomini2 | 0:0bbbe06425db | 192 | { |
annodomini2 | 0:0bbbe06425db | 193 | // Print request and wait for user entry |
annodomini2 | 0:0bbbe06425db | 194 | printf("\nEnter Hours 0-23 : "); |
annodomini2 | 0:0bbbe06425db | 195 | scanf("%d",&t.tm_hour); |
annodomini2 | 0:0bbbe06425db | 196 | |
annodomini2 | 0:0bbbe06425db | 197 | // Validate entry |
annodomini2 | 0:0bbbe06425db | 198 | if((t.tm_hour < 0) || (t.tm_hour > 23)) |
annodomini2 | 0:0bbbe06425db | 199 | { |
annodomini2 | 0:0bbbe06425db | 200 | t.tm_hour = -1; |
annodomini2 | 0:0bbbe06425db | 201 | printf("\nInvalid Value!!! "); |
annodomini2 | 0:0bbbe06425db | 202 | } |
annodomini2 | 0:0bbbe06425db | 203 | } while(t.tm_hour < 0); |
annodomini2 | 0:0bbbe06425db | 204 | |
annodomini2 | 0:0bbbe06425db | 205 | // Minutes |
annodomini2 | 0:0bbbe06425db | 206 | t.tm_min = -1; // Initialise |
annodomini2 | 0:0bbbe06425db | 207 | |
annodomini2 | 0:0bbbe06425db | 208 | do |
annodomini2 | 0:0bbbe06425db | 209 | { |
annodomini2 | 0:0bbbe06425db | 210 | // Print request and wait for user entry |
annodomini2 | 0:0bbbe06425db | 211 | printf("\nEnter Minutes 0-59 : "); |
annodomini2 | 0:0bbbe06425db | 212 | scanf("%d",&t.tm_min); |
annodomini2 | 0:0bbbe06425db | 213 | |
annodomini2 | 0:0bbbe06425db | 214 | // Validate entry |
annodomini2 | 0:0bbbe06425db | 215 | if((t.tm_min < 0) || (t.tm_min > 59)) |
annodomini2 | 0:0bbbe06425db | 216 | { |
annodomini2 | 0:0bbbe06425db | 217 | t.tm_min = -1; |
annodomini2 | 0:0bbbe06425db | 218 | printf("\nInvalid Value!!! "); |
annodomini2 | 0:0bbbe06425db | 219 | } |
annodomini2 | 0:0bbbe06425db | 220 | } while(t.tm_min < 0); |
annodomini2 | 0:0bbbe06425db | 221 | |
annodomini2 | 0:0bbbe06425db | 222 | |
annodomini2 | 0:0bbbe06425db | 223 | // Seconds |
annodomini2 | 0:0bbbe06425db | 224 | t.tm_sec = -1; // Initialise |
annodomini2 | 0:0bbbe06425db | 225 | |
annodomini2 | 0:0bbbe06425db | 226 | do |
annodomini2 | 0:0bbbe06425db | 227 | { |
annodomini2 | 0:0bbbe06425db | 228 | // Print request and wait for user entry |
annodomini2 | 0:0bbbe06425db | 229 | printf("\nEnter Seconds 0-59 : "); |
annodomini2 | 0:0bbbe06425db | 230 | scanf("%d",&t.tm_sec); |
annodomini2 | 0:0bbbe06425db | 231 | |
annodomini2 | 0:0bbbe06425db | 232 | // Validate entry |
annodomini2 | 0:0bbbe06425db | 233 | if((t.tm_sec < 0) || (t.tm_sec > 59)) |
annodomini2 | 0:0bbbe06425db | 234 | { |
annodomini2 | 0:0bbbe06425db | 235 | t.tm_sec = -1; |
annodomini2 | 0:0bbbe06425db | 236 | printf("\nInvalid Value!!! "); |
annodomini2 | 0:0bbbe06425db | 237 | } |
annodomini2 | 0:0bbbe06425db | 238 | } while(t.tm_sec < 0); |
annodomini2 | 0:0bbbe06425db | 239 | |
annodomini2 | 0:0bbbe06425db | 240 | // adjust for tm structure required values |
annodomini2 | 0:0bbbe06425db | 241 | t.tm_year = t.tm_year - 1900; |
annodomini2 | 0:0bbbe06425db | 242 | t.tm_mon = t.tm_mon - 1; |
annodomini2 | 0:0bbbe06425db | 243 | |
annodomini2 | 0:0bbbe06425db | 244 | // set the time |
annodomini2 | 0:0bbbe06425db | 245 | set_time(mktime(&t)); |
annodomini2 | 0:0bbbe06425db | 246 | |
annodomini2 | 0:0bbbe06425db | 247 | printf("\n\nAnd you're done!\n\nTime now : \n\n"); |
annodomini2 | 0:0bbbe06425db | 248 | } |