
#include "LCD_4bit.c"

#define menu PORTB.F4
#define set PORTB.F5

unsigned char B_seconds=0,B_minutes=0,B_hours=12,Count_menu,Reg_h_M,Reg_h_L;
unsigned char Reg_min_M,Reg_min_L,Reg_sec_M,Reg_sec_L,Update_Time=1,reg;
unsigned char Reg_C0,Reg_C1,Reg_C2,Reg_C3,Pos_0,Pos_1,Shift;
unsigned int Reg_C = 3000;

/* ************************************************************************** */
void Convert_Time()
                     {
                     Reg_h_M = B_hours / 10 + 48;
                     Reg_h_L = B_hours % 10 + 48;
                     Reg_min_M = B_minutes / 10 + 48;
                     Reg_min_L = B_minutes % 10 + 48;
                     Reg_sec_M = B_seconds / 10 + 48;
                     Reg_sec_L = B_seconds % 10 + 48;
                     }
/* ************************************************************************** */
void Convert_RT() {
                  B_hours = (Reg_h_M - 48) * 10;
                  B_hours = B_hours + (Reg_h_L - 48);
                  B_minutes = (Reg_min_M - 48) * 10;
                  B_minutes = B_minutes + (Reg_min_L - 48);
                  B_seconds = (Reg_sec_M - 48) * 10;
                  B_seconds = B_seconds + (Reg_sec_L - 48);
                  }
/* ************************************************************************** */
void Convert_RC() {
                  Reg_C = (Reg_C3 - 48) * 1000;
                  Reg_C = Reg_C + ((Reg_C2 - 48) * 100);
                  Reg_C = Reg_C + ((Reg_C1 - 48) * 10);
                  Reg_C = Reg_C + (Reg_C0 - 48);
                  }
/* ************************************************************************** */
void Convert_counter() {
                       Reg_C3 = Reg_C / 1000 + 48;
                       Reg_C2 = (Reg_C / 100) % 10 + 48;
                       Reg_C1 = (Reg_C / 10) % 10 + 48;
                       Reg_C0 = Reg_C % 10 + 48;
                       }
/* ************************************************************************** */
void Display_data(unsigned char row,unsigned char pos) {
                    LCD_goto(row,pos);
                    LCD_write(chr,Reg_h_M);
                    LCD_write(chr,Reg_h_L);
                    LCD_write(chr,':');
                    LCD_write(chr,Reg_min_M);
                    LCD_write(chr,Reg_min_L);
                    LCD_write(chr,':');
                    LCD_write(chr,Reg_sec_M);
                    LCD_write(chr,Reg_sec_L);
                    }
/* ************************************************************************** */
void Display_counter(unsigned char row,unsigned char pos)
                       {
                       LCD_goto(row,pos);
                       LCD_write(chr,Reg_C3);
                       LCD_write(chr,Reg_C2);
                       LCD_write(chr,Reg_C1);
                       LCD_write(chr,Reg_C0);
                       }
/* ************************************************************************** */
char Inc_reg(unsigned char reg) {
                                   if(reg<57) {
                                              reg++;
                                              }
                                              else {
                                                   reg = 48;
                                                   }
                                   return(reg);
                                   }
/* ************************************************************************** */
void Swich_0() {
               switch(Pos_0) {
                                case 2 : Reg_h_M = Inc_reg(Reg_h_M); break;
                                case 3 : Reg_h_L = Inc_reg(Reg_h_L); break;
                                case 5 : Reg_min_M = Inc_reg(Reg_min_M); break;
                                case 6 : Reg_min_L = Inc_reg(Reg_min_L); break;
                                case 8 : Reg_sec_M = Inc_reg(Reg_sec_M); break;
                                case 9 : Reg_sec_L = Inc_reg(Reg_sec_L); break;
                                case 11 : Convert_RT();
                                          Pos_0++;
                                          ; break;
                                default : LCD_send(0,2," No Set ");
                             }
               }
/* ************************************************************************** */
void Swich_1() {
               switch(Pos_1) {
                                case 8 : Reg_C3 = Inc_reg(Reg_C3); break;
                                case 9 : Reg_C2 = Inc_reg(Reg_C2); break;
                                case 10 : Reg_C1 = Inc_reg(Reg_C1); break;
                                case 11 : Reg_C0 = Inc_reg(Reg_C0); break;
                                case 14 : Convert_RC();
                                          Pos_1++;
                                          ; break;
                                //default : LCD_send(0,0,"     No Set     ");
                             }
               }
/* ************************************************************************** */
void Set_clock() {
                 DISP_CLR();
                 Display_data(0,2);
                 LCD_send(1,1,"Set Clock Menu");
                 LCD_send(0,11,"Ok?");
                 LCD_goto(0,2);
                 Pos_0 = 2;
                 do {
                    if(menu==0) {
                                Pos_0++;
                                LCD_goto(0,Pos_0);
                                }
                    if(set==0) {
                               Swich_0();
                               }
                    Delay_ms(500);
                    Display_data(0,2);
                    LCD_goto(0,Pos_0);
                    }while(Pos_0<12);
                 }
