Escribir un calendario perpetuo simple en C++
# 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> 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"}; p>
/ //////////////////
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> 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 p>
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
{ p>
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 p>
{
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 pantallaActualizació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>
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":");
} p>
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;
} p>
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;
} p>
si no ((PINC&(1<<PC4))==0)
{
OldKeyNum = 2;
}
si no ((PINC&(1<<PC3)===0)
{
OldKeyNum = 3;
}
if((PINC&(1<<PC5)&(PINC&(1<<PC4)&.&(PINC&() 1 & lt; & lt) // Determinar si hay una tecla presionada por una piedra
{
NewKeyNum = OldKeyNum
OldKeyNum = 0
{ p>
}; p>
}
Cambio de hora no válido (no válido)
{
Cambiar (selección de modo)
{
Caso 0:
{
if (NewKeyNum == 2)
{
ModeSelect+= 1; p>
}
}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
} p>
}Roto; p>
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
}
}
/************ *********** p>
* * * * * * * *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(); >}
}
}