Estoy usando el RCP MCP7940 del microchip que se requiere para ingresar el día de la semana como parte de la actualización del RTC con la fecha. Entonces, ¿cómo debo calcular el día de la semana según la fecha proporcionada por el usuario?
Estoy usando el RCP MCP7940 del microchip que se requiere para ingresar el día de la semana como parte de la actualización del RTC con la fecha. Entonces, ¿cómo debo calcular el día de la semana según la fecha proporcionada por el usuario?
Si desea calcular el día de la semana, aquí hay una implementación en C de parte de un módulo de Perl que escribí hace aproximadamente 20 años. Me gusta este algoritmo porque no requiere ningún ciclo o una tabla de longitudes de meses. Tenga en cuenta que se supone que int
s son 32 bits.
/* Returns the number of days to the start of the specified year, taking leap
* years into account, but not the shift from the Julian calendar to the
* Gregorian calendar. Instead, it is as though the Gregorian calendar is
* extrapolated back in time to a hypothetical "year zero".
*/
int leap (int year)
{
return year*365 + (year/4) - (year/100) + (year/400);
}
/* Returns a number representing the number of days since March 1 in the
* hypothetical year 0, not counting the change from the Julian calendar
* to the Gregorian calendar that occured in the 16th century. This
* algorithm is loosely based on a function known as "Zeller's Congruence".
* This number MOD 7 gives the day of week, where 0 = Monday and 6 = Sunday.
*/
int zeller (int year, int month, int day)
{
year += ((month+9)/12) - 1;
month = (month+9) % 12;
return leap (year) + month*30 + ((6*month+5)/10) + day + 1;
}
/* Returns the day of week (1=Monday, 7=Sunday) for a given date.
*/
int dow (int year, int month, int day)
{
return (zeller (year, month, day) % 7) + 1;
}
\ begin {array} {| c | c | c |} \ text {Dirección} & \ text {Bit7: 3} & \ text {Bit2: 0} & \ text {Función} & \ text {Range} \\ \ hline \ text {0x03} & \ text {...} & \ text {Day} & \ text {Day} & \ text {1-7} \ end {array}
Esto significa que el día se puede establecer en cualquier número que oscile entre 1 y 7. Puede elegir su propia convención, que es el día de la semana. En los sistemas POSIX, el lunes se define como 1, creo que es un buen estándar. Entonces martes = 2; Miércoles = 3; ...
El día = 0 no está documentado, así que no lo uses.
En Linux, este número se puede encontrar fácilmente con el comando date +%u
, que hoy responde 6
como si fuera un sábado. Si desea calcular esto localmente en su PIC, tendrá que encontrar la biblioteca C que implementa la fórmula, creo que strftime
en <time.h>
hace eso, pero no soy suficiente programador de C para explicar cómo para utilizar esa biblioteca en particular. Es una biblioteca de uso común, por lo que es fácil encontrar documentación .
El día de la semana es Arbitrario . Tú lo definas. Puedes usar el domingo juliano = día 1. Puedes usar el lunes como día 1 porque el domingo es el séptimo día. Podrías usar el viernes como Día 1 porque es el primer día del fin de semana. Puedes usar el martes como Día 1 porque odias los lunes.
Lea otras preguntas en las etiquetas microcontroller pic rtc microchip