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 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?

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 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