// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

ISR (TIMER0_OVF_vect){
    if ((PINB&0x01)==0x00){
        //    PB0 
        pause(1000); //  0.01
        if ((PINB&0x01)==0x00){ //   
            while ((PINB&0x01)==0x00); //  
            if (status==0) //  
                status=1; // 
            else status=0; //    = 0				   
        }
    }
    TCNT0=0x00; //   0 
    TIFR=0x00; //  
    return;
}

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;




















/*****************************************************
Chip type               : ATmega16
Program type            : Application
AVR Core Clock frequency: 12,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*****************************************************/

#include <mega16.h>
#include <alcd.h>
#include <delay.h>
#include <stdio.h>

#define   BUT_LEFT  button==3
#define   BUT_RIGHT button==4
#define   BUT_UP    button==1
#define   BUT_DOWN  button==2

unsigned char menu =10; /* :
>time
 date
*/
unsigned char galka = 1; 
/*
1 -   time
2 -   date
*/
char button;
char sek=0, min=0, hour=0;
bit action = 1; //  . ,   .
bit flagsek =0, flagden=1; //  ,  :)
flash const unsigned char dnei_v_mesc []= {31,29,31,30,31,30,31,31,30,31,30,31};//     
char chislo=1, mesec=3, god=12;
unsigned char position =0;//    .
	
	/*  */
    unsigned char ButtonRead(void){
	    button = 0;
		/* .        ( ).*/
        if(PINB.0==0) {while(PINB.0==0); button = 1;} //
        if(PINB.3==0) {while(PINB.3==0); button = 2;} //
        if(PINB.1==0) {while(PINB.1==0); button = 3;} //
        if(PINB.2==0) {while(PINB.2==0); button = 4;} //
        return button;
    }
	/*   */
	void PositionKursor(void){
	    if(position==1 || position==4) position +=2;
		    else 
			    if(position==7) position=0;
				else position++;
		lcd_gotoxy(position,0);
	}
	/*.    2 , */
    void PrintLcd(unsigned char column, unsigned char line, char *str){
	    lcd_gotoxy(column,line); 
		lcd_puts(str);
	}
	/*   2. .*/
	interrupt [TIM2_OVF] void timer2_ovf_isr(void){
	    flagsek=1;
		sek++;
        if(sek==60){
		    sek=0;
			min++;
			if(min==60){
			    min=0;
				hour++;
				if(hour==24){
				    hour=0;
					chislo++;
					flagden=1;
					if (chislo > dnei_v_mesc[mesec-1]){
					    chislo=1; 
						mesec++;
						if (mesec==13){mesec=1; god++;}
                    }
                    if ( (god%4) && (mesec==2) && (chislo==29) )  {mesec=3; chislo=1;}      //   ,  29.02>>>>>01.03
				}
			}
		}
    }
	/******************* **************
	/*PlusMinus - 1  , 0 */
	void EditTime(unsigned char PlusMinus){ 
	    /*switch(position){ //  ?
			case 0:// 
							ten=hour/10; // 
							hour=hour%10;// 
							if(ten==2) break;
							ten++;
							ten *=10;
							hour=ten+hour;
                        break;
                        case 1://  
						    if(hour>=23){hour=0;break;}
						    ten=hour/10; // 
							hour=hour%10;// 
							hour++;
							ten *=10;
							hour=ten+hour;
                        break;
                        case 3:// 
						    ten=min/10; // 
							min=min%10;// 
							if(ten==5) break;
							ten++;
							ten *=10;
							min=ten+min;
                        break;
                        case 4:// 
						    if(min>=59){min=0;break;}
						    ten=min/10; // 
							min=min%10;// 
							min++;
							ten *=10;
							min=ten+min;
                        break;
                        case 6:
						    ten=sek/10; // 
							sek=sek%10;// 
							if(ten==5) break;
							ten++;
							ten *=10;
							sek=ten+sek;
                        break;
                        case 7:
						    if(sek>=59){sek=0;break;}
						    ten=sek/10; // 
							sek=sek%10;// 
							sek++;
							ten *=10;
							sek=ten+sek;
                        break;		
					}
					*/
	}
	
