Благодаря, харесва ми

Дори за тест модифицирах прогр. си код към работещата установка "Часовници с 7-seg LED" на STM32F411CEU6.
име на папка на проекта: stm32f411ceu6_clock_7_seg_3_digit_ca_rtc_bat_x3_buttons_time_hh._.mm_calib

.
Прикачени файлове:
ezgif-24c12e92e247e456.gif [ 688.86 KiB | Прегледано 4658 пъти ]
От 0:00 до 9:59 се изобразяват нормално H.MM с десетична точка: 0.00 ... 9.59
Преключването HH./.MM е от 10:00 до 23:59.
TIM4 - "превключващ" таймер за моментите на изобразяване
Код за потвърждение:
// 100000000 / 10000 / 2000 = 5 Hz
TIM4->PSC = 10000 - 1;
TIM4->ARR = 2000 - 1;
fs[20] - "времеви прозорци" на показанията:
0 -> изгасен
1 -> HH.
2 -> .MM
Код за потвърждение:
// HH / MM -> 3 digit 7 segments LED indicator
// blank, hh, hh, hh, hh, hh, hh, hh, hh, hh, blank, mm, mm, mm, mm, mm, mm, mm, mm
const uint8_t fs[20] = {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2};
...
void TIM4_IRQHandler(void) {
TIM4->SR &= ~TIM_SR_UIF; // clear the update flag
if (hh < 10) {
d[0] = mm % 10; // x1
d[1] = (mm / 10) % 10; // x10
d[2] = hh % 10; // x1
dp[0] = 1; // no dp
dp[1] = 1; // no dp
dp[2] = double_dp;
}
else {
fs_index++;
if (fs_index > 19)
fs_index = 0;
switch (fs[fs_index]) {
case 0: // blank
d[0] = 11;
d[1] = 11;
d[2] = 11;
dp[0] = 1; // no dp
dp[1] = 1; // no dp
dp[2] = 1; // no dp
break;
case 1: // display 'HH._'
d[0] = 11; // blank
d[1] = hh % 10; // x1
d[2] = (hh / 10) % 10; // x10
dp[0] = 1; // no dp
dp[1] = 0; // dp
dp[2] = 1; // no dp
break;
case 2: // display '_.MM'
d[0] = mm % 10; // x1
d[1] = (mm / 10) % 10; // x10
d[2] = 11; // blank
dp[0] = 1; // no dp
dp[1] = 1; // no dp
dp[2] = 0; // dp
break;
}
}
}
TIM10 - динамична индикация, превключване на 3 разряда през 106,7 Hz
Код за потвърждение:
// 320 / 3 = 106.7 Hz
// 100000000 / 100 / 3125 = 320 Hz
TIM10->PSC = 100 - 1;
TIM10->ARR = 3125 - 1;
Повече време отиде за избор (от няколко варианта) на сверяването (начинът на изобразяване точно в този момент).