/* ************************************************************************** */
void Set_Alarm() {
                 DISP_CLR();
                 LCD_send(0,6,"Ok");
                 do {
                      Delay_ms(100);
                      }while(set==1);
                 }
/* ************************************************************************** */
void Set_Counter() {
                   DISP_CLR();
                   LCD_send(0,0,"Counter=    m Ok");
                   Convert_counter();
                   Display_counter(0,8);
                   LCD_send(1,3,"Set Counter");
                   LCD_goto(0,8);
                   Pos_1 = 8;
                 do {
                    if(menu==0) {
                                Pos_1++;
                                LCD_goto(0,Pos_1);
                                }
                    if(set==0) {
                               Swich_1();
                               }
                    Delay_ms(500);
                    Display_counter(0,8);
                    LCD_goto(0,Pos_1);
                    }while(Pos_1<15);
                   }
/* ************************************************************************** */
void Production_data() {
                       DISP_CLR();
                       LCD_send(0,0,"Production(Km):");
                       LCD_send(1,0,"S1=65.5  S2=28.9");
                       do {
                          Delay_ms(100);
                          }while(set==1);
                       }
/* ************************************************************************** */
void Menu_1() {
              DISP_CLR();
              LCD_send(0,0,"1.Clock");
              LCD_send(1,0,"2.Alarm");
              LCD_send(0,8,"3.Count.");
              LCD_send(1,8,"4.Prod.");
              Delay_ms(150);
              Count_menu = 0;
              LCD_goto(0,0);
              LCD_write(cmd,0x0F); /* Cursor on , blink on */
                 do {
                    if(menu==0) {
                                if(Count_menu<3) {
                                                 Count_menu++;
                                                 }
                                else {
                                     Count_menu = 0;
                                     }
                                switch(Count_menu) {
                                                   case 0 : LCD_goto(0,0); break;
                                                   case 1 : LCD_goto(1,0); break;
                                                   case 2 : LCD_goto(0,8); break;
                                                   case 3 : LCD_goto(1,8); break;
                                                   }
                                Delay_ms(500);
                                }
                    }while(set==1);
                    Delay_ms(500);
                    switch(Count_menu) {
                                       case 0 : Set_clock(); break;
                                       case 1 : Set_Alarm(); break;
                                       case 2 : Set_Counter(); break;
                                       case 3 : Production_data(); break;
                                       }
                 Delay_ms(500);
                 DISP_CLR();
              }
/* ************************************************************************** */
void Scan_menu() {
                 if(menu==0) {
                             Menu_1();
                             }
                 }
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
void interrupt() {
                 if(INTCON.T0IF==1) {
                                    TMR0 = 255;
                                    Reg_C--;
                                    INTCON.T0IF==0;
                                    }
                 if(PIR1.TMR1IF==1)
                 {
                 TMR1H = 0x80;
                 TMR1L = TMR1L + 2;
if(B_seconds<59) {
                 B_seconds++;
                 }
                 else {
                      B_seconds = 0;
                      if(B_minutes<59) {
                                       B_minutes++;
                                       }
                                       else {
                                            B_minutes = 0;
                                            if(B_hours<23) {
                                                           B_hours++;
                                                           }
                                                           else {
                                                                B_hours = 0;
                                                                }
                                                                }
                                                                }
                                                Update_Time = 1;
                                                PIR1.TMR1IF = 0;
                                                }
                                                }
/******************************************************************************/

void main() {
            PCON = 0x08;          /* enable 4Mhz oscillator */
            OPTION_REG = 0xB0;    /* pullup disabled, internal clock on TMR0 */
            PORTA = 0x10;         /* initializing PORTA */
            TRISA = 0x10;         /* RA3-RA2 as inputs */
            PORTB = 0x00;         /* initializing PORTB */
            TRISB = 0xF0;         /* PORTB as outputs */
            CMCON = 0x07;         /* Shut down compare module */
            RCSTA.SPEN = 0;       /* shut down USART */
            CCP1CON = 0;          /* shut down CCP module */
            VRCON.VREN = 0;       /* shut down Vref.*/
            PIE1.TMR1IE = 1;      /* TMR1 int.enable */
            INTCON = 0xE0;        /* TMR0 int.enable */
            T1CON = 0x0F;         /* TMR1 on,int.CLK,1/8 div.mode */
/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/

    Init_LCD();
    LCD_send(0,0,"SL=");
do  {
    if(Update_Time==1) {
                       Convert_counter();
                       LCD_send(0,0,"SL=");
                       Display_counter(0,3);
    
                       Convert_Time();
                       Display_data(1,8);
                       Update_Time = 0;
                       }
    /*if(Update_Count==1) {
                        Convert_counter();
                        Display_counter(0,3);
                        Update_Count==1;
                        } */
    Scan_menu();
    }while(1);
}
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