void main(void) {
char buffer [64]; /*   */
unsigned char ten;// 

PORTA=0x00; DDRA=0x00;
PORTB=0b00001111; //    4 .
DDRB=0x00;
PORTC=0x00; DDRC=0x01; //   .  
PORTD=0x00; DDRD=0x00;

ASSR=0x08;            //    TOSC1,2    32768
TCCR2=0x05;           // 32768/128=256 
TIMSK=0x41;           //  .
TCNT2=0x00;           //    0,    . )

#asm("sei")

lcd_init(16); 
//_lcd_write_data (0x0F); 
    while (1){ //  :)
        ButtonRead(); 
    	switch(menu){
		    case 10:{ // 
		        if(BUT_UP){ // .  .
				    lcd_clear();
				    galka = 1;
					action =1;
				}
	            if(BUT_DOWN){ // .  .
				    lcd_clear();
					galka = 2;
					action =1;
				}
				if(BUT_RIGHT){ // .     .
				    if(galka==1){menu=20;lcd_clear();break;} //   >time.    
					if(galka==2){menu=30;lcd_clear();break;} //   >date.   
				}
				if(galka==1 && action){ 
				    PrintLcd(0,0,">time"); PrintLcd(1,1,"date");
				    action=0; //    .
				}
				if(galka==2 && action){ 
				    PrintLcd(1,0,"time"); PrintLcd(0,1,">date");
				    action=0;//    .
				}
			}
		    break;
			case 20:{ // "time". .
			    if(flagsek){ //     
				    sprintf(buffer, "%02d:%02d:%02d",hour,min,sek);
		            PrintLcd(0,0,buffer);
					flagsek =0;
                }
				if(BUT_LEFT) {menu=10;lcd_clear();action=1;} // .  ..
				if(BUT_RIGHT){ //    .
				    menu = 21;
					#asm("cli")//. . .(  - TIMSK    :))
				    lcd_gotoxy(0,0);//  
					_lcd_write_data (0x0E);//   
				}
			}
			break;
			case 21:{// "time".  .
			    if(BUT_RIGHT) PositionKursor();//    ->->->->->..
				if(BUT_LEFT){ //   .
				    #asm("sei") // 
					menu =20;
					lcd_clear();
					position=0;//  .    .
				}
				if(BUT_UP){ // .
				    switch(position){ //  ?
					    case 0:// 
							ten=hour/10; // 
							hour=hour%10;// 
							if(ten==2) break;
							ten++;
							ten *=10;
							hour=ten+hour;
                        break;
                        case 1://  
						    if(hour>=23){hour=0;break;}
						    ten=hour/10; // 
							hour=hour%10;// 
							hour++;
							ten *=10;
							hour=ten+hour;
                        break;
                        case 3:// 
						    ten=min/10; // 
							min=min%10;// 
							if(ten==5) break;
							ten++;
							ten *=10;
							min=ten+min;
                        break;
                        case 4:// 
						    if(min>=59){min=0;break;}
						    ten=min/10; // 
							min=min%10;// 
							min++;
							ten *=10;
							min=ten+min;
                        break;
                        case 6:
						    ten=sek/10; // 
							sek=sek%10;// 
							if(ten==5) break;
							ten++;
							ten *=10;
							sek=ten+sek;
                        break;
                        case 7:
						    if(sek>=59){sek=0;break;}
						    ten=sek/10; // 
							sek=sek%10;// 
							sek++;
							ten *=10;
							sek=ten+sek;
                        break;		
					}
					sprintf(buffer, "%02d:%02d:%02d",hour,min,sek);
		            PrintLcd(0,0,buffer);
					lcd_gotoxy(position,0);//  .  puts . .
				}
				if(BUT_DOWN){ // 
				    switch(position){ //  ?
					    case 0:// 
							ten=hour/10; // 
							hour=hour%10;// 
							if(ten==0) break;
							ten--;
							ten *=10;
							hour=ten+hour;
                        break;
                        case 1://  
						    if(hour==0){hour=0;break;}
						    ten=hour/10; // 
							hour=hour%10;// 
							hour--;
							ten *=10;
							hour=ten+hour;
                        break;
                        case 3:// 
						    ten=min/10; // 
							min=min%10;// 
							if(ten==0) break;
							ten--;
							ten *=10;
							min=ten+min;
                        break;
                        case 4:// 
						    if(min==0){min=0;break;}
						    ten=min/10; // 
							min=min%10;// 
							min--;
							ten *=10;
							min=ten+min;
                        break;
                        case 6:
						    ten=sek/10; // 
							sek=sek%10;// 
							if(ten==0) break;
							ten--;
							ten *=10;
							sek=ten+sek;
                        break;
                        case 7:
						    if(sek==0){sek=0;break;}
						    ten=sek/10; // 
							sek=sek%10;// 
							sek--;
							ten *=10;
							sek=ten+sek;
                        break;		
					}
					sprintf(buffer, "%02d:%02d:%02d",hour,min,sek);
		            PrintLcd(0,0,buffer);
					lcd_gotoxy(position,0);//  .  puts . .
				}
			}
			break;
			case 30:{// "date". .
			    if(flagden){ //     ,  .
				    sprintf(buffer, "%02d.%02d.%02d",chislo,mesec,god);
		            PrintLcd(0,0,buffer);
					flagden =0;
                }
				if(BUT_LEFT) {menu=10;lcd_clear();action=1;flagden=1;} // .  ..
				if(BUT_RIGHT){ //    .
				    menu = 31;
					#asm("cli")//. . .(  - TIMSK    :))
				    lcd_gotoxy(0,0);//  
					_lcd_write_data (0x0E);//   
				}
			}
			break;
			case 31:{// "date".  .
			    if(BUT_RIGHT) PositionKursor();//    ->->->->->..
				if(BUT_LEFT){ //   date.
				    #asm("sei") // 
					menu =30;
					lcd_clear();
					position=0;//  .    .
					flagden=1;//  
				}
			}
			break;
		}
    }
}

