Для одного проекта часов на светодиодной матрице понадобилось реализовать функцию вывода поздравлений с христианскими праздниками.
Реализаций для микроконтроллера я не нашел, поэтому пришлось разобраться с этим вопросом.
Решил сделать запись на этот сайт, он ещё живой, несмотря на то, что последняя статья была более трех лет назад!
Код для получения даты Пасхи по новому стилю написал Сергей Шилов. От него я и оттолкнулся.
'================ ХРИСТИАНСКИЕ ПРАЗДНИКИ ================
'***************************************************************************************
Christian_holidays:
'(
Праздники, почитаемые всеми христианами - это праздники, «на которые имеются указания в Священном Писании»:
Рождество Христово, Крещение Господнее, Сретение, Вход Господа Иисуса Христа в Иерусалим, или Вербное Воскресенье,
Благовещение, Страстной четверг, Светлое Христово Воскресение – Пасха, Вознесение, Троица – Сошествие Святого Духа, Преображение Господнее.
Главными праздниками христиан являются Пасха и Рождество Христово.
Они могут отмечаться как по григорианскому календарю, вместе с католической церковью и западным протестантским миром,
так и по юлианскому календарю, — вместе с большинством православных церквей.
')
Dim A_ch As Word , B_ch As Word , C_ch as Word , D_ch As Word , E_ch As Word 'Служебные переменные
Dim Year_ch As Word 'Текущий год в полном формате (2020)
Dim Day_ch , Month_ch As Byte 'День и месяц Пасхи
Dim Day_in , Month_in As Byte 'День и месяц Входа в Иерусалим
Dim Day_as , Month_as As Byte 'День и месяц Вознесения
Dim Day_tr , Month_tr As Byte 'День и месяц Троицы
Dim Christian_string As String * 254 'Строка с поздравлением
Gosub Getdate 'Получить текущую дату (DS3231, NTP, ... - Day, Month, Year)
'===Не выходящие из числа праздники===
'Рождество Христово —7 января
If Month = 1 And Day = 7 Then Christian_string = "С ПРАЗДНИКОМ РОЖДЕСТВА ХРИСТОВА!"
'Крещение Господне —19 января
If Month = 1 And Day = 19 Then Christian_string = "С ПРАЗДНИКОМ КРЕЩЕНИЯ! "
'Сретение Господне —15 февраля
If Month = 2 And Day = 15 Then Christian_string = "С ПРАЗДНИКОМ СРЕТЕНИЯ! "
'Благовещение —7 апреля
If Month = 4 And Day = 7 Then Christian_string = "С ПРАЗДНИКОМ БЛАГОВЕЩЕНИЯ! "
'Преображение Господне — 19 августа
If Month = 8 And Day = 19 Then Christian_string = "С ПРАЗДНИКОМ ПРЕОБРАЖЕНИЯ! "
'===Выходящие из числа праздники===
'Дата меняется из года в год, в зависимости от даты празднования Пасхи.
'В Православной Церкви день Пасхи в ХХ — ХХI вв. выпадает на период от 7 апреля (22 марта) до 8 мая (25 апреля).
Year_ch = Year + 2000
' For Year_ch = 2020 To 2100
A_ch = Year_ch Mod 4
B_ch = Year_ch Mod 7
C_ch = Year_ch Mod 19
D_ch = 19 * C_ch
D_ch = D_ch + 15
D_ch = D_ch Mod 30
E_ch = 4 * B_ch
E_ch = E_ch + A_ch
E_ch = E_ch + A_ch
A_ch = 6 * D_ch
E_ch = E_ch + A_ch
E_ch = E_ch + 6
E_ch = E_ch Mod 7
C_ch = D_ch + E_ch
' Пасха (в 2021 году — 2 мая)
If C_ch > 26 Then
Day_ch = C_ch - 26
Month_ch = 5
Else
Day_ch = C_ch + 4
Month_ch = 4
End If
If Month = Month_ch And Day = Day_ch Then Christian_string = "СО СВЕТЛЫМ ПРАЗДНИКОМ ПАСХИ - ВОСКРЕСЕНИЯ ХРИСТОВА! ХРИСТОС ВОСКРЕС! ВОИСТИНУ ВОСКРЕС!"
' Вход Господень в Иерусалим — воскресенье, за 7 дней перед Пасхой
If Day_ch > 7 Then
Month_in = Month_ch
Day_in = Day_ch - 7
Else
Month_in = Month_ch - 1
If Month_in = 4 Then
Day_in = 23 + Day_ch
Else
Day_in = 24 + Day_ch
End If
End If
If Month = Month_in And Day = Day_in Then Christian_string = "С ПРАЗДНИКОМ ВХОДА ГОСПОДНЯ В ИЕРУСАЛИМ!"
' Вознесение Господне — 40-й день после Пасхи, всегда в четверг (май, июнь)
If Month_ch = 4 Then
If Day_ch < 23 Then
Month_as = 5
Day_as = Day_ch + 9
Else
Month_as = 6
Day_as = Day_ch - 22
End If
Else
Month_as = 6
Day_as = Day_ch + 8
End If
If Month = Month_as And Day = Day_as Then Christian_string = "С ПРАЗДНИКОМ ВОЗНЕСЕНИЯ!"
' День Святой Троицы — 50-й день после Пасхи, всегда в воскресенье. (май, июнь)
If Month_ch = 4 Then
If Day_ch < 13 Then
Month_tr = 5
Day_tr = Day_ch + 19
Else
Month_tr = 6
Day_tr = Day_ch - 12
End If
Else
Month_tr = 6
Day_tr = Day_ch + 18
End If
If Month = Month_tr And Day = Day_tr Then Christian_string = "С ПРАЗДНИКОМ СВЯТОЙ ТРОИЦЫ!"
Print #1 , Str(Year_ch) ; " Вход: " ; Str(Day_in) ; "." ; Str(Month_in) ; " Пасха: " ; Str(Day_ch) ; "." ; Str(Month_ch) ; " Вознесение: " ; Str(Day_as) ; "." ; Str(Month_as) ; " Троица: " ; Str(Day_tr) ; "." ; Str(Month_tr)
' Next Year_ch
If Weekday = 1 And Christian_string <>"" Then Christian_string = "С ПРАЗДНИКОМ ВОСКРЕСЕНИЯ!" 'Каждое Воскресенье, если нет другого праздника
Return
Если захотите проверить совпадение дат (вплоть до 2100 года) этого кода с известными таблицами, уберите комментарий с цикла(выделен красным цветом).
И сверяйте с любым известным источником, которых полно в сети, например - Пасхалия XXI век. Даты Прощеного и Вербного Воскресений, Пасхи, Вознесения, Троицы с 2001 по 2100 годы
Вот что получилось:
2020 ===Вход: 12.4 ===Пасха: 19.4 ===Вознесение: 28.5 ===Троица: 7.6
2021 ===Вход: 25.4 ===Пасха: 2.5 ===Вознесение: 10.6 ===Троица: 20.6
2022 ===Вход: 17.4 ===Пасха: 24.4 ===Вознесение: 2.6 ===Троица: 12.6
2023 ===Вход: 9.4 ===Пасха: 16.4 ===Вознесение: 25.5 ===Троица: 4.6
2024 ===Вход: 28.4 ===Пасха: 5.5 ===Вознесение: 13.6 ===Троица: 23.6
2025 ===Вход: 13.4 ===Пасха: 20.4 ===Вознесение: 29.5 ===Троица: 8.6
2026 ===Вход: 5.4 ===Пасха: 12.4 ===Вознесение: 21.5 ===Троица: 31.5
2027 ===Вход: 25.4 ===Пасха: 2.5 ===Вознесение: 10.6 ===Троица: 20.6
2028 ===Вход: 9.4 ===Пасха: 16.4 ===Вознесение: 25.5 ===Троица: 4.6
2029 ===Вход: 1.4 ===Пасха: 8.4 ===Вознесение: 17.5 ===Троица: 27.5
2030 ===Вход: 21.4 ===Пасха: 28.4 ===Вознесение: 6.6 ===Троица: 16.6
2031 ===Вход: 6.4 ===Пасха: 13.4 ===Вознесение: 22.5 ===Троица: 1.6
2032 ===Вход: 25.4 ===Пасха: 2.5 ===Вознесение: 10.6 ===Троица: 20.6
2033 ===Вход: 17.4 ===Пасха: 24.4 ===Вознесение: 2.6 ===Троица: 12.6
2034 ===Вход: 2.4 ===Пасха: 9.4 ===Вознесение: 18.5 ===Троица: 28.5
2035 ===Вход: 22.4 ===Пасха: 29.4 ===Вознесение: 7.6 ===Троица: 17.6
2036 ===Вход: 13.4 ===Пасха: 20.4 ===Вознесение: 29.5 ===Троица: 8.6
2037 ===Вход: 29.3 ===Пасха: 5.4 ===Вознесение: 14.5 ===Троица: 24.5
2038 ===Вход: 18.4 ===Пасха: 25.4 ===Вознесение: 3.6 ===Троица: 13.6
2039 ===Вход: 10.4 ===Пасха: 17.4 ===Вознесение: 26.5 ===Троица: 5.6
2040 ===Вход: 29.4 ===Пасха: 6.5 ===Вознесение: 14.6 ===Троица: 24.6
2041 ===Вход: 14.4 ===Пасха: 21.4 ===Вознесение: 30.5 ===Троица: 9.6
2042 ===Вход: 6.4 ===Пасха: 13.4 ===Вознесение: 22.5 ===Троица: 1.6
2043 ===Вход: 26.4 ===Пасха: 3.5 ===Вознесение: 11.6 ===Троица: 21.6
2044 ===Вход: 17.4 ===Пасха: 24.4 ===Вознесение: 2.6 ===Троица: 12.6
2045 ===Вход: 2.4 ===Пасха: 9.4 ===Вознесение: 18.5 ===Троица: 28.5
2046 ===Вход: 22.4 ===Пасха: 29.4 ===Вознесение: 7.6 ===Троица: 17.6
2047 ===Вход: 14.4 ===Пасха: 21.4 ===Вознесение: 30.5 ===Троица: 9.6
2048 ===Вход: 29.3 ===Пасха: 5.4 ===Вознесение: 14.5 ===Троица: 24.5
2049 ===Вход: 18.4 ===Пасха: 25.4 ===Вознесение: 3.6 ===Троица: 13.6
2050 ===Вход: 10.4 ===Пасха: 17.4 ===Вознесение: 26.5 ===Троица: 5.6
2051 ===Вход: 30.4 ===Пасха: 7.5 ===Вознесение: 15.6 ===Троица: 25.6
2052 ===Вход: 14.4 ===Пасха: 21.4 ===Вознесение: 30.5 ===Троица: 9.6
2053 ===Вход: 6.4 ===Пасха: 13.4 ===Вознесение: 22.5 ===Троица: 1.6
2054 ===Вход: 26.4 ===Пасха: 3.5 ===Вознесение: 11.6 ===Троица: 21.6
2055 ===Вход: 11.4 ===Пасха: 18.4 ===Вознесение: 27.5 ===Троица: 6.6
2056 ===Вход: 2.4 ===Пасха: 9.4 ===Вознесение: 18.5 ===Троица: 28.5
2057 ===Вход: 22.4 ===Пасха: 29.4 ===Вознесение: 7.6 ===Троица: 17.6
2058 ===Вход: 7.4 ===Пасха: 14.4 ===Вознесение: 23.5 ===Троица: 2.6
2059 ===Вход: 27.4 ===Пасха: 4.5 ===Вознесение: 12.6 ===Троица: 22.6
2060 ===Вход: 18.4 ===Пасха: 25.4 ===Вознесение: 3.6 ===Троица: 13.6
2061 ===Вход: 3.4 ===Пасха: 10.4 ===Вознесение: 19.5 ===Троица: 29.5
2062 ===Вход: 23.4 ===Пасха: 30.4 ===Вознесение: 8.6 ===Троица: 18.6
2063 ===Вход: 15.4 ===Пасха: 22.4 ===Вознесение: 31.5 ===Троица: 10.6
2064 ===Вход: 6.4 ===Пасха: 13.4 ===Вознесение: 22.5 ===Троица: 1.6
2065 ===Вход: 19.4 ===Пасха: 26.4 ===Вознесение: 4.6 ===Троица: 14.6
2066 ===Вход: 11.4 ===Пасха: 18.4 ===Вознесение: 27.5 ===Троица: 6.6
2067 ===Вход: 3.4 ===Пасха: 10.4 ===Вознесение: 19.5 ===Троица: 29.5
2068 ===Вход: 22.4 ===Пасха: 29.4 ===Вознесение: 7.6 ===Троица: 17.6
2069 ===Вход: 7.4 ===Пасха: 14.4 ===Вознесение: 23.5 ===Троица: 2.6
2070 ===Вход: 27.4 ===Пасха: 4.5 ===Вознесение: 12.6 ===Троица: 22.6
2071 ===Вход: 12.4 ===Пасха: 19.4 ===Вознесение: 28.5 ===Троица: 7.6
2072 ===Вход: 3.4 ===Пасха: 10.4 ===Вознесение: 19.5 ===Троица: 29.5
2073 ===Вход: 23.4 ===Пасха: 30.4 ===Вознесение: 8.6 ===Троица: 18.6
2074 ===Вход: 15.4 ===Пасха: 22.4 ===Вознесение: 31.5 ===Троица: 10.6
2075 ===Вход: 31.3 ===Пасха: 7.4 ===Вознесение: 16.5 ===Троица: 26.5
2076 ===Вход: 19.4 ===Пасха: 26.4 ===Вознесение: 4.6 ===Троица: 14.6
2077 ===Вход: 11.4 ===Пасха: 18.4 ===Вознесение: 27.5 ===Троица: 6.6
2078 ===Вход: 1.5 ===Пасха: 8.5 ===Вознесение: 16.6 ===Троица: 26.6
2079 ===Вход: 16.4 ===Пасха: 23.4 ===Вознесение: 1.6 ===Троица: 11.6
2080 ===Вход: 7.4 ===Пасха: 14.4 ===Вознесение: 23.5 ===Троица: 2.6
2081 ===Вход: 27.4 ===Пасха: 4.5 ===Вознесение: 12.6 ===Троица: 22.6
2082 ===Вход: 12.4 ===Пасха: 19.4 ===Вознесение: 28.5 ===Троица: 7.6
2083 ===Вход: 4.4 ===Пасха: 11.4 ===Вознесение: 20.5 ===Троица: 30.5
2084 ===Вход: 23.4 ===Пасха: 30.4 ===Вознесение: 8.6 ===Троица: 18.6
2085 ===Вход: 8.4 ===Пасха: 15.4 ===Вознесение: 24.5 ===Троица: 3.6
2086 ===Вход: 31.3 ===Пасха: 7.4 ===Вознесение: 16.5 ===Троица: 26.5
2087 ===Вход: 20.4 ===Пасха: 27.4 ===Вознесение: 5.6 ===Троица: 15.6
2088 ===Вход: 11.4 ===Пасха: 18.4 ===Вознесение: 27.5 ===Троица: 6.6
2089 ===Вход: 24.4 ===Пасха: 1.5 ===Вознесение: 9.6 ===Троица: 19.6
2090 ===Вход: 16.4 ===Пасха: 23.4 ===Вознесение: 1.6 ===Троица: 11.6
2091 ===Вход: 1.4 ===Пасха: 8.4 ===Вознесение: 17.5 ===Троица: 27.5
2092 ===Вход: 20.4 ===Пасха: 27.4 ===Вознесение: 5.6 ===Троица: 15.6
2093 ===Вход: 12.4 ===Пасха: 19.4 ===Вознесение: 28.5 ===Троица: 7.6
2094 ===Вход: 4.4 ===Пасха: 11.4 ===Вознесение: 20.5 ===Троица: 30.5
2095 ===Вход: 17.4 ===Пасха: 24.4 ===Вознесение: 2.6 ===Троица: 12.6
2096 ===Вход: 8.4 ===Пасха: 15.4 ===Вознесение: 24.5 ===Троица: 3.6
2097 ===Вход: 28.4 ===Пасха: 5.5 ===Вознесение: 13.6 ===Троица: 23.6
2098 ===Вход: 20.4 ===Пасха: 27.4 ===Вознесение: 5.6 ===Троица: 15.6
2099 ===Вход: 5.4 ===Пасха: 12.4 ===Вознесение: 21.5 ===Троица: 31.5
2100 ===Вход: 24.4 ===Пасха: 1.5 ===Вознесение: 9.6 ===Троица: 19.6
|