Code for my numitron clock. Based on the STM32F042 and using a TLC5916 per numitron to drive them.

Dependencies:   SWSPI mbed-dev

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?

UserRevisionLine numberNew 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 }