Red de conocimientos turísticos - Pronóstico del tiempo - Escribir un calendario perpetuo simple en C++

Escribir un calendario perpetuo simple en C++

Te daré dos programas que he recopilado. He completado este diseño de eda.

# incluir & ltIOM 16v . h & gt;

# incluir & ltmacros.h & gt

# definir ext_ram 1(*(carácter volátil sin firmar * )0xf0a 0)

#define ext_ram 2 (*(carácter volátil sin firmar *)0xf0c 0)

#define write_LCM_ins(*(carácter volátil sin firmar *)0x 6000)

#define write_LCM_data(*(carácter volátil sin firmar *)0x 6001)

#define timer_sec(*(carácter volátil sin firmar *) 0x 2000)

#Define timer_min( *(carácter volátil sin firmar *)0x 2002)

#Definir timer_hour(*(carácter volátil sin firmar *)0x 2004)

#Definir timer_week(*(carácter volátil sin firmar *)0x 2006)

#Define timer_day(*(carácter volátil sin firmar *)0x 2007)

#define timer_moth(*(carácter volátil sin firmar *)0x 2008)

#define timer_year(*(volatile unsigned char *)0x 2009)

#define timer_ra(*(volatile unsigned char *)0x 2010)

# define timer_Rb(*(volatile carácter sin firmar *)0x 2011)

# definir temporizador _ RC (* (carbón volátil sin signo *) 0x 2012)

# definir temporizador _ rd (* (carbón volátil sin signo *) 0x 2013)

//// ///////////////////////////////////// ////////////////// /////

Caracteres sin signo I, k, sn0, j, a, s, datos

Caracteres sin firmar sec_buf, min_buf, hora_buf, sec0, sec1, min0, min1, hora0, hora 1;

Caracteres sin firmar año, mes, día, semana, hora, minuto, segundo;

Caracteres sin firmar año_buf, polilla_buf, día_buf, semana_buf, año0, año1, polilla0, polilla1, día0, día 1;

////////////////// /////////////// ///////////////////////////////

retraso nulo 1 milisegundo (tiempo de retraso entero sin signo)

{

while(delay_time>0)

{

for( I = 125;i>0;i-)

{;}

retraso_tiempo-;

}

}

////// /////

void delay1us (retraso de caracteres sin firmar

_time1)

{

mientras (retraso_tiempo 1!=0)

{

retraso_tiempo 1-; p>

}

}

///////////////////

nulo visualización (ninguno Carácter firmado lcm_adr, pestaña de carácter sin firmar 0 [sn0])

{

escribir _ lcm _ ins = lcm _ adr

retraso de 1 milisegundo ( 2) ;

Carácter sin firmar sn 1 = 16

sn0 = 0

mientras (sn 1 & gt; 0)

{

escribir _ LCM _ data = tab 0【sn0】;

sn+;

retraso 1 milisegundo (2); > sn 1-;

escribir _ LCM _ data = tab 0【sn0】;

sn+;

retraso 1 milisegundo (2);

sn 1-;

}

}

/////////////////// / //////////

pestaña de caracteres sin firmar 2【】= {'0','1','2','3','4','5', ' 6', '7', '8', '9'};

pestaña de caracteres sin firmar 3【】= {"Día uno, dos, tres, cuatro, cinco, seis"};

/ //////////////////

Visualización no válida (datos)

{

escribir _ LCM _ datos = pestaña 2【datos】;

retraso 1 milisegundo (2);

}

//////// /

void disp_week (semana de caracteres sin firmar)

{

wk = wk * 2;

escribir _ LCM _ data = tab 3 [semana];

retraso 1 milisegundo (2);

semana++;

escribir _ LCM _ datos = pestaña 3 [semana]; >

retraso 1 milisegundo(2);

}

//////////////////////// /////// ////////////

Configuración de hora no válida (año, mes, día, semana, hora, minuto, segundo)

{

temporizador _ año = año

temporizador _ polilla = polilla

temporizador _ día = día

temporizador _ semana = semana ;

temporizador _ hora = hora

temporizador _ min = min

temporizador _ seg = segundo

}

/// //////////////////////////////////////

void display_time (unsigned char time_adr)