66666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666

/*****************************************************
Chip type               : ATmega16
Program type            : Application
AVR Core Clock frequency: 12,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*****************************************************/

#include <mega16.h>
#include <alcd.h>
#include <delay.h>
#include <stdio.h>

#define   BUT_LEFT  button==3
#define   BUT_RIGHT button==4
#define   BUT_UP    button==1
#define   BUT_DOWN  button==2

unsigned char menu =10; /* :
>time
 date
*/
unsigned char galka = 1; 
/*
1 -   time
2 -   date
*/
char button;
char sek=0, min=0, hour=0;
bit action = 1; //  . ,   .
bit flagsek =0, flagden=1; //  ,  :)
flash const unsigned char dnei_v_mesc []= {31,29,31,30,31,30,31,31,30,31,30,31};//     
char chislo=1, mesec=3, god=12;
unsigned char position =0;//    .

	/*  */
    unsigned char ButtonRead(void){
	    button = 0;
		/* .        ( ).*/
        if(PINB.0==0) {while(PINB.0==0); button = 1;} //
        if(PINB.3==0) {while(PINB.3==0); button = 2;} //
        if(PINB.1==0) {while(PINB.1==0); button = 3;} //
        if(PINB.2==0) {while(PINB.2==0); button = 4;} //
        return button;
    }
	/*   */
	void PositionKursor(void){
	    if(position==1 || position==4) position +=2;
		    else 
			    if(position==7) position=0;
				else position++;
		lcd_gotoxy(position,0);
	}
	/*.    2 , */
    void PrintLcd(unsigned char column, unsigned char line, char *str){
	    lcd_gotoxy(column,line); 
		lcd_puts(str);
	}
	/*   2. .*/
	interrupt [TIM2_OVF] void timer2_ovf_isr(void){
	    flagsek=1;
		sek++;
        if(sek==60){
		    sek=0;
			min++;
			if(min==60){
			    min=0;
				hour++;
				if(hour==24){
				    hour=0;
					chislo++;
					flagden=1;
					if (chislo > dnei_v_mesc[mesec-1]){
					    chislo=1; 
						mesec++;
						if (mesec==13){mesec=1; god++;}
                    }
                    if ( (god%4) && (mesec==2) && (chislo==29) )  {mesec=3; chislo=1;}      //   ,  29.02>>>>>01.03
				}
			}
		}
    }
	/*   */
	void Explode(char *p, unsigned char PlusMinus, unsigned char eddes, unsigned char uslovie){
	    if() 
		unsigned char ten;// 
		if(eddes) if(*p==uslovie){*p=0;return;}
		ten=*p/10; //
	    *p=*p%10;//
		if(!eddes) if(ten==uslovie) return;
		if(PlusMinus)ten++; else ten--;  
		ten *=10;
		*p=ten+*p;
	}
	/******************* **************
	/*PlusMinus - 1  /, 0 */
	/*TimeDate - 1 , 0 */
	void EditTime(unsigned char PlusMinus, unsigned char TimeDate){ 
		char *phour = &hour;char *psek = &sek;char *pmin = &min;
		switch(position){ //  ?
			case 0:// 
		        Explode(phour, 1, 0, 2); 
			break;
            case 1://  
			    Explode(phour, 1, 1, 23); 
			break;
            case 3:// 
			    Explode(pmin, 1, 0, 5); 
			break;
			case 4:// 
			    Explode(pmin, 1, 1, 59); 
			break;
            case 6: // 
			    Explode(psek, 1, 0, 5);
			break;
            case 7://  
			    Explode(psek, 1, 1, 59); 
			break;
        }			
	}
	
