Read NTP time from Ethernet and drive six 7-segment LEDs using a MAX7221 to show time, date, month, week, year etc....

Dependencies:   NTPClient_NetServices mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /*************************************************************
00002     Author: Derek Cheung
00003     Email:  cheungderek@hotmail.com
00004     Web:    http://clients.teksavvy.com/~cheungderek
00005     Date:   21 Jun 2011
00006     Note:   Just some testing but working code
00007             Read NTP time and date to show Time, Date, Month,
00008             Year automatically using MAX7221 to drive 6 LEDs
00009             See my home page for details
00010 *************************************************************/
00011 
00012 #include "mbed.h"
00013 #include "EthernetNetIf.h"
00014 #include "HTTPClient.h"
00015 #include "TextLCD.h"
00016 #include "NTPClient.h"
00017 #include "Max7221.h"
00018 
00019 #define BLINK_PERIOD 1.8        // LED on period (Initial data)
00020 #define END_PERIOD 0.0001       // Finish period
00021 
00022 DigitalOut myled1(LED1);        // Assign LED output port LED1 to LED4
00023 DigitalOut myled2(LED2);
00024 DigitalOut myled3(LED3);
00025 DigitalOut myled4(LED4);
00026 
00027 TextLCD lcd(p15, p16, p17, p26, p25, p24, p23, 16, 2); // rs,rw,e,d0,d1,d2,d3,16char's x 2 lines
00028 SPI max7221_spi(p5, p6, p7, "max7221"); // mosi, miso, sclk
00029 DigitalOut max7221_cs(p8);
00030 Serial pc(USBTX, USBRX); // tx, rx
00031 
00032 unsigned int dec2bcd(unsigned int dec);
00033 void max7221_control(unsigned control);
00034 void display_weekOfDay_month(struct tm *tm_ptr);
00035 void display_day_year(struct tm *tm_ptr);
00036 
00037 
00038 /*
00039 #include "USBHost.h"
00040 #include "Utils.h"
00041 #include "FATFileSystem.h"
00042 void TestShell();
00043 */
00044 EthernetNetIf eth;
00045 
00046 int main() {
00047 
00048     float tim;
00049     char buf[40];
00050     struct tm *tm_ptr;
00051     unsigned int tmp_int;
00052     char    *test_ptr;
00053     time_t ctTime;
00054 
00055     NTPClient ntp;
00056 
00057     // Setup the spi for 16 bit data, sample at falling edge clcok at 1MHz
00058     max7221_spi.format(16,0);
00059     max7221_spi.frequency(1000000);
00060 
00061     // shutdown operation
00062     // max7221_spi.write(0x0C00);
00063 
00064     // turn on all display
00065     max7221_control(0x0F01);
00066 
00067     // set normal operation
00068     max7221_control(0x0F00);
00069 
00070     // normal operation
00071     max7221_control(0x0C01);
00072 
00073     // sacn 6 LED
00074     max7221_control(0x0B05);
00075 
00076     // BCD mode
00077     max7221_control(0x09FF);
00078 
00079     // full intensity - Derek
00080     max7221_control(0x0A0F);
00081 
00082     // testing the char display on the LEDs
00083     /*
00084     tm_ptr = localtime(&ctTime);
00085     tm_ptr->tm_mon=1;
00086      tm_ptr->tm_mday = 0;
00087     display_weekOfDay_month(tm_ptr);
00088     tm_ptr->tm_mon=2;
00089      tm_ptr->tm_mday = 1;
00090     display_weekOfDay_month(tm_ptr);
00091     tm_ptr->tm_mon=3;
00092      tm_ptr->tm_mday = 2;
00093     display_weekOfDay_month(tm_ptr);
00094     tm_ptr->tm_mon=4;
00095      tm_ptr->tm_mday = 3;
00096     display_weekOfDay_month(tm_ptr);
00097     tm_ptr->tm_mon=5;
00098      tm_ptr->tm_mday = 4;
00099     display_weekOfDay_month(tm_ptr);
00100     tm_ptr->tm_mon=6;
00101      tm_ptr->tm_mday = 5;
00102     display_weekOfDay_month(tm_ptr);
00103     tm_ptr->tm_mon=7;
00104      tm_ptr->tm_mday = 6;
00105     display_weekOfDay_month(tm_ptr);
00106     tm_ptr->tm_mon=8;
00107     display_weekOfDay_month(tm_ptr);
00108     tm_ptr->tm_mon=9;
00109     display_weekOfDay_month(tm_ptr);
00110     tm_ptr->tm_mon=10;
00111     display_weekOfDay_month(tm_ptr);
00112     tm_ptr->tm_mon=11;
00113     display_weekOfDay_month(tm_ptr);
00114     tm_ptr->tm_mon=12;
00115     display_weekOfDay_month(tm_ptr);
00116     */
00117 
00118     // BCD mode
00119     // max7221_control(0x09FF);
00120 
00121     tim = BLINK_PERIOD;
00122     lcd.cls();
00123     lcd.locate(0, 0);
00124 
00125     //          0         1
00126     // lcd.printf("1234567890123456");
00127     // lcd.locate(0, 1);
00128     // lcd.printf("Derek Cheung  v2");
00129 
00130     // If you have implemented the "Windows USB Serial Port Driver", you can use follows.
00131     // http://mbed.org/projects/handbook/wiki/WindowsSerialConfiguration
00132     // printf("\r\n Derek Cheung Twitter Device Control - Setting up...\r\n");
00133     EthernetErr ethErr = eth.setup();
00134     if (ethErr) {
00135         printf("Error %d in setup.\n", ethErr);
00136         lcd.locate(0, 1);
00137         lcd.printf("Network Failed  ");
00138     }
00139     printf("\r\n Network Connection Setup OK\r\n");
00140     
00141     HTTPClient twitter;
00142 
00143     HTTPMap msg;
00144     msg["status"] = "Twitter Control logon successfully"; //A good example of Key/Value pair use with Web APIs
00145 
00146     twitter.basicAuth("cheungderek", "34563456"); //We use basic authentication, replace with you account's parameters
00147 
00148     //No need to retieve data sent back by the server
00149     HTTPResult r = twitter.post("http://api.supertweet.net/1/statuses/update.xml", msg, NULL);
00150     if ( r == HTTP_OK ) {
00151         printf("Tweet sent with success!\n");
00152     } else {
00153         printf("Problem during tweeting, return code %d\n", r);
00154     }
00155 
00156     lcd.cls();
00157 
00158 
00159     unsigned short tmp_left_led_digit, tmp_right_led_digit;
00160     int     blink_value = 3;
00161     Host server(IpAddr(), 123, "0.uk.pool.ntp.org");
00162     ntp.setTime(server);
00163     int     resyncNtpServerTimer = 0;
00164     int     mDayDisplayTimer = 0;
00165     int     monthDisplayTimer = 0;
00166     HTTPText txt;
00167     
00168     while (1) {
00169         /* for (tim =BLINK_PERIOD; tim >=  END_PERIOD; tim /= 3) {
00170             myled1 = 1;
00171             wait(tim);
00172             myled1 = 0;
00173             myled2 = 1;
00174             wait(tim);
00175             myled2 = 0;
00176             myled3 = 1;
00177             wait(tim);
00178             myled3 = 0;
00179             myled4 = 1;
00180             wait(tim);
00181             myled4 = 0;
00182         }
00183         */
00184 
00185         /*
00186         printf("\r\n trying to get a tweet \r\n");
00187         twitter.get("http://api.supertweet.net/1/statuses/update.xml", &txt); //Blocking
00188         printf("\r\n HTTP data %s \r\n", txt);
00189         */
00190     
00191         tmp_left_led_digit = 0;
00192         tmp_right_led_digit = 0;
00193 
00194         // sprintf(buf,"loop # = %d", count);
00195         ctTime = time(NULL) - 14400;        // EST is 4  hours behind UTC
00196         // set_time(ctTime);       // set the RTC clock)
00197         // printf("%d - RTC time is (UTC): %s \r \n", n++, ctime(&ctTime));
00198         tm_ptr = localtime(&ctTime);
00199 
00200         strftime(buf, 32, "%a %b %d %Y ", localtime(&ctTime));
00201         lcd.locate(0,0);    // 1st line
00202         lcd.printf(buf);
00203 
00204         blink_value++;
00205 
00206         // Display Seconds on the LED1 and LED2
00207         tmp_int = dec2bcd(tm_ptr->tm_sec);
00208         // re-sync the NTP clock to RTC every 2 minutes / hours
00209         resyncNtpServerTimer++;
00210         if (resyncNtpServerTimer == 100000) {
00211             lcd.locate(0, 1);
00212             lcd.printf("NTP Server Sync ");
00213             wait(1);
00214             // ethErr = eth.setup();
00215             if (ethErr) {
00216                 printf("Error %d in setup.\n", ethErr);
00217                 lcd.locate(0, 1);
00218                 lcd.printf("Network Failed  ");
00219             } else {
00220                 printf("\r\nNetwork Connection Setup OK\r\n");
00221                 // backup the time in case ntp server fails
00222                 ctTime = time(NULL); 
00223                 if (ntp.setTime(server) != 0) {
00224                     lcd.locate(0,1);
00225                     lcd.printf("NTP Sync Failed ");
00226                     set_time(ctTime);
00227                 }
00228             }
00229             wait(1);
00230             resyncNtpServerTimer = 0;
00231         }
00232         // lcd.locate(0,1);
00233         // lcd.printf("                ");
00234         
00235         mDayDisplayTimer++;
00236         if (mDayDisplayTimer == 1200) {
00237             display_day_year(tm_ptr);
00238             display_weekOfDay_month(tm_ptr);
00239             mDayDisplayTimer = 0;
00240         }
00241         
00242         tmp_left_led_digit = (unsigned short) tmp_int >> 4;
00243         tmp_right_led_digit = (unsigned short) tmp_int & 0x000F;
00244         max7221_control(LED_DIGIT1 | tmp_right_led_digit);
00245         max7221_control(LED_DIGIT2 | tmp_left_led_digit);
00246 
00247 
00248 
00249         // Display Minutes on the LED3 and LED4
00250         tmp_int = dec2bcd(tm_ptr->tm_min);
00251         tmp_left_led_digit = (unsigned short) tmp_int >> 4;
00252         tmp_right_led_digit = (unsigned short) tmp_int & 0x000F;
00253         max7221_control(LED_DIGIT3 | tmp_right_led_digit | 0x0080);
00254 
00255 
00256         /*
00257         if ((blink_value % 4) == 0)
00258             max7221_control(LED_DIGIT3 | tmp_right_led_digit | 0x0080);
00259         else
00260             max7221_control(LED_DIGIT3 | tmp_right_led_digit & 0xFF7F);
00261         */
00262         max7221_control(LED_DIGIT4 | tmp_left_led_digit);
00263 
00264         // Display Hours on the LED5 and LED6
00265         tmp_int = dec2bcd(tm_ptr->tm_hour);
00266         tmp_left_led_digit = (unsigned short) tmp_int >> 4;
00267         tmp_right_led_digit = (unsigned short) tmp_int & 0x000F;
00268         max7221_control(LED_DIGIT5 | tmp_right_led_digit | 0x0080);
00269 
00270 
00271 
00272         /*
00273         if ((blink_value % 4) == 0)
00274             max7221_control(LED_DIGIT5 | tmp_right_led_digit | 0x0080);
00275         else
00276             max7221_control(LED_DIGIT5 | tmp_right_led_digit & 0xFF7F);
00277         */
00278         max7221_control(LED_DIGIT6 | tmp_left_led_digit);
00279 
00280         /* Ethernet read Twitter message */
00281 
00282 
00283         /*
00284                 tmp_left_led_digit = (unsigned short) tmp_int >> 4;
00285                 tmp_right_led_digit = (unsigned short) tmp_int & 0x000F;
00286 
00287                 // printf("\r\n unsigned in  %d, unsigned short int  %d, char %d  - ", sizeof(unsigned int), sizeof(unsigned short int), sizeof(char));
00288 
00289 
00290                 printf("\r\n tmp_left_led_digit %X \r\n", tmp_left_led_digit | 0x0100);
00291                 max7221_cs = 0;
00292                 max7221_spi.write(tmp_left_led_digit | 0x0200);
00293                 max7221_cs = 1;
00294                 wait(0.01);
00295 
00296                 max7221_cs = 0;
00297                 max7221_spi.write(tmp_right_led_digit | 0x0100);
00298                 max7221_cs = 1;
00299 
00300                 tmp_int = dec2bcd(tm_ptr->tm_sec);
00301                 max7221_cs = 0;
00302                 max7221_spi.write(0x0100 || (tmp_int & 0x0F));
00303                 max7221_cs = 1;
00304         */
00305 
00306     }
00307     return 0;
00308 };
00309 
00310 /*
00311        //  strftime(buf, 16, "%X", localtime(&ctTime));
00312        // lcd.locate(0, 1);   // 2nd line
00313        //  lcd.printf(buf);
00314         //sprintf(buf, ctime(&ctTime));
00315 
00316         // lcd.printf(buf);
00317         // printf(" Current loop count number = %d \r\n", count);
00318         // count++;
00319 
00320 
00321     pc.baud(460800);
00322     printf("BlueUSB\nNow get a bunch of usb or bluetooth things and plug them in\n");
00323     TestShell();
00324 */
00325 
00326 unsigned int dec2bcd(unsigned int dec) {
00327     unsigned int bits, bcd = 0;
00328     for ( bits = 0; dec; bits += 4, dec /= 10 ) {
00329         bcd |= dec % 10 << bits;
00330     }
00331     return bcd;
00332 }
00333 
00334 
00335 void max7221_control(unsigned control) {
00336     max7221_cs = 0;
00337     max7221_spi.write(control);
00338     max7221_cs = 1;
00339     wait(0.001);
00340 }
00341 
00342 void display_weekOfDay_month(struct tm *tm_ptr) {
00343 
00344     // no decode
00345     max7221_control(0x0900);
00346     
00347     max7221_control(LED_DIGIT6 | LED__);
00348     max7221_control(LED_DIGIT5 | LED__);
00349     max7221_control(LED_DIGIT4 | LED__);
00350  
00351     switch(tm_ptr->tm_mon + 1) {
00352     case 1 : 
00353         max7221_control(LED_DIGIT6 | LED_J);
00354         max7221_control(LED_DIGIT5 | LED_A);
00355         max7221_control(LED_DIGIT4 | LED_N);
00356         max7221_control(LED_DIGIT3 | LED_U);
00357         max7221_control(LED_DIGIT2 | LED_A);
00358         max7221_control(LED_DIGIT1 | LED_r);       
00359         break;
00360     case 2 :
00361         max7221_control(LED_DIGIT6 | LED_F);
00362         max7221_control(LED_DIGIT5 | LED_E);
00363         max7221_control(LED_DIGIT4 | LED_b);
00364         max7221_control(LED_DIGIT3 | LED_U);
00365         max7221_control(LED_DIGIT2 | LED_A);
00366         max7221_control(LED_DIGIT1 | LED_r);
00367         break;
00368     case 3 : 
00369         max7221_control(LED_DIGIT5 | LED_M);
00370         max7221_control(LED_DIGIT4 | LED_A);
00371         max7221_control(LED_DIGIT3 | LED_r);
00372         max7221_control(LED_DIGIT2 | LED_C);
00373         max7221_control(LED_DIGIT1 | LED_H);
00374         break;
00375     case 4 :
00376         max7221_control(LED_DIGIT5 | LED_A);
00377         max7221_control(LED_DIGIT4 | LED_P);
00378         max7221_control(LED_DIGIT3 | LED_r);
00379         max7221_control(LED_DIGIT2 | LED_i);
00380         max7221_control(LED_DIGIT1 | LED_I);
00381         break;
00382     case 5 :
00383         max7221_control(LED_DIGIT3 | LED_M);
00384         max7221_control(LED_DIGIT2 | LED_A);
00385         max7221_control(LED_DIGIT1 | LED_y);
00386         break;
00387     case 6 :
00388         max7221_control(LED_DIGIT4 | LED_J);
00389         max7221_control(LED_DIGIT3 | LED_U);
00390         max7221_control(LED_DIGIT2 | LED_N);
00391         max7221_control(LED_DIGIT1 | LED_E);
00392         break;
00393     case 7 :
00394         max7221_control(LED_DIGIT4 | LED_J);
00395         max7221_control(LED_DIGIT3 | LED_U);
00396         max7221_control(LED_DIGIT2 | LED_L);
00397         max7221_control(LED_DIGIT1 | LED_y);
00398         break;
00399     case 8 :
00400         max7221_control(LED_DIGIT6 | LED_A);
00401         max7221_control(LED_DIGIT5 | LED_U);
00402         max7221_control(LED_DIGIT4 | LED_g);
00403         max7221_control(LED_DIGIT3 | LED_U);
00404         max7221_control(LED_DIGIT2 | LED_S);
00405         max7221_control(LED_DIGIT1 | LED_r);
00406         break;
00407     case 9 :
00408         max7221_control(LED_DIGIT6 | LED_S);
00409         max7221_control(LED_DIGIT5 | LED_E);
00410         max7221_control(LED_DIGIT4 | LED_P);
00411         max7221_control(LED_DIGIT3 | LED_t);
00412         max7221_control(LED_DIGIT2 | LED_E);
00413         max7221_control(LED_DIGIT1 | LED_M);
00414         break;
00415     case 10 :
00416         max7221_control(LED_DIGIT6 | LED_O);
00417         max7221_control(LED_DIGIT5 | LED_C);
00418         max7221_control(LED_DIGIT4 | LED_t);
00419         max7221_control(LED_DIGIT3 | LED_O);
00420         max7221_control(LED_DIGIT2 | LED_b);
00421         max7221_control(LED_DIGIT1 | LED_E);
00422         break;
00423     case 11 :
00424         max7221_control(LED_DIGIT6 | LED_N);
00425         max7221_control(LED_DIGIT5 | LED_O);
00426         max7221_control(LED_DIGIT4 | LED_V);
00427         max7221_control(LED_DIGIT3 | LED_E);
00428         max7221_control(LED_DIGIT2 | LED_M);
00429         max7221_control(LED_DIGIT1 | LED_b);
00430         break;
00431     case 12 :
00432         max7221_control(LED_DIGIT5 | LED_E);
00433         max7221_control(LED_DIGIT5 | LED_E);
00434         max7221_control(LED_DIGIT4 | LED_C);
00435         max7221_control(LED_DIGIT3 | LED_E);
00436         max7221_control(LED_DIGIT2 | LED_M);
00437         max7221_control(LED_DIGIT1 | LED_b);
00438         break;
00439     default :
00440         max7221_control(LED_DIGIT5 | LED_M);
00441         max7221_control(LED_DIGIT5 | LED_E);
00442         max7221_control(LED_DIGIT4 | LED_r);
00443         max7221_control(LED_DIGIT3 | LED_r); 
00444         max7221_control(LED_DIGIT2 | LED_o);
00445         max7221_control(LED_DIGIT1 | LED_r);     
00446     }
00447     
00448     wait(1.5);
00449   
00450     // printf("tm_ptr->tm_year %d \r\n", tm_ptr->tm_year);
00451     max7221_control(LED_DIGIT6 | LED__);
00452     max7221_control(LED_DIGIT5 | LED__);
00453          
00454     switch(tm_ptr->tm_year - 100) {
00455     case 11 : 
00456         max7221_control(LED_DIGIT4 | LED_2);
00457         max7221_control(LED_DIGIT3 | LED_0);
00458         max7221_control(LED_DIGIT2 | LED_1);
00459         max7221_control(LED_DIGIT1 | LED_1);
00460         break;
00461     case 12 :
00462         max7221_control(LED_DIGIT4 | LED_2);
00463         max7221_control(LED_DIGIT3 | LED_0);
00464         max7221_control(LED_DIGIT2 | LED_1);
00465         max7221_control(LED_DIGIT1 | LED_2);
00466         break;
00467     case 13 : 
00468         max7221_control(LED_DIGIT4 | LED_2);
00469         max7221_control(LED_DIGIT3 | LED_0);
00470         max7221_control(LED_DIGIT2 | LED_1);
00471         max7221_control(LED_DIGIT1 | LED_3);
00472         break;
00473     case 14 :
00474         max7221_control(LED_DIGIT4 | LED_2);
00475         max7221_control(LED_DIGIT3 | LED_0);
00476         max7221_control(LED_DIGIT2 | LED_1);
00477         max7221_control(LED_DIGIT1 | LED_4);
00478         break;
00479     case 15 :
00480         max7221_control(LED_DIGIT4 | LED_2);
00481         max7221_control(LED_DIGIT3 | LED_0);
00482         max7221_control(LED_DIGIT2 | LED_1);
00483         max7221_control(LED_DIGIT1 | LED_5);
00484         break;
00485     case 16 :
00486         max7221_control(LED_DIGIT4 | LED_2);
00487         max7221_control(LED_DIGIT3 | LED_0);
00488         max7221_control(LED_DIGIT2 | LED_1);
00489         max7221_control(LED_DIGIT1 | LED_6);
00490         break;
00491     case 17 :
00492         max7221_control(LED_DIGIT4 | LED_2);
00493         max7221_control(LED_DIGIT3 | LED_0);
00494         max7221_control(LED_DIGIT2 | LED_1);
00495         max7221_control(LED_DIGIT1 | LED_7);
00496         break;
00497     case 18 :
00498         max7221_control(LED_DIGIT4 | LED_2);
00499         max7221_control(LED_DIGIT3 | LED_0);
00500         max7221_control(LED_DIGIT2 | LED_1);
00501         max7221_control(LED_DIGIT1 | LED_8);
00502         break;
00503     case 19 :
00504         max7221_control(LED_DIGIT4 | LED_2);
00505         max7221_control(LED_DIGIT3 | LED_0);
00506         max7221_control(LED_DIGIT2 | LED_1);
00507         max7221_control(LED_DIGIT1 | LED_9);
00508         break;
00509     case 20 :
00510         max7221_control(LED_DIGIT4 | LED_2);
00511         max7221_control(LED_DIGIT3 | LED_0);
00512         max7221_control(LED_DIGIT2 | LED_2);
00513         max7221_control(LED_DIGIT1 | LED_0);
00514         break;
00515     default :
00516         max7221_control(LED_DIGIT5 | LED_y);
00517         max7221_control(LED_DIGIT5 | LED_E);
00518         max7221_control(LED_DIGIT4 | LED_r);
00519         max7221_control(LED_DIGIT3 | LED_r);
00520         max7221_control(LED_DIGIT2 | LED_o);
00521         max7221_control(LED_DIGIT1 | LED_r);
00522     }
00523     
00524     wait(1.5);
00525     // BCD mode
00526     max7221_control(0x09FF);
00527 }
00528 
00529 void display_day_year(struct tm *tm_ptr) {
00530     // no decode
00531     max7221_control(0x0900);
00532     
00533     printf("tm_ptr->tm_wday %d \r\n", tm_ptr->tm_wday);
00534     switch(tm_ptr->tm_wday) {
00535     case 0 :
00536         max7221_control(LED_DIGIT6 | LED_S);
00537         max7221_control(LED_DIGIT5 | LED_U);
00538         max7221_control(LED_DIGIT4 | LED_N);
00539         break;
00540     case 1 :
00541         max7221_control(LED_DIGIT6 | LED_M);
00542         max7221_control(LED_DIGIT5 | LED_O);
00543         max7221_control(LED_DIGIT4 | LED_N);
00544         break;
00545     case 2 :
00546         max7221_control(LED_DIGIT6 | LED_t);
00547         max7221_control(LED_DIGIT5 | LED_U);
00548         max7221_control(LED_DIGIT4 | LED_E);
00549         break;
00550     case 3 :
00551         max7221_control(LED_DIGIT6 | LED_W);
00552         max7221_control(LED_DIGIT5 | LED_E);
00553         max7221_control(LED_DIGIT4 | LED_d);
00554         break;
00555     case 4 :
00556         max7221_control(LED_DIGIT6 | LED_t);
00557         max7221_control(LED_DIGIT5 | LED_h);
00558         max7221_control(LED_DIGIT4 | LED_u);
00559         break;
00560     case 5 :
00561         max7221_control(LED_DIGIT6 | LED_F);
00562         max7221_control(LED_DIGIT5 | LED_r);
00563         max7221_control(LED_DIGIT4 | LED_i);
00564         break;
00565     case 6 :
00566         max7221_control(LED_DIGIT6 | LED_S);
00567         max7221_control(LED_DIGIT5 | LED_A);
00568         max7221_control(LED_DIGIT4 | LED_t);
00569         break;
00570     default :
00571         max7221_control(LED_DIGIT6 | LED_E);
00572         max7221_control(LED_DIGIT5 | LED_r);
00573         max7221_control(LED_DIGIT4 | LED_r);
00574     }
00575 
00576     max7221_control(LED_DIGIT3 | LED__);
00577     max7221_control(LED_DIGIT2 | LED__);
00578     switch(tm_ptr->tm_mday) {
00579     case 1 :
00580         max7221_control(LED_DIGIT1 | LED_1);
00581         break;
00582     case 2 :
00583         max7221_control(LED_DIGIT1 | LED_2);
00584         break;
00585     case 3 :
00586         max7221_control(LED_DIGIT1 | LED_3);
00587         break;
00588     case 4 :
00589         max7221_control(LED_DIGIT1 | LED_4);
00590         break;
00591     case 5 :
00592         max7221_control(LED_DIGIT1 | LED_5);
00593         break;
00594     case 6 :
00595         max7221_control(LED_DIGIT1 | LED_6);
00596         break;
00597     case 7 :
00598         max7221_control(LED_DIGIT1 | LED_7);
00599         break;
00600     case 8 :
00601         max7221_control(LED_DIGIT1 | LED_8);
00602         break;
00603     case 9 :
00604         max7221_control(LED_DIGIT1 | LED_9);
00605         break;
00606     case 11 :
00607         max7221_control(LED_DIGIT2 | LED_1);
00608         max7221_control(LED_DIGIT1 | LED_0);
00609         break;
00610     case 12 :
00611         max7221_control(LED_DIGIT2 | LED_1);
00612         max7221_control(LED_DIGIT1 | LED_2);
00613         break;
00614     case 13 :
00615         max7221_control(LED_DIGIT2 | LED_1);
00616         max7221_control(LED_DIGIT1 | LED_3);
00617         break;
00618     case 14 :
00619         max7221_control(LED_DIGIT2 | LED_1);
00620         max7221_control(LED_DIGIT1 | LED_4);
00621         break;
00622     case 15 :
00623         max7221_control(LED_DIGIT2 | LED_1);
00624         max7221_control(LED_DIGIT1 | LED_5);
00625         break;
00626     case 16 :
00627         max7221_control(LED_DIGIT2 | LED_1);
00628         max7221_control(LED_DIGIT1 | LED_6);
00629         break;
00630     case 17 :
00631         max7221_control(LED_DIGIT2 | LED_1);
00632         max7221_control(LED_DIGIT1 | LED_7);
00633         break;
00634     case 18 :
00635         max7221_control(LED_DIGIT2 | LED_1);
00636         max7221_control(LED_DIGIT1 | LED_8);
00637         break;
00638     case 19 :
00639         max7221_control(LED_DIGIT2 | LED_1);
00640         max7221_control(LED_DIGIT1 | LED_9);
00641         break;
00642     case 20 :
00643         max7221_control(LED_DIGIT2 | LED_2);
00644         max7221_control(LED_DIGIT1 | LED_0);
00645         break;
00646     case 21 :
00647         max7221_control(LED_DIGIT2 | LED_2);
00648         max7221_control(LED_DIGIT1 | LED_1);
00649         break;
00650     case 22 :
00651         max7221_control(LED_DIGIT2 | LED_2);
00652         max7221_control(LED_DIGIT1 | LED_2);
00653         break;
00654     case 23 :
00655         max7221_control(LED_DIGIT2 | LED_2);
00656         max7221_control(LED_DIGIT1 | LED_3);
00657         break;
00658     case 24 :
00659         max7221_control(LED_DIGIT2 | LED_2);
00660         max7221_control(LED_DIGIT1 | LED_4);
00661         break;
00662     case 25 :
00663         max7221_control(LED_DIGIT2 | LED_2);
00664         max7221_control(LED_DIGIT1 | LED_5);
00665         break;
00666     case 26 :
00667         max7221_control(LED_DIGIT2 | LED_2);
00668         max7221_control(LED_DIGIT1 | LED_6);
00669         break;
00670     case 27 :
00671         max7221_control(LED_DIGIT2 | LED_2);
00672         max7221_control(LED_DIGIT1 | LED_7);
00673         break;
00674     case 28 :
00675         max7221_control(LED_DIGIT2 | LED_2);
00676         max7221_control(LED_DIGIT1 | LED_8);
00677         break;
00678     case 29 :
00679         max7221_control(LED_DIGIT2 | LED_2);
00680         max7221_control(LED_DIGIT1 | LED_9);
00681         break;
00682     case 30 :
00683         max7221_control(LED_DIGIT2 | LED_3);
00684         max7221_control(LED_DIGIT1 | LED_0);
00685         break;
00686     case 31 :
00687         max7221_control(LED_DIGIT2 | LED_3);
00688         max7221_control(LED_DIGIT1 | LED_1);
00689         break;
00690     }
00691     wait(1.5);
00692     // BCD mode
00693     max7221_control(0x09FF);
00694 }
00695 
00696 /*
00697 DigitalOut myled(LED1);
00698 
00699 int main() {
00700     while(1) {
00701         myled = 1;
00702         wait(0.2);
00703         myled = 0;
00704         wait(0.2);
00705     }
00706 }
00707 */