{

sec _ buf = temporizador _ seg

min _ buf = temporizador _ min

hora _ buf = temporizador_ horas;

///////////////

seg 1 = seg _ buf/10;

seg 0 = seg _ buf-sec 1 * 10;

///

>min 1 = min_buf/10;

min 0 = min_buf-min 1 * 10

///

hora 1 = hora; _ buf/10;

hora 0 = hora _ buf-hora 1 * 10;

/////////////

escribir _ lcm _ ins = tiempo _ adr

retraso 1 milisegundo (2

disp (hora 1);

disp (hora 0);

escribir _ LCM _ data =':';

retraso 1 milisegundo (2

disp (min 1); >disp (min 0);

escribir _ LCM _ data =':';

retraso 1 milisegundo (2); ;

disp(seg 0);

}

///////////////////// /////////////////

void display_date(unsigned char date_adr)

{

año _ buf = temporizador_año

polilla_buf=temporizador_polilla

día_buf=temporizador_día

semana_buf=temporizador_semana

p>///////////////////////////////

año 1 = año _ buf/10;< / p>

año 0 = año _ buf-año 1 * 10

///

polilla 1 = polilla _ buf/10; polilla 0 = polilla _ buf-polilla 1 * 10;

///

día 1 = día _ buf/10

día 0 = día _ buf-día 1 * 10;

///

semana = semana _ buf

///

/// / //////////////////////////

escribir _ lcm _ ins = fecha _ adr

retraso 1 milisegundos (2);

escribir _ lcm _ ins = fecha _ adr

retraso 1 milisegundo (2); >

disp(0);

disp(año 1);

disp(año 0);

escribir _ LCM _ data ='- ';

retraso 1 milisegundo (2);

disp (polilla 1);

disp (polilla 0); _ LCM _ data ='-';

retraso 1 milisegundo (2);

disp (día 1);

disp (día 0); /p>

write_LCM_data ='-';

retraso 1 milisegundo (2);

write_LCM_data ='(';

p>

retraso 1 milisegundo (2);

disp_week (semana

escribir _ LCM _ dat);

a =')';

retraso 1 milisegundo (2);

}

/////////////// //////////////////

int main(void)

{

SP = 0x 0 fff

MCUCR = 0x80

EICRA = 0x00//Extensión extendida

EICRB = 0x00//Extensión extendida

EIMSK = 0x00

PORTA = 0xff

PORTB = 0XFF

PORTC = 0xff

PORTD = 0xff

PORTE = 0xff

PORTF = 0xff

PORTG = 0xff

DDRA = 0x ff;

DDRB = 0x ff;

DDRC = 0x y ff;

DDRD = 0x y ff;

DDRE = 0x y ff;

DDRF = 0x y ff;

DDRG = 0x ff;

PORTB = 0X7F

Retraso 1 milisegundo (500);

PORTB = 0XFF

PORTG = 0XFF

p>

MCUCR | = 0X80 //Habilitar ex_ram.

XM CRA = 0b 00001110;

XM CRB = 0b 1000000;

k = 2;

mientras(k!=0 )

{

PORTF = 0b 00011000;

Retraso 1 milisegundo (200);

PORTF = 0b 00100100;

Retraso 1 milisegundo (200);

PORTF = 0b 01000010;

Retraso 1 milisegundo (200);

PORTF = 0b 1000001;

Retraso 1 milisegundo (200);

PORTF = 0b 01000010;

Retraso 1 milisegundo (200);

PORTF = 0b 00100100 ;

Retraso 1ms (200);

k-;

}

ext_ram 2 = 0b 1010101010;

p>

Retraso 1 milisegundo (500);

PORTF = ext_ram2

Retraso 1 milisegundo (500);

PORTD = 0X00 p>

//////////////////////////////////

escribir _ LCM _ ins = 0x 01;

retraso 1 ms (5);

escritura _ lcm _ ins = 0x02

retraso 1 ms (5); >

write_lcm_ins = 0x06

retraso 1ms(5);

write_lcm_ins = 0x0C

retraso 1ms(5);

>

escribir _ LCM _ ins = 0x 1C;

retraso 1 ms (5);

escribir _ lcm _ ins = 0x30

retraso 1 ms (5);

escritura_lcm_ins=0x80

retraso 1ms (5);

escritura_lcm_ins=0x02

retraso 1ms (5);

escribir _ LCM _ datos = 'a';

retraso 1 ms (5

escribir _ LCM _ datos = 'b'; ;

retraso 1 ms (5);

escribir _ LCM _ data = 'c';

retraso 1 ms (5); >write_LCM_data ='d';

retraso 1ms (5);

write_LCM_data ='e';

retraso 1ms (5);

escribir _ LCM _ datos = 'f';

retraso 1 ms (5

escribir _ LCM _ datos = 'g'; retraso 1 ms (5);

escribir _ LCM _ datos = 'h';

retraso 1 ms (5);

escribir _ LCM _ datos =' I';

retraso 1ms (5);

escribir _ LCM _ data ='j';

retraso 1ms (5);

escribir _ LCM _ data ='k';

retraso

1 ms (5);

Pantalla (0x80, "Programa de calendario electrónico"

Pantalla (0x 90,

Pantalla); (0x 88, "-");

Pantalla (0x98, "");

/////////////////// // /////

temporizador _ ra = 0b 10100000

temporizador _ Rb = 0b 00000110

temporizador _ rc = 0b00000000

//tiempo_set (06, 01, 20, 5, 17, 40, seg

s = 4

mientras (1)

{

Mostrar fecha (0x 88);

display_time (0x9a);

mientras (s == 0)

{

s = 4;

PORTF = ~PORTF

}

PORTD = 0b 00100000;

retraso 1 milisegundo (2);

Porter y Phoenix.

= 0b 11011111;

s-;

}

}

Uno más

#i contiene & ltiom8v.h & gt

#i contiene & ltmacros.h & gt

#Definir el puerto pull-up del puerto de datos

#Definir la dirección del puerto de datos DDRD

#Definir PIND readlcdp

#Definir CtrlPortPullup puerto c

#Definir CtrlPortDirection DDRC

#Definir RS_Bit PC0

#Definir RW_Bit PC1

#Definir E_Bit PC2

#Incluir "LCD1620.h"

#Definir ClkTcnt2 0x80

/* * * * * * * * * *Declaración de variable* * * * * * * * * * * *

Entero sin signo año = 2008 //Variable de año

Ninguno firmado mes de char = 6; //variable mensual

día de char sin firmar = 1;

hora de char sin firmar = 12 //horas

min de char sin firmar; = 0; //minutos

Segundos de caracteres sin firmar = 0; //segundos

Caracteres sin firmar YearBit1, YearBit2, YearBit3, YearBit4

Caracteres sin firmar MonthBit1, MonthBit2

Caracteres sin firmar DayBit1, DayBit2

Caracteres sin firmar HourBit1, HourBit2

Caracteres sin firmar MinBit1, MinBit2

Caracteres sin firmar SecBit1, SecBit2

Semana de caracteres sin firmar【】【4】=

{"Lunes", "Martes", "Miércoles", "Jueves" ","Viernes","Sábado","Domingo" };

símbolo de cambio de carácter sin firmar【】【5】= {"-Yar","-Mth","-Day","- Hor", "-Min"};

unsigned char LeapYearWeekTable【】= {3, 6, 0, 3, 5, 1, 3, 6, 2, 4, 0, 2} // tabla de desviación de la semana del año bisiesto

unsigned; char UnLeapWeekTable【】= {4, 0, 0, 3, 5, 1, 3, 6, 2, 4, 0, 2};

Carácter sin firmar hoy semana = 0;

Carácter sin signo LeapYearBit = 0; cuando // es 0, el año es el promedio.

datos lunares de caracteres sin firmar【】= { 0, 0, 0 }

Caracteres sin firmar LunarYear1, LunarYear2, LunarYear3, LunarYear4, LunarMonth1, LunarMonth2, LunarDay1, LunarDay2

;

Carácter sin firmar LunarConvertBit//0, la conversión del calendario lunar se realizó correctamente.

Carácter sin firmar CalendarStopBit//1, el reloj se detiene

Carácter sin firmar OldKeyNum = 0

Carácter sin firmar NewKeyNum = 0

Sin firmar; selección de modo de carácter = 0;

Carácter sin firmar ChangeModeBit = 0; //ModeSelect! = 0, que es 1, la bandera ahora está en un estado de cambio de tiempo.

Unsigned char SecOddBit = 0; // Los segundos son pares, esto es 0, de lo contrario es 1.

Código lunar constante de carácter estático sin firmar 1[9]=

{0x0, 0x1f, 0x3b, 0x5a, 0x78, 0x97, 0xb5, 0xd4, 0x F3};

Código de día lunar constante entero corto sin signo estático 2【3】= {0x 111, 0x130, 0x 14e};

/************** *** ********

* * * * * * * * *Subfunciones* * * * * * * *

***** ** **********************/

void port init (void) //Inicialización del puerto

{

DDRC&=~((1<<PC3)|(1<<PC4)|(1<<PC5);

PORTC|=(1< lt; & ltPC3) | (1 & lt; & ltPC4) | (1 & lt; & ltPC5);

}

Inicio del temporizador 2 (void) // Inicialización del dispositivo de sincronización 2

{

TCCR2 = 0x00//Detener

ASSR = 0x08//Establecer modo asíncrono

TCNT2 = ClkTcnt2/ /Configuración

TCCR2 = 0x06 //Inicio

}

Void Timer 2 OVF (void) //Función de interrupción del temporizador 2

{

TCNT2 = ClkTcnt2//Recargar valor del contador

seg+= 1;

AskLeapYear();

recuento solar ();

AskLeapYear () ;

contar semana ();

recuento lunar (); // Primero determine si la conversión shi es exitosa y luego calcule y muestre

si ( selección de modo == 0)

{

LCDispClear();

disp update();

}

}

void AskLeapYear(void)

{

if ((Año % 4 = = 0)&&(Año % 100! = 0 )) | Año % 400 = = 0) // Determina si la piedra es un año bisiesto.

{

Año bisiesto = 1;

}

Otro

{

LeapYearBit = 0;

}

}

recuento solar vacío (void) // Calcula el valor de visualización de cada bit.

{

si (Seg>59)

{

seg = 0;

min++ ;

}

si (Min > 59)

{

min = 0;

hora++;

}

si (hora & gt23)

{

hora = 0;

día++ ;

}

if (((mes== 1)| |(mes== 3)| |(mes== 5)| |(mes== 7)| |( mes== 8)|(mes== 10)| +;

día = 1;

}

si no ((Mes == 4) | (Mes == 6) | (Mes = = 9) | (Mes = = 11) & & (Día & gt30) )

{

Mes++;

día = 1;

}

si no(Mes == 2)

{

Si( LeapYearBit == 1)//si es un año bisiesto

{

if (Día>29)

{

Mes++ ;

día = 1;

}

}

else if (Día > 28) //Año normal

{

mes++;

día = 1;

}

}

si (mes>12)

{

Mes = 1

Año++; bit de valor.

Bit de año 1 = Año/1000;

Bit de año 2 = Año % 1000/100;

Bit de año 3 = Año % 100/10;

Año bit 4 = Año % 10;

MesBit1 = Mes/10;

Mes bit 2 = Mes % 10; bit 1 = Día/10;

Día bit 2 = Día % 10;

HoraBit1 =Hora/10;

horabit 2 = Hora % 10;

minbit 1 = Mín/10;

Min bit 2 = Mín % 10;

Seg bit 1 = Seg/10;

Segundo bit 2 = Segundo % 10;

}

inicio de dispositivo vacío (void) //Inicialización de MCU

{

CLI (

PortInit();

temporizador 2 init();

MCUCR = 0x00

GICR = 0x 00;

p>

p>

TIMSK = 0x40

LCD _ Init()

SEI()

}

<; p>//Actualizar pantalla

Actualización de pantalla no válida (no válida)

{

if ((sec bit 2 > = 5) | | (selección de modo ! = 0) ) //Cuando el último dígito sea mayor que 5, se mostrará el calendario gregoriano.

{

putstringcd(0, 0, "Solar");

PutNumberLCD (0, 6, año bit 1

PutNumberLCD (0, 7, año bit 2);

PutNumberLCD (0, 8, año bit 3);

PutNumberLCD (0, 9, año bit 4);

p>

PutNumberLCD (0, 11, mesbit 1);

PutNumberLCD (0, 12, mes bit 2);

PutNumberLCD (0, 14); , bit de día 1) ;

PutNumberLCD (0, 15, bit de día 2);

}

else if (lunarconvertbit == 1) // segundos cuando el último dígito sea inferior a 5 y la conversión del calendario lunar sea exitosa, se mostrará el calendario lunar.

{

putstringcd(0, 0, "Lunar");

PutNumberLCD (0, 6, año lunar 1); >PutNumberLCD (0, 7, año lunar 2);

PutNumberLCD (0, 8, año lunar 3);

PutNumberLCD (0, 9, año lunar 4); p>

p>

PutNumberLCD (0, 11, mes lunar 1);

PutNumberLCD (0, 12, mes lunar 2); día lunar 1);

PutNumberLCD (0, 15, día lunar 2

}

Otros

{

putstringcd (0, 0, "¡Fuera de rango!");

}

PutNumberLCD (1, 0, bit de hora 1); PutNumberLCD (1, 1, bit hora 2);

if (SecOddBit)

{

PutOneCharLCD(1, 2":");

}

PutNumberLCD (1, 3, minbit 1);

PutNumberLCD (1, 4, minbit 2

si (SecOddBit)

{

PutOneCharLCD (1, 5, ":");

}

PutNumberLCD (1, 6, segundo bit 1)

PutNumberLCD (1, 7, segundo bit 2

putstringcd (1, 9, Semana [hoy Semana]); amp; & ampSecOddBit)

{

putstringcd (1, 12, cambiar símbolo [selección de modo-1]); >}

semana de recuento de nulos (nulo)

{

if (LeapYearBit == 1)

{

hoy semana = ( (Año/100% 4 * 5) + (Año % 100/4 * 5) + (Año % 4) + 1 + Día + LeapYearWeekTable [Mes-1]) % 7;

}

Otro

{

hoy semana = ((Año/100% 4 * 5) + (Año % 100/4 * 5) + (Año % 4) +1+Día+unleapwektable【Mes-1】)% 7;

}

}

Escaneo de clave vacía (vacío)

{ if ((PINC & amp; (1 & lt; & ltPC5) == 0)

{

OldKeyNum = 1;

}

si no ((PINC&(1<<PC4))==0)

{

OldKeyNum = 2;

}

si no ((PINC&(1<<PC3)===0)

{

OldKeyNum = 3;

}

if((PINC&(1<<PC5)&amp(PINC&amp(1<<PC4)&.&(PINC&() 1 & lt; & lt) // Determinar si hay una tecla presionada por una piedra

{

NewKeyNum = OldKeyNum

OldKeyNum = 0

{ p>

}

}

Cambio de hora no válido (no válido)

{

Cambiar (selección de modo)

{

Caso 0:

{

if (NewKeyNum == 2)

{

ModeSelect+= 1;

}

}Roto;

Caso 1://Cambiar variable anual

{

Cambiar (NewKeyNum)

{

Caso 1: año -; descanso;

Caso 2: selección de modo++;

Caso tres: año++; break;

Valor predeterminado: break

}

}break;

Caso 2 ://Cambiar variable de mes

{

Cambiar (NewKeyNum)

{

Caso 1: Mes-;Descanso;

p>

Caso 2: mode select++; break;

Caso 3: mes++; break

Valor predeterminado: break

}

}Roto;

Caso 3://Cambiar variable diaria

{

Cambiar (NewKeyNum)

{

Caso 1: día-; descanso;

Caso 2: modo select++; descanso

Caso 3: descanso

Valor predeterminado: descanso

}

}descanso;

Caso 4://Cambiar variable de hora

{

Cambiar (NewKeyNum)

{

Caso 1: Hora-;Pausa;

Caso 2: selección de modo++;Pausa;

Caso tres: hora++; /p>

Valor predeterminado: break

}

}break;

Caso cinco:

{

Interruptor (NewKeyNum)

{

Caso 1: Min-; roto;

Caso 2: selección de modo = 0; >

Caso 3: min++; break;

Valor predeterminado: break

}

}Break;

Valor predeterminado: descanso

}

}

/************ ***********

* * * * * * * *Funciones principales* * * * * * * *

******* ************* ***/

void main()

{

init del dispositivo();

p>

SEI() ;

for(;;)

{

si (selección de modo! = 0) // Determina si la piedra se encuentra ahora en el estado de cambio de hora y fecha.

{

ChangeModeBit = 1;

}

Otro

{

cambiar modo bit = 0;

}

If (sec bit 2% 2 = = 0) //Si el último bit del segundo bit es un número par, entonces SecSymbol= 0.

{

SecOddBit = 0

}

Otro

{

SecOddBit = 1;

}

escaneo de clave();

cambio de hora();

if(cambiar bit de modo = = 1)

{

CLI();

disp actualización();

SEI(); >}

}

}