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