void main(void) {
char buffer [64]; /*   */
unsigned char ten;// 


PORTA=0x00; DDRA=0x00;
PORTB=0b00001111; //    4 .
DDRB=0x00;
PORTC=0x00; DDRC=0x01; //   .  
PORTD=0x00; DDRD=0x00;

ASSR=0x08;            //    TOSC1,2    32768
TCCR2=0x05;           // 32768/128=256 
TIMSK=0x41;           //  .
TCNT2=0x00;           //    0,    . )

#asm("sei")

lcd_init(16);
 
//_lcd_write_data (0x0F); 
    while (1){ //  :)
        ButtonRead(); 
    	switch(menu){
		    case 10:{ // 
		        if(BUT_UP){ // .  .
				    lcd_clear();
				    galka = 1;
					action =1;
				}
	            if(BUT_DOWN){ // .  .
				    lcd_clear();
					galka = 2;
					action =1;
				}
				if(BUT_RIGHT){ // .     .
				    if(galka==1){menu=20;lcd_clear();break;} //   >time.    
					if(galka==2){menu=30;lcd_clear();break;} //   >date.   
				}
				if(galka==1 && action){ 
				    PrintLcd(0,0,">time"); PrintLcd(1,1,"date");
				    action=0; //    .
				}
				if(galka==2 && action){ 
				    PrintLcd(1,0,"time"); PrintLcd(0,1,">date");
				    action=0;//    .
				}
			}
		    break;
			case 20:{ // "time". .
			    if(flagsek){ //     
				    sprintf(buffer, "%02d:%02d:%02d",hour,min,sek);
		            PrintLcd(0,0,buffer);
					flagsek =0;
                }
				if(BUT_LEFT) {menu=10;lcd_clear();action=1;} // .  ..
				if(BUT_RIGHT){ //    .
				    menu = 21;
					#asm("cli")//. . .(  - TIMSK    :))
				    lcd_gotoxy(0,0);//  
					_lcd_write_data (0x0E);//   
				}
			}
			break;
			case 21:{// "time".  .
			    if(BUT_RIGHT) PositionKursor();//    ->->->->->..
				if(BUT_LEFT){ //   .
				    #asm("sei") // 
					menu =20;
					lcd_clear();
					position=0;//  .    .
				}
				if(BUT_UP){ // .
				    EditTime(1,1);
					sprintf(buffer, "%02d:%02d:%02d",hour,min,sek);
		            PrintLcd(0,0,buffer);
					lcd_gotoxy(position,0);//  .  puts . .
				}
				if(BUT_DOWN){ // 
				    switch(position){ //  ?
					    case 0:// 
							ten=hour/10; // 
							hour=hour%10;// 
							if(ten==0) break;
							ten--;
							ten *=10;
							hour=ten+hour;
                        break;
                        case 1://  
						    if(hour==0){hour=0;break;}
						    ten=hour/10; // 
							hour=hour%10;// 
							hour--;
							ten *=10;
							hour=ten+hour;
                        break;
                        case 3:// 
						    ten=min/10; // 
							min=min%10;// 
							if(ten==0) break;
							ten--;
							ten *=10;
							min=ten+min;
                        break;
                        case 4:// 
						    if(min==0){min=0;break;}
						    ten=min/10; // 
							min=min%10;// 
							min--;
							ten *=10;
							min=ten+min;
                        break;
                        case 6:
						    ten=sek/10; // 
							sek=sek%10;// 
							if(ten==0) break;
							ten--;
							ten *=10;
							sek=ten+sek;
                        break;
                        case 7:
						    if(sek==0){sek=0;break;}
						    ten=sek/10; // 
							sek=sek%10;// 
							sek--;
							ten *=10;
							sek=ten+sek;
                        break;		
					}
					sprintf(buffer, "%02d:%02d:%02d",hour,min,sek);
		            PrintLcd(0,0,buffer);
					lcd_gotoxy(position,0);//  .  puts . .
				}
			}
			break;
			case 30:{// "date". .
			    if(flagden){ //     ,  .
				    sprintf(buffer, "%02d.%02d.%02d",chislo,mesec,god);
		            PrintLcd(0,0,buffer);
					flagden =0;
                }
				if(BUT_LEFT) {menu=10;lcd_clear();action=1;flagden=1;} // .  ..
				if(BUT_RIGHT){ //    .
				    menu = 31;
					#asm("cli")//. . .(  - TIMSK    :))
				    lcd_gotoxy(0,0);//  
					_lcd_write_data (0x0E);//   
				}
			}
			break;
			case 31:{// "date".  .
			    if(BUT_RIGHT) PositionKursor();//    ->->->->->..
				if(BUT_LEFT){ //   date.
				    #asm("sei") // 
					menu =30;
					lcd_clear();
					position=0;//  .    .
					flagden=1;//  
				}
			}
			break;
		}
    }
}
