Code for my numitron clock. Based on the STM32F042 and using a TLC5916 per numitron to drive them.
main.cpp@1:c80f72f7ee20, 2016-12-25 (annotated)
- Committer:
- riktw
- Date:
- Sun Dec 25 09:52:54 2016 +0000
- Revision:
- 1:c80f72f7ee20
- Parent:
- 0:d1558f6f88bf
- Child:
- 3:e89157584674
Rev 0.2 PCB, added external XTAL that is used for the RTC
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
riktw | 1:c80f72f7ee20 | 1 | #include "mbed.h" |
riktw | 0:d1558f6f88bf | 2 | #include "SWSPI.h" |
riktw | 0:d1558f6f88bf | 3 | |
riktw | 1:c80f72f7ee20 | 4 | SWSPI spi( PA_2, PA_1, PA_3 ); // create the SPI port |
riktw | 1:c80f72f7ee20 | 5 | DigitalOut OE(PA_0); |
riktw | 1:c80f72f7ee20 | 6 | DigitalOut LE(PA_4); // the LE pin and the number of connected chips |
riktw | 1:c80f72f7ee20 | 7 | DigitalIn B1(PA_5), B2(PA_6), B3(PA_7), B4(PB_1); //B1 is the most left button |
riktw | 1:c80f72f7ee20 | 8 | BusIn buttons(PA_5, PA_6, PA_7, PB_1); |
riktw | 0:d1558f6f88bf | 9 | const uint8_t numbers[10] = {0x7B, 0x60, 0x57, 0x76, 0x6C, 0x3E, 0x3F, 0x70, 0x7F, 0x7E}; |
riktw | 1:c80f72f7ee20 | 10 | uint8_t flip = 1; |
riktw | 0:d1558f6f88bf | 11 | |
riktw | 1:c80f72f7ee20 | 12 | RTC_HandleTypeDef hrtc; |
riktw | 1:c80f72f7ee20 | 13 | HAL_StatusTypeDef status; |
riktw | 1:c80f72f7ee20 | 14 | void SystemClock_Config(void); |
riktw | 1:c80f72f7ee20 | 15 | static void MX_RTC_Init(void); |
riktw | 0:d1558f6f88bf | 16 | |
riktw | 0:d1558f6f88bf | 17 | typedef struct |
riktw | 0:d1558f6f88bf | 18 | { |
riktw | 0:d1558f6f88bf | 19 | uint8_t second_right; |
riktw | 0:d1558f6f88bf | 20 | uint8_t second_left; |
riktw | 0:d1558f6f88bf | 21 | uint8_t minute_right; |
riktw | 0:d1558f6f88bf | 22 | uint8_t minute_left; |
riktw | 0:d1558f6f88bf | 23 | uint8_t hour_right; |
riktw | 0:d1558f6f88bf | 24 | uint8_t hour_left; |
riktw | 0:d1558f6f88bf | 25 | }clock_typ; |
riktw | 0:d1558f6f88bf | 26 | |
riktw | 0:d1558f6f88bf | 27 | struct tm t; |
riktw | 0:d1558f6f88bf | 28 | time_t rawtime; |
riktw | 1:c80f72f7ee20 | 29 | clock_typ numiclock; |
riktw | 0:d1558f6f88bf | 30 | Ticker secondticker; |
riktw | 1:c80f72f7ee20 | 31 | void secondtick(void); |
riktw | 0:d1558f6f88bf | 32 | void updatetime(void); |
riktw | 0:d1558f6f88bf | 33 | int main() |
riktw | 0:d1558f6f88bf | 34 | { |
riktw | 1:c80f72f7ee20 | 35 | MX_RTC_Init(); |
riktw | 0:d1558f6f88bf | 36 | static struct tm *t3; |
riktw | 0:d1558f6f88bf | 37 | buttons.mode(PullUp); |
riktw | 0:d1558f6f88bf | 38 | |
riktw | 0:d1558f6f88bf | 39 | LE = 0; |
riktw | 0:d1558f6f88bf | 40 | OE = 1; |
riktw | 0:d1558f6f88bf | 41 | |
riktw | 0:d1558f6f88bf | 42 | t.tm_sec = 0; |
riktw | 0:d1558f6f88bf | 43 | t.tm_min = 0; |
riktw | 0:d1558f6f88bf | 44 | t.tm_hour = 0; |
riktw | 0:d1558f6f88bf | 45 | t.tm_mday = 1; |
riktw | 0:d1558f6f88bf | 46 | t.tm_mon = 1-1; |
riktw | 0:d1558f6f88bf | 47 | t.tm_year = 2016-1900; |
riktw | 0:d1558f6f88bf | 48 | set_time(mktime(&t)); |
riktw | 0:d1558f6f88bf | 49 | |
riktw | 1:c80f72f7ee20 | 50 | rawtime = time(NULL); |
riktw | 1:c80f72f7ee20 | 51 | |
riktw | 0:d1558f6f88bf | 52 | spi.write(0x00); |
riktw | 0:d1558f6f88bf | 53 | spi.write(0x00); |
riktw | 0:d1558f6f88bf | 54 | spi.write(0x00); |
riktw | 0:d1558f6f88bf | 55 | spi.write(0x00); |
riktw | 0:d1558f6f88bf | 56 | |
riktw | 0:d1558f6f88bf | 57 | LE = 1; |
riktw | 0:d1558f6f88bf | 58 | wait_us(10); |
riktw | 0:d1558f6f88bf | 59 | LE = 0; |
riktw | 0:d1558f6f88bf | 60 | wait_us(10); |
riktw | 0:d1558f6f88bf | 61 | |
riktw | 1:c80f72f7ee20 | 62 | OE = 0; |
riktw | 1:c80f72f7ee20 | 63 | secondticker.attach(&updatetime, 2); |
riktw | 0:d1558f6f88bf | 64 | while( 1 ) |
riktw | 1:c80f72f7ee20 | 65 | { |
riktw | 0:d1558f6f88bf | 66 | uint8_t bpressed = buttons; |
riktw | 0:d1558f6f88bf | 67 | wait_ms(50); |
riktw | 0:d1558f6f88bf | 68 | if((bpressed == buttons) && (bpressed != 0xf)) |
riktw | 0:d1558f6f88bf | 69 | { |
riktw | 0:d1558f6f88bf | 70 | rawtime = time(NULL); |
riktw | 0:d1558f6f88bf | 71 | t3 = localtime(&rawtime); |
riktw | 1:c80f72f7ee20 | 72 | bpressed = (~bpressed)&0x0f; |
riktw | 0:d1558f6f88bf | 73 | switch(bpressed) |
riktw | 0:d1558f6f88bf | 74 | { |
riktw | 1:c80f72f7ee20 | 75 | case 0x01: |
riktw | 0:d1558f6f88bf | 76 | t3->tm_hour += 10; |
riktw | 1:c80f72f7ee20 | 77 | if(t3->tm_hour >= 30) |
riktw | 0:d1558f6f88bf | 78 | { |
riktw | 0:d1558f6f88bf | 79 | t3->tm_hour -= 30; |
riktw | 0:d1558f6f88bf | 80 | } |
riktw | 0:d1558f6f88bf | 81 | else if(t3->tm_hour >= 24) |
riktw | 0:d1558f6f88bf | 82 | { |
riktw | 0:d1558f6f88bf | 83 | t3->tm_hour -= 20; |
riktw | 0:d1558f6f88bf | 84 | } |
riktw | 0:d1558f6f88bf | 85 | break; |
riktw | 1:c80f72f7ee20 | 86 | case 0x02: |
riktw | 0:d1558f6f88bf | 87 | t3->tm_hour += 1; |
riktw | 0:d1558f6f88bf | 88 | if((t3->tm_hour%10) == 0) |
riktw | 0:d1558f6f88bf | 89 | { |
riktw | 0:d1558f6f88bf | 90 | t3->tm_hour -= 10; |
riktw | 0:d1558f6f88bf | 91 | } |
riktw | 0:d1558f6f88bf | 92 | else if(t3->tm_hour >= 24) |
riktw | 0:d1558f6f88bf | 93 | { |
riktw | 0:d1558f6f88bf | 94 | t3->tm_hour -= 4; |
riktw | 0:d1558f6f88bf | 95 | } |
riktw | 0:d1558f6f88bf | 96 | break; |
riktw | 1:c80f72f7ee20 | 97 | case 0x04: |
riktw | 0:d1558f6f88bf | 98 | t3->tm_min += 10; |
riktw | 0:d1558f6f88bf | 99 | if(t3->tm_min >= 60) |
riktw | 0:d1558f6f88bf | 100 | { |
riktw | 0:d1558f6f88bf | 101 | t3->tm_min -= 60; |
riktw | 0:d1558f6f88bf | 102 | } |
riktw | 1:c80f72f7ee20 | 103 | break; |
riktw | 1:c80f72f7ee20 | 104 | case 0x08: |
riktw | 0:d1558f6f88bf | 105 | t3->tm_min += 1; |
riktw | 0:d1558f6f88bf | 106 | if((t3->tm_min%10) == 0) |
riktw | 0:d1558f6f88bf | 107 | { |
riktw | 0:d1558f6f88bf | 108 | t3->tm_min -= 10; |
riktw | 0:d1558f6f88bf | 109 | } |
riktw | 0:d1558f6f88bf | 110 | break; |
riktw | 0:d1558f6f88bf | 111 | } |
riktw | 0:d1558f6f88bf | 112 | set_time(mktime(t3)); |
riktw | 1:c80f72f7ee20 | 113 | flip = 0; |
riktw | 1:c80f72f7ee20 | 114 | updatetime(); |
riktw | 1:c80f72f7ee20 | 115 | flip = 1; |
riktw | 1:c80f72f7ee20 | 116 | wait_ms(150); |
riktw | 0:d1558f6f88bf | 117 | } |
riktw | 0:d1558f6f88bf | 118 | } |
riktw | 0:d1558f6f88bf | 119 | } |
riktw | 0:d1558f6f88bf | 120 | |
riktw | 0:d1558f6f88bf | 121 | void updatetime(void) |
riktw | 0:d1558f6f88bf | 122 | { |
riktw | 0:d1558f6f88bf | 123 | static uint8_t flipbit; |
riktw | 0:d1558f6f88bf | 124 | static struct tm *t2; |
riktw | 0:d1558f6f88bf | 125 | rawtime = time(NULL); |
riktw | 0:d1558f6f88bf | 126 | t2 = localtime(&rawtime); |
riktw | 0:d1558f6f88bf | 127 | |
riktw | 0:d1558f6f88bf | 128 | numiclock.second_right = t2->tm_sec%10; |
riktw | 0:d1558f6f88bf | 129 | numiclock.second_left = (t2->tm_sec - numiclock.second_right)/10; |
riktw | 0:d1558f6f88bf | 130 | numiclock.minute_right = t2->tm_min%10; |
riktw | 0:d1558f6f88bf | 131 | numiclock.minute_left = (t2->tm_min - numiclock.minute_right)/10; |
riktw | 0:d1558f6f88bf | 132 | numiclock.hour_right = t2->tm_hour%10; |
riktw | 0:d1558f6f88bf | 133 | numiclock.hour_left = (t2->tm_hour-numiclock.hour_right)/10; |
riktw | 0:d1558f6f88bf | 134 | |
riktw | 0:d1558f6f88bf | 135 | spi.write(numbers[numiclock.hour_left]); |
riktw | 1:c80f72f7ee20 | 136 | if(flip) |
riktw | 0:d1558f6f88bf | 137 | { |
riktw | 0:d1558f6f88bf | 138 | if(flipbit == 1) |
riktw | 0:d1558f6f88bf | 139 | { |
riktw | 0:d1558f6f88bf | 140 | spi.write((numbers[numiclock.hour_right])+0x80); |
riktw | 0:d1558f6f88bf | 141 | flipbit = 0; |
riktw | 0:d1558f6f88bf | 142 | } |
riktw | 0:d1558f6f88bf | 143 | else |
riktw | 0:d1558f6f88bf | 144 | { |
riktw | 0:d1558f6f88bf | 145 | spi.write(numbers[numiclock.hour_right]); |
riktw | 0:d1558f6f88bf | 146 | flipbit = 1; |
riktw | 0:d1558f6f88bf | 147 | } |
riktw | 0:d1558f6f88bf | 148 | } |
riktw | 0:d1558f6f88bf | 149 | else |
riktw | 0:d1558f6f88bf | 150 | { |
riktw | 0:d1558f6f88bf | 151 | spi.write(numbers[numiclock.hour_right]); |
riktw | 0:d1558f6f88bf | 152 | } |
riktw | 0:d1558f6f88bf | 153 | spi.write(numbers[numiclock.minute_left]); |
riktw | 0:d1558f6f88bf | 154 | spi.write(numbers[numiclock.minute_right]); |
riktw | 0:d1558f6f88bf | 155 | |
riktw | 0:d1558f6f88bf | 156 | LE = 1; |
riktw | 0:d1558f6f88bf | 157 | wait_us(10); |
riktw | 0:d1558f6f88bf | 158 | LE = 0; |
riktw | 0:d1558f6f88bf | 159 | wait_us(10); |
riktw | 0:d1558f6f88bf | 160 | } |
riktw | 1:c80f72f7ee20 | 161 | |
riktw | 1:c80f72f7ee20 | 162 | /* RTC init function */ |
riktw | 1:c80f72f7ee20 | 163 | void MX_RTC_Init(void) |
riktw | 1:c80f72f7ee20 | 164 | { |
riktw | 1:c80f72f7ee20 | 165 | |
riktw | 1:c80f72f7ee20 | 166 | RTC_TimeTypeDef sTime; |
riktw | 1:c80f72f7ee20 | 167 | RTC_DateTypeDef sDate; |
riktw | 1:c80f72f7ee20 | 168 | |
riktw | 1:c80f72f7ee20 | 169 | /**Initialize RTC and set the Time and Date |
riktw | 1:c80f72f7ee20 | 170 | */ |
riktw | 1:c80f72f7ee20 | 171 | hrtc.Instance = RTC; |
riktw | 1:c80f72f7ee20 | 172 | hrtc.Init.HourFormat = RTC_HOURFORMAT_24; |
riktw | 1:c80f72f7ee20 | 173 | hrtc.Init.AsynchPrediv = 124; |
riktw | 1:c80f72f7ee20 | 174 | hrtc.Init.SynchPrediv = 1999; |
riktw | 1:c80f72f7ee20 | 175 | hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; |
riktw | 1:c80f72f7ee20 | 176 | hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; |
riktw | 1:c80f72f7ee20 | 177 | hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; |
riktw | 1:c80f72f7ee20 | 178 | status = HAL_RTC_Init(&hrtc); |
riktw | 1:c80f72f7ee20 | 179 | |
riktw | 1:c80f72f7ee20 | 180 | sTime.Hours = 0x0; |
riktw | 1:c80f72f7ee20 | 181 | sTime.Minutes = 0x0; |
riktw | 1:c80f72f7ee20 | 182 | sTime.Seconds = 0x0; |
riktw | 1:c80f72f7ee20 | 183 | sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; |
riktw | 1:c80f72f7ee20 | 184 | sTime.StoreOperation = RTC_STOREOPERATION_RESET; |
riktw | 1:c80f72f7ee20 | 185 | HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD); |
riktw | 1:c80f72f7ee20 | 186 | |
riktw | 1:c80f72f7ee20 | 187 | sDate.WeekDay = RTC_WEEKDAY_MONDAY; |
riktw | 1:c80f72f7ee20 | 188 | sDate.Month = RTC_MONTH_JANUARY; |
riktw | 1:c80f72f7ee20 | 189 | sDate.Date = 0x1; |
riktw | 1:c80f72f7ee20 | 190 | sDate.Year = 0x0; |
riktw | 1:c80f72f7ee20 | 191 | |
riktw | 1:c80f72f7ee20 | 192 | HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD); |
riktw | 1:c80f72f7ee20 | 193 | |
riktw | 1:c80f72f7ee20 | 194 | } |
riktw | 1:c80f72f7ee20 | 195 |