Driving a 20T202DA2JA VFD, using the (powered) RTC, pressing a button to ask the user to enter the date details over serial, displaying the date on the VFD. Now with added ethernet and NTP to update the time automatically on startup.

Dependencies:   EthernetNetIf mbed DNSResolver NTPClientMin

main.cpp

Committer:
u0421793
Date:
2010-11-13
Revision:
0:3ba54e2bf65d
Child:
1:abc0162903bf

File content as of revision 0:3ba54e2bf65d:

#include "mbed.h"

// rudimentary driving of a 20T202DA2JA vacuum fluorescent display, 20 chars x 2 lines
// display has 5 pins
// 1 - green - GND
// 2 - yellow - Vcc
// 3 - orange - SIO - serial data - MOSI - p5
// 4 - red - /STB - active low device select - p8
// 5 - brown - SCK - serial clock - sclk - p7

// VFD
SPI spi(p5, p6, p7); // mosi, miso, sclk (miso not used by display)
DigitalOut cs(p8); // chip select (active low)

void DATA(unsigned char displaying) {
    // Select the device by setting chip select low
    cs = 0;
    spi.write(0xfa);
    spi.write(displaying);
    // Deselect the device
    cs = 1;
}

void COM(unsigned char telling) {
    // Select the device by setting chip select low
    cs = 0;
    spi.write(0xf8);
    spi.write(telling);
    // Deselect the device
    cs = 1;
}

void INITIALISE_DISPLAY() {
    COM(0x01); //clear all display and set DD-RAM address 0 in address counter
    COM(0x02); //move cursor to the original position
    COM(0x06); //set the cursor direction increment and cursor shift enabled
    COM(0x38); //set 8bit operation,2 line display and 100% brightness level
    COM(0x80); //set cursor to the first position of 1st line
    COM(0x0c); //set display on,cursor on,blinking off
}

// spare display testing string
// char theString[41] = {"20T202DA2JA VFD driven by mbed using SPI"}; // forty characters max
char timeStringTop[21], timeStringBottom1[3], timeStringBottom2[17]; // string to put the time representation into

char day_suffix[3] =  "th"; // suffix string for days like 1st 2nd 3rd
char first[3]= "st", second[3] = "nd", third[3] = "rd"; // holding strings for the suffixes

int main() {
    // Setup the spi for 8 bit data, high steady state clock,
    // second edge capture, with a 1MHz clock rate
    spi.format(8,3); // set SPI mode
    spi.frequency(1000000);

    INITIALISE_DISPLAY(); // call the function that initialises the VFD

    // get the current time from the terminal by asking the user to enter
    // unfortunately, there's no echo back, so they can't see what they type
    struct tm t;
    //year
    printf("Enter year:\n"); // ask to enter year
    printf("YYYY[enter]\n"); // as YYYY
    scanf("%d", &t.tm_year); // put the typing into here

    //month
    printf("Enter month:\n"); // ask to enter month
    printf("MM[enter]\n"); // as MM
    scanf("%d", &t.tm_mon); // put the typing into here

    //date
    printf("Enter date:\n"); // ask to enter date
    printf("DD[enter]\n"); // as DD
    scanf("%d", &t.tm_mday); // put the typing into here

    //hours
    printf("Enter hours:\n"); // ask to enter hours
    printf("HH[enter]\n"); // as HH
    scanf("%d", &t.tm_hour); // put the typing into here

    //minutes
    printf("Enter minutes:\n"); // ask to enter minutes
    printf("MM[enter]\n"); // as MM
    scanf("%d", &t.tm_min); // put the typing into here

    //seconds
    printf("Enter seconds:\n"); // ask to enter seconds
    printf("SS[enter]\n"); // as SS
    scanf("%d", &t.tm_sec); // put the typing into here

    // adjust for tm structure required values
    t.tm_year = t.tm_year - 1900;
    t.tm_mon = t.tm_mon - 1;

    // set the time
    set_time(mktime(&t));
    //set_time(1289676600);  // Set RTC time to Sat, 13 Nov 2010 19:30:00 in case of testing

    while (1) {

        time_t rtc_seconds = time(NULL); // somehow gets the current amount of seconds, evah!

        // first do a quick check to see if our date needs a 'st'; 'nd'; 'rd' or 'th' suffix
        if (t.tm_mday < 10 | t.tm_mday > 20) {
            switch (t.tm_mday%10) {
                case 1:
                    strcpy (day_suffix,first); // is it a day that needs a "st"?
                    break;
                case 2:
                    strcpy (day_suffix,second); // is it a day that needs a "nd"
                    break;
                case 3:
                    strcpy (day_suffix,third); // is it a day that needs a "rd"
                    break;
                default:
                    break; // leave 'day_suffix' saying "th" then.
            }
        }

        int i = 0; // initalise the character steppers

        // build the two lines of the display separately
        strftime(timeStringTop, 20, "%X %A %p  ", localtime(&rtc_seconds)); // put the hours:minutes:seconds, then full day, then am/pm

        COM(0x80); // first line
        for (i=0; i<20; i++) {
            DATA(timeStringTop[i]); // step through the top line
        }

        // this builds the second line in three pieces
        strftime(timeStringBottom1, 2, "%e", localtime(&rtc_seconds)); // put the date in
        strftime(timeStringBottom2, 16, " %B %Y  ", localtime(&rtc_seconds)); // put a space then the full month then the year then spaces

        COM(0xc0); // second line
        for (i=0; i<2; i++) {
            DATA(timeStringBottom1[i]); // step through the first part of the bottom line
        }
        for (i=0; i<2; i++) {
            DATA(day_suffix[i]); // then add the day suffix
        }
        for (i=0; i<17; i++) {
            DATA(timeStringBottom2[i]); // finish stepping through the bottom line
        }

        wait(1);
    }

}