Come ti calcolo la pasqua
MessaggioInviato:11 nov 2017, 18:33
Essendo a conoscenza che molti utenti alle prime armi con i PIC o microcontrollori che dir si voglia, tendono a sviluppare applicazioni prendendo spunto dagli innumerevoli esempi postati in rete, nella fattispecie e facendo una statistica sulle richieste di aiuto lette, queste puntano essenzialmente allo sviluppo di Orologi o Timer in generale.
Dalla Nixie ai Display a LED passando per i più moderni LCD, bene o male questi programmi fanno più o meno le stesse cose, data, ore e temperatura sono quelle maggiormente utilizzate, c'è chi utilizza moduli RTC per avere meno problemi nella stesura del codice o chi li abbelisce con funzioni personalizzate quali l'aggiunta della data di compleanno o addirittura il segno Zodiacale scandito mese per mese etc...
Una cosa però non ho mai visto scritta in questi codici, ovvero la corretta segnalazione della ricorrenza Pasquale che, come tutti sappiamo non occore sempre nello stesso giorno, quindi ho scritto una piccola funzione che molti di Voi magari troveranno utile per abbellire le varie creazioni:
MIKROBASIC CODE:
MIKROC CODE:
Altra cosa, è il calcolo dell'anno bisestile che è abbastanza semplice, si fà il modulo di 4 dell'anno e "se il risultato non da resto, allora l'anno è bisesto":
MIKROBASIC CODE:
MIKROC CODE:
Dalla Nixie ai Display a LED passando per i più moderni LCD, bene o male questi programmi fanno più o meno le stesse cose, data, ore e temperatura sono quelle maggiormente utilizzate, c'è chi utilizza moduli RTC per avere meno problemi nella stesura del codice o chi li abbelisce con funzioni personalizzate quali l'aggiunta della data di compleanno o addirittura il segno Zodiacale scandito mese per mese etc...
Una cosa però non ho mai visto scritta in questi codici, ovvero la corretta segnalazione della ricorrenza Pasquale che, come tutti sappiamo non occore sempre nello stesso giorno, quindi ho scritto una piccola funzione che molti di Voi magari troveranno utile per abbellire le varie creazioni:
MIKROBASIC CODE:
Codice: Seleziona tutto
'-----------------------------------------------------------------
PROGRAM EasterDayCalc ' MikroBasic
'-----------------------------------------------------------------
SUB FUNCTION EasterDay(DIM Year AS WORD) AS WORD
DIM m AS WORD
DIM n AS WORD
DIM Y AS WORD
DIM a AS WORD
DIM b AS WORD
DIM c AS WORD
DIM d AS WORD
DIM e AS WORD
DIM ED AS WORD
Y = Year
m = 24
n = 5
a = Y MOD 19
b = Y MOD 4
c = Y MOD 7
d = (19 * a + m) MOD 30
e = (2 * b + 4 * c + 6 * d + n) MOD 7
ED = 22 + d + e
IF ED <= 31 THEN
ED = ED * $100 + 3 ' Marzo
ELSE
ED = (d + e - 9) * $100 + 4 ' Aprile
END IF
result = ED ' ritorna il giorno insieme al mese
' sotto forma di una WORD (max. 7'940)
' 31 * $100 + 4 - 2 BYTE GIORNO + 2 BYTE MESE
' MSB |G|G|M|M| LSB
END SUB
'-----------------------------------------------------------------
main:
DIM Pasqua AS WORD
DIM GiornoDiPasqua AS BYTE
DIM MeseDiPasqua AS BYTE
Pasqua = EasterDay(2017)
GiornoDiPasqua = byte((Pasqua / $100) MOD $100)
MeseDiPasqua = byte(Pasqua MOD $100)
END.
MIKROC CODE:
Codice: Seleziona tutto
//-----------------------------------------------------------------
// PROGRAM EasterDayCalc - MikroC
//-----------------------------------------------------------------
unsigned EasterDay(unsigned Year) {
unsigned m;
unsigned n;
unsigned Y;
unsigned a;
unsigned b;
unsigned c;
unsigned d;
unsigned e;
unsigned ED;
Y = Year;
m = 24;
n = 5;
a = Y % 19;
b = Y % 4;
c = Y % 7;
d = (19 * a + m) % 30;
e = (2 * b + 4 * c + 6 * d + n) % 7;
ED = 22 + d + e;
if (ED <= 31) {
ED = ED * 0x100 + 3; // Marzo
} else {
ED = (d + e - 9) * 0x100 + 4; // Aprile
}
return ED; // ritorna il giorno insieme al mese
// sotto forma di una UNSIGNED (max. 7'940)
// 31 * 0x100 + 4 - 2 BYTE GIORNO + 2 BYTE MESE
// MSB |G|G|M|M| LSB
}
//-----------------------------------------------------------------
void main() {
unsigned Pasqua;
unsigned short GiornoDiPasqua;
unsigned short MeseDiPasqua;
Pasqua = EasterDay(2017);
GiornoDiPasqua = (unsigned short)((Pasqua / 0x100) % 0x100);
MeseDiPasqua = (unsigned short)(Pasqua % 0x100);
}
Altra cosa, è il calcolo dell'anno bisestile che è abbastanza semplice, si fà il modulo di 4 dell'anno e "se il risultato non da resto, allora l'anno è bisesto":
MIKROBASIC CODE:
Codice: Seleziona tutto
BYTE LeapYear = byte((YEAR MOD 4) = 0)
MIKROC CODE:
Codice: Seleziona tutto
unsigned short LeapYear = (unsigned short)((YEAR % 4) == 0);