Demo program for driving the memory LCD on the Zero Gecko Starter Kit.
This demo program shows how to drive the memory LCD on the Zero Gecko Starter Kit, by using asynchronous transfers.
Information
All examples in this repo are considered EXPERIMENTAL QUALITY, meaning this code has been created as one-off proof-of-concept and is suitable as a demonstration for experimental purposes only. This code will not be regularly maintained by Silicon Labs and there is no guarantee that these projects will work across all environments, SDK versions and hardware.
main.cpp@10:2acd2401b1a0, 2015-05-27 (annotated)
- Committer:
- stevew817
- Date:
- Wed May 27 11:59:26 2015 +0000
- Revision:
- 10:2acd2401b1a0
- Parent:
- 7:ce493681a94b
- Child:
- 11:9b7257e888c1
update HG
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
stevew817 | 0:ecfcdf193e3d | 1 | #include "LS013B7DH03.h" |
stevew817 | 0:ecfcdf193e3d | 2 | #include "mbed_logo.h" |
stevew817 | 0:ecfcdf193e3d | 3 | /******************** Define I/O *****************************/ |
stevew817 | 0:ecfcdf193e3d | 4 | DigitalOut myled(LED1); |
Steven Cooreman |
3:95c3a389bc88 | 5 | |
Steven Cooreman |
3:95c3a389bc88 | 6 | #if defined(TARGET_EFM32ZG_STK3200) |
Steven Cooreman |
3:95c3a389bc88 | 7 | #define SCK_PIN PC15 |
Steven Cooreman |
3:95c3a389bc88 | 8 | #define MOSI_PIN PD7 |
Steven Cooreman |
3:95c3a389bc88 | 9 | #define CS_PIN PE11 |
Steven Cooreman |
3:95c3a389bc88 | 10 | #define EXTCOM_PIN PE10 |
Steven Cooreman |
3:95c3a389bc88 | 11 | #define DISP_PIN PA10 |
Steven Cooreman |
3:95c3a389bc88 | 12 | #define DISPSEL_PIN PA8 |
Steven Cooreman |
3:95c3a389bc88 | 13 | #elif defined (TARGET_EFM32HG_STK3400) |
Steven Cooreman |
3:95c3a389bc88 | 14 | #define SCK_PIN PE12 |
Steven Cooreman |
3:95c3a389bc88 | 15 | #define MOSI_PIN PE10 |
Steven Cooreman |
3:95c3a389bc88 | 16 | #define CS_PIN PA10 |
Steven Cooreman |
3:95c3a389bc88 | 17 | #define EXTCOM_PIN PF3 |
Steven Cooreman |
3:95c3a389bc88 | 18 | #define DISP_PIN PA8 |
stevew817 | 10:2acd2401b1a0 | 19 | #define DISPSEL_PIN PA8 |
Steven Cooreman |
3:95c3a389bc88 | 20 | #else |
Steven Cooreman |
3:95c3a389bc88 | 21 | #error "undefined pinout" |
Steven Cooreman |
3:95c3a389bc88 | 22 | #endif |
stevew817 | 0:ecfcdf193e3d | 23 | |
Steven Cooreman |
3:95c3a389bc88 | 24 | DigitalOut CS(CS_PIN); |
Steven Cooreman |
3:95c3a389bc88 | 25 | DigitalOut EXTCOM(EXTCOM_PIN); |
Steven Cooreman |
3:95c3a389bc88 | 26 | DigitalOut DISP(DISP_PIN); |
Steven Cooreman |
3:95c3a389bc88 | 27 | DigitalOut DISP_SEL(DISPSEL_PIN); |
stevew817 | 0:ecfcdf193e3d | 28 | |
stevew817 | 7:ce493681a94b | 29 | SPI displaySPI(MOSI_PIN, NC, SCK_PIN); |
stevew817 | 0:ecfcdf193e3d | 30 | silabs::LS013B7DH03 display(&displaySPI, &CS, &EXTCOM); |
Steven Cooreman |
2:66aa675cb1a7 | 31 | |
stevew817 | 0:ecfcdf193e3d | 32 | /******************** Define Timers *****************************/ |
stevew817 | 0:ecfcdf193e3d | 33 | |
stevew817 | 0:ecfcdf193e3d | 34 | LowPowerTicker timeKeeping; |
stevew817 | 0:ecfcdf193e3d | 35 | |
stevew817 | 0:ecfcdf193e3d | 36 | /***************** Define global variables **********************/ |
stevew817 | 0:ecfcdf193e3d | 37 | #define INIT_SECONDS 17600 |
stevew817 | 0:ecfcdf193e3d | 38 | |
stevew817 | 0:ecfcdf193e3d | 39 | volatile uint32_t prevSeconds = INIT_SECONDS, seconds = INIT_SECONDS; |
stevew817 | 0:ecfcdf193e3d | 40 | volatile bool refreshed = false; |
stevew817 | 0:ecfcdf193e3d | 41 | |
stevew817 | 0:ecfcdf193e3d | 42 | /***************** Define callback handlers *********************/ |
stevew817 | 0:ecfcdf193e3d | 43 | void secondsCallback(void); |
stevew817 | 0:ecfcdf193e3d | 44 | void refreshCallback(void); |
stevew817 | 0:ecfcdf193e3d | 45 | |
stevew817 | 0:ecfcdf193e3d | 46 | void secondsCallback(void) { |
stevew817 | 0:ecfcdf193e3d | 47 | seconds++; |
stevew817 | 0:ecfcdf193e3d | 48 | } |
stevew817 | 0:ecfcdf193e3d | 49 | |
stevew817 | 0:ecfcdf193e3d | 50 | /** |
stevew817 | 0:ecfcdf193e3d | 51 | * Callback for refresh completion |
stevew817 | 0:ecfcdf193e3d | 52 | */ |
stevew817 | 0:ecfcdf193e3d | 53 | void refreshCallback(void) { |
stevew817 | 0:ecfcdf193e3d | 54 | refreshed = true; |
stevew817 | 0:ecfcdf193e3d | 55 | } |
stevew817 | 0:ecfcdf193e3d | 56 | |
stevew817 | 0:ecfcdf193e3d | 57 | /*************************** MAIN *******************************/ |
stevew817 | 0:ecfcdf193e3d | 58 | int main() { |
stevew817 | 0:ecfcdf193e3d | 59 | // Enable the LCD |
stevew817 | 7:ce493681a94b | 60 | DISP_SEL = 1; |
stevew817 | 0:ecfcdf193e3d | 61 | DISP = 1; |
stevew817 | 0:ecfcdf193e3d | 62 | |
stevew817 | 0:ecfcdf193e3d | 63 | // Start generating the 1Hz call for keeping time |
stevew817 | 0:ecfcdf193e3d | 64 | timeKeeping.attach(&secondsCallback, 1.0f); |
stevew817 | 0:ecfcdf193e3d | 65 | |
stevew817 | 0:ecfcdf193e3d | 66 | // Reset the LCD to a blank state. (All white) |
stevew817 | 0:ecfcdf193e3d | 67 | refreshed = false; |
stevew817 | 0:ecfcdf193e3d | 68 | display.clearImmediate(refreshCallback); |
stevew817 | 0:ecfcdf193e3d | 69 | while(refreshed == false) sleep(); |
stevew817 | 0:ecfcdf193e3d | 70 | |
stevew817 | 0:ecfcdf193e3d | 71 | printf("Initialization done! \n"); |
stevew817 | 0:ecfcdf193e3d | 72 | |
stevew817 | 0:ecfcdf193e3d | 73 | // Apply mbed logo bitmap to the pixel buffer |
stevew817 | 0:ecfcdf193e3d | 74 | display.showBMP((uint8_t*)mbed_enabled_logo, 128, 128, 0, 0); |
stevew817 | 0:ecfcdf193e3d | 75 | display.printf("I like MBED!"); |
stevew817 | 0:ecfcdf193e3d | 76 | |
stevew817 | 0:ecfcdf193e3d | 77 | // Push update to the display |
stevew817 | 0:ecfcdf193e3d | 78 | refreshed = false; |
stevew817 | 0:ecfcdf193e3d | 79 | display.update(refreshCallback); |
stevew817 | 0:ecfcdf193e3d | 80 | |
stevew817 | 0:ecfcdf193e3d | 81 | // Sleep while doing the transmit |
stevew817 | 0:ecfcdf193e3d | 82 | while(refreshed == false) sleep(); |
stevew817 | 0:ecfcdf193e3d | 83 | |
stevew817 | 0:ecfcdf193e3d | 84 | // Go into clock mode |
stevew817 | 0:ecfcdf193e3d | 85 | while(1) { |
stevew817 | 0:ecfcdf193e3d | 86 | sleep(); |
stevew817 | 0:ecfcdf193e3d | 87 | |
stevew817 | 0:ecfcdf193e3d | 88 | // In clock mode, only update once per second |
stevew817 | 0:ecfcdf193e3d | 89 | if(prevSeconds != seconds) { |
stevew817 | 0:ecfcdf193e3d | 90 | display.locate(4,15); |
stevew817 | 0:ecfcdf193e3d | 91 | display.printf("%02d:%02d:%02d", (seconds / 1200) % 24, (seconds / 60) % 60, seconds % 60); |
stevew817 | 0:ecfcdf193e3d | 92 | if(refreshed == true) { |
stevew817 | 0:ecfcdf193e3d | 93 | prevSeconds = seconds; |
stevew817 | 0:ecfcdf193e3d | 94 | refreshed = false; |
stevew817 | 0:ecfcdf193e3d | 95 | display.update(refreshCallback); |
stevew817 | 0:ecfcdf193e3d | 96 | } |
stevew817 | 0:ecfcdf193e3d | 97 | } |
stevew817 | 0:ecfcdf193e3d | 98 | } |
stevew817 | 0:ecfcdf193e3d | 99 | } |