1   //*****************************************************************************
2   //
3   //  File  Name    :  'keyboard.c'
4   //  Title                :  Itronove  hodiny 
5   #define  __PIC18F8720A__
6   //  Author              :  http://www.prochazka.zde.cz  -&rsaquo   hacesoft  2017
7   //  Created            :  05-05-2017,  15:08
8   //  Revised            :  25-08-2017,  11:27
9   //  Version            :  1.0
10   //  Target  MCU   :  PIC  18F8720
11   //
12   //  This  code  is  distributed  under  the  GNU  Public  License
13   //  Vsechny  informace  jsou  zahrnuty  pod  GPL  licenci,  pokud  není  explicitne  uveden  jiný  typ  licence.
14   //  Pouzivání  techto  stránek  ke  komercním  úcelum  lze  jen  se  souhlasem  autora.
15   //  Vsechna  práva  vyhrazena  (c)  1997  -  2017  hacesoft.
16   //
17   //*****************************************************************************
18   //*****************************************************************************
19   /*
20      stací  porovnávat  aktuální  stav  tlacítka  s  predchozím  stavem.
21  
22   A  to  zpravidla  tak,  ze  si  udaláta  dva  (bitové)  promenné  (dva  bity  pro  kazdé  tlacítko)  BUTTON  a  BTNBLOCK. 
23   Pokud  je  zjisteno  stisknuté  tl.  (které  zároven  není  blokováno),  nastaví  BUTTON  i  BTNBLOCK  do  log  1. 
24   BUTTON  je  potom  flag  pro  program,  který  resí  a  obsluhuje  tlacítka.  Po  prectení  flagu  jej  hned  nulujeme, 
25   zatímco  BTNBLOCK  (interní  stavová  promenná  zustává  v  1).  BUTTON  je  tedy  vlastne  signalizace  události  STISKU  tlacítka.
26   V  prípade,  ze  je  tlacítko  blokované  (BTNBLOCK==1)  a  je  zjisteno  jeho  uvolnení,  resetujte  jako  BUTTON  tak  BTNBLOCK.
27    
28   if  ((TLAC_STISKNUTO)&&(!BTNBLOCK))  {  BUTTON=1;  BTNBLOCK=1;  }
29   if  ((!TLAC_STISKNUTO)&&(BTNBLOCK))  {  BUTTON=0;  BTNBLOCK=0;  }
30  
31     Je  pom?rn?  zrejmé,  ze  pro  kazdé  dalsí  tlacítko  jsou  potrebné  dalsí  dve  bitové  promenné  a  dve  samostané  podmínky.  Tyto  podmínky  se  pak  volají  v  prerusení  od  casovace  a  to 
32     jednou  za  kazdých  cca  10-20ms.  Ne  víc,  ne  mín.
33  
34   V  tele  programu  se  potom  pouze  tázete,  bylo-li  stisknuto  tlacítk  a  pokud  ano,  pouze  smazete  príslusný  flag.  Tento  obsluzný  kód  (ke  kazdému  tlacítku)  se  muze  volat  libovolnekrát  za  sekundu. 
35     Flag  BUTTON  se  nastaví  pouze  jedinkrát  pri  STISKU  tlacítka.  Funkce  obsluhy  cudlíku  se  provede  pouze  JEDNOU  pri  stisku  tlacítka. 
36  
37   if  (BUTTON)  {
38      BUTTON=0;
39      Proved_Obsluhu_Stisku_Cudliku();
40   }
41    
42   #define  TLAC_STISKNUTO  ((PIND  &  (1 &lsaquo &lsaquo   PD2))  ==  0)
43  
44  
45   KÓD:  VYBRA?  V?ETKO
46   volatile  uint8_t  BTNBLOCK=0;
47   volatile  uint8_t  BUTTON=0;
48  
49  
50   KÓD:  VYBRA?  V?ETKO
51   ISR(TIMER1_COMPA_vect){
52  
53   if  ((TLAC_STISKNUTO)&&(!BTNBLOCK))  {  BUTTON=1;  BTNBLOCK=1;  }
54   if  ((!TLAC_STISKNUTO)&&(BTNBLOCK))  {  BUTTON=0;  BTNBLOCK=0;  }        
55   }
56  
57  
58   KÓD:  VYBRA?  V?ETKO
59   while(1)
60   if  (BUTTON)  {
61      BUTTON=0;
62   nejaka  akcia  ;
63  
64     */
65  
66   #include &lsaquo xc.h&rsaquo
67   #include  "hsv.h"
68   #include &lsaquo stddef.h&rsaquo   //nefinuje  NULL
69   #include  "i2c.h"
70   #include  "rtc.h"
71   #include  "keyboard.h"
72   #include  "display.h"
73   #include  "ledI2C.h"
74   #include  "eeprom.h"
75  
76   //*****************************************************************************
77   void  init_keyboard_PCA955PW  (void){
78        __delay_ms(2);
79        I2C_Start(_HW);
80        __delay_ms(2);
81        I2C_Write(_HW,adress_keyboard_write); 
82        __delay_ms(2);
83        I2C_Write(_HW,Polarity_Inversion_Port_0);
84        __delay_ms(2);
85        I2C_Write(_HW,0xff);
86        __delay_ms(2);
87        I2C_Write(_HW,0xff);
88        __delay_ms(2);
89        I2C_ReStart(_HW);
90        __delay_ms(2);
91        I2C_Write(_HW,adress_keyboard_write); 
92        __delay_ms(2);
93        I2C_Write(_HW,Configuration_Port_0);
94        __delay_ms(2);
95        I2C_Write(_HW,0xff);
96        __delay_ms(2);
97        I2C_Write(_HW,0xff);
98        __delay_ms(2);
99        I2C_Stop(_HW);
100        __delay_ms(2);
101        
102      
103        _StruscReadKeyboard.nOK_loop  =  0;
104        _StruscReadKeyboard.position_menu  =  0;
105        _StruscReadKeyboard.DT_blik  =  1;
106        _StruscReadKeyboard.DT_blik_Loop  =  0;
107        _StruscReadKeyboard._SpeedFlag  =  0;
108        _StruscReadKeyboard._SignalButtom  =  0;
109   }
110   //*****************************************************************************
111   void  Read_keyboard_PCA955PW  (void){
112        GIE  =  0;         //  Global  interrupt  stopped
113        __delay_ms(1);
114        I2C_Start_PCA955PW();
115        I2C_Write_PCA955PW(adress_keyboard_write); 
116        I2C_Write_PCA955PW(Input_Port_0);
117        I2C_ReStart_PCA955PW();
118        I2C_Write_PCA955PW(adress_keyboard_read); 
119        _StruscReadKeyboard._Input_Port_0  =  I2C_Read_PCA955PW(ACKNOWLEDGE);
120        _StruscReadKeyboard._Input_Port_1  =  I2C_Read_PCA955PW(NOT_ACKNOWLEDGE);
121        I2C_Stop_PCA955PW();
122       
123        GIE  =  1;         //  Global  interrupt  enable
124        if  ((TL_OK)&&(!_BTNBLOCKlo._bit.TL_OK_BTNBLOCK)){  _BUTTON._bit.TL_OK_BUTTON  =  1;  _BTNBLOCKlo._bit.TL_OK_BTNBLOCK  =  1;}
125       if  ((!TL_OK)&&(_BTNBLOCKlo._bit.TL_OK_BTNBLOCK)){  _BUTTON._bit.TL_OK_BUTTON  =  0;  _BTNBLOCKlo._bit.TL_OK_BTNBLOCK  =  0;}
126      
127       if  ((TL_LEFT)&&(!_BTNBLOCKlo._bit.TL_LEFT_BTNBLOCK)){  _BUTTON._bit.TL_LEFT_BUTTON  =  1;  _BTNBLOCKlo._bit.TL_LEFT_BTNBLOCK  =  1;}
128       if  ((!TL_LEFT)&&(_BTNBLOCKlo._bit.TL_LEFT_BTNBLOCK)){  _BUTTON._bit.TL_LEFT_BUTTON  =  0;  _BTNBLOCKlo._bit.TL_LEFT_BTNBLOCK  =  0;}
129      
130       if  ((TL_RIGHT)&&(!_BTNBLOCKlo._bit.TL_RIGHT_BTNBLOCK)){  _BUTTON._bit.TL_RIGHT_BUTTON  =  1;  _BTNBLOCKlo._bit.TL_RIGHT_BTNBLOCK  =  1;}
131       if  ((!TL_RIGHT)&&(_BTNBLOCKlo._bit.TL_RIGHT_BTNBLOCK)){  _BUTTON._bit.TL_RIGHT_BUTTON  =  0;  _BTNBLOCKlo._bit.TL_RIGHT_BTNBLOCK  =  0;}
132      
133       if  ((TL_UP)&&(!_BTNBLOCKlo._bit.TL_UP_BTNBLOCK)){  _BUTTON._bit.TL_UP_BUTTON  =  1;  _BTNBLOCKlo._bit.TL_UP_BTNBLOCK  =  1;}
134       if  ((!TL_UP)&&(_BTNBLOCKlo._bit.TL_UP_BTNBLOCK)){  _BUTTON._bit.TL_UP_BUTTON  =  0;  _BTNBLOCKlo._bit.TL_UP_BTNBLOCK  =  0;}
135      
136       if  ((TL_DOWN)&&(!_BTNBLOCKlo._bit.TL_DOWN_BTNBLOCK)){  _BUTTON._bit.TL_DOWN_BUTTON  =  1;  _BTNBLOCKlo._bit.TL_DOWN_BTNBLOCK  =  1;}
137       if  ((!TL_DOWN)&&(_BTNBLOCKlo._bit.TL_DOWN_BTNBLOCK)){  _BUTTON._bit.TL_DOWN_BUTTON  =  0;  _BTNBLOCKlo._bit.TL_DOWN_BTNBLOCK  =  0;}
138   }
139   //*****************************************************************************
140   void  Menu_Keyboard  (void){
141        if  (_BUTTON._bit.TL_DOWN_BUTTON)  {//show  datum
142            _BUTTON._bit.TL_DOWN_BUTTON  =  0;
143            ShowDate();
144        }
145        if  (_BUTTON._bit.TL_OK_BUTTON)  {
146            _StruscReadKeyboard.nOK_loop  =  _StruscReadKeyboard.nOK_loop  +  1;
147            if  (_StruscReadKeyboard.nOK_loop  ==  _Delka_stisku_tlacitka_DolniMer){//delka  stisku  3  sec.
148                _StruscReadKeyboard.nOK_loop  =  0;
149                _BUTTON._bit.TL_OK_BUTTON  =  0;
150                ClearDisplay();
151                Edit();
152            }
153        }
154        else  {
155            _StruscReadKeyboard.nOK_loop  =  0;
156             _BUTTON._bit.TL_OK_BUTTON  =  0;}
157   }
158   //*****************************************************************************
159   void  Edit  (void){
160        for(;_StruscReadKeyboard.nOK_loop  ==  0;){//menu
161            __delay_ms(_menuLoop);
162            if  (_BUTTON._bit.TL_OK_BUTTON)  {
163                _StruscReadKeyboard.nOK_EndLoop  =  _StruscReadKeyboard.nOK_EndLoop  +  1;
164                if  (_StruscReadKeyboard.nOK_EndLoop  ==  254){_StruscReadKeyboard.nOK_EndLoop  =  255;}//korekce  preteceni...
165                if  (_StruscReadKeyboard.nOK_EndLoop &rsaquo =  (_Delka_stisku_tlacitka_HorniMer)){//delka  stisku  3  sec.  Vyskoceni  z  menu
166                    _StruscReadKeyboard.nOK_loop  =  1;  //ukonceni  edit  menu
167                   _BUTTON._bit.TL_OK_BUTTON  =  0;
168                    _StruscReadKeyboard.nOK_SubMenuLoop  =  0;
169                    _StruscReadKeyboard.nOK_EndLoop  =  0;
170                }
171            }
172            else  {
173                if  (_StruscReadKeyboard.nOK_EndLoop &rsaquo =  (_Delka_stisku_tlacitka_DolniMer)  and  _StruscReadKeyboard.nOK_EndLoop &lsaquo =  (_Delka_stisku_tlacitka_HorniMer)){//potvrzeni  funkce.  Vnoreni  do  podmenu
174                    _StruscReadKeyboard.nOK_SubMenuLoop  =  1;
175                }
176                _StruscReadKeyboard.nOK_EndLoop  =  0;
177                _BUTTON._bit.TL_OK_BUTTON  =  0;
178            }
179            //*********************************************************************
180            //  kod  editace  a  nastaveni  hodin
181            IndikaceMenu();
182            switch  (_StruscReadKeyboard.position_menu){
183                   
184                case  0  ://editace  casu 
185                    if  (_StruscReadKeyboard.nOK_SubMenuLoop  ==  1){//editace  submenu
186                        _BUTTON._bit.TL_OK_BUTTON  =  0;
187                        Edit_Time();
188                        _StruscReadKeyboard.nOK_SubMenuLoop  =  0;
189                        _StruscReadKeyboard.nOK_EndLoop  =  0;
190                    }
191                  break;
192  
193                case  1  ://editace  datumu 
194                    if  (_StruscReadKeyboard.nOK_SubMenuLoop  ==  1){//editace  submenu
195                        _BUTTON._bit.TL_OK_BUTTON  =  0;
196                        Edit_Datumu();
197                        _StruscReadKeyboard.nOK_SubMenuLoop  =  0;
198                    }
199                  break;
200                 
201                 case  2  ://editace  podsvetleni
202                     if  (_StruscReadKeyboard.nOK_SubMenuLoop  ==  1){//editace  submenu
203                         _BUTTON._bit.TL_OK_BUTTON  =  0;
204                        Edit_Podsvetleni();
205                        _StruscReadKeyboard.nOK_SubMenuLoop  =  0;
206                    }
207                  break;
208                 
209                 case  3  ://zobrazeni  teploty 
210                     ShowTemp();
211                  break;
212  
213                default  ://default...asi  je  neco  spatne 
214                    ShowErr();
215                 break;
216            } 
217            //  kod  pro  posouvani  v  menu  funkci  ...  doprava  doleva
218           
219            if  (_BUTTON._bit.TL_LEFT_BUTTON)  {
220                _BUTTON._bit.TL_LEFT_BUTTON  =  0;
221                _StruscReadKeyboard.position_menu  =  (unsigned)  _StruscReadKeyboard.position_menu  -  1;
222                if  (_StruscReadKeyboard.position_menu  ==  255){
223                    _StruscReadKeyboard.position_menu  =  _end_menu;
224                }
225            }
226           
227            if  (_BUTTON._bit.TL_RIGHT_BUTTON)  {
228                _BUTTON._bit.TL_RIGHT_BUTTON  =  0;
229                _StruscReadKeyboard.position_menu  =(unsigned)  _StruscReadKeyboard.position_menu  +  1;
230                if  (_StruscReadKeyboard.position_menu &rsaquo =  (_end_menu  +  1)){
231                    _StruscReadKeyboard.position_menu  =  0;
232                }
233            }
234           
235           
236        }
237   }
238   //*****************************************************************************
239   void  IndikaceMenu  (void){
240        //funkce  indikuje  editovany  udaj...pomoci  blikani  patricne  desetinne  tecky
241       
242        _StruscReadKeyboard.DT_blik_Loop  =  (unsigned)_StruscReadKeyboard.DT_blik_Loop  +  1;
243        if  (_StruscReadKeyboard.DT_blik_Loop  ==  _change_DT_Const){//provede  se  zmena  stavu  DT
244            _StruscReadKeyboard.DT_blik_Loop  =  0;
245            DTstatus();
246        }
247        ClearSetDT();//Smaze  vsechny  nastavene  DT  a  opet  je  nastavi
248        switch  (_StruscReadKeyboard.position_menu){
249  
250            case  0  ://editace  casu
251                ClearDisplay();
252                if  (_StruscReadKeyboard.DT_blik  ==  1)  {
253                    BitSet(TTL_Hour_hiD_LAT,  TTL_Segment_DT_D);
254                }
255              break;
256  
257            case  1  ://editace  datumu 
258                ClearDisplay();
259                if  (_StruscReadKeyboard.DT_blik  ==1)  {
260                    BitSet(TTL_Hour_loE_LAT,  TTL_Segment_DT_E);
261                }
262              break;
263  
264             case  2  ://editace  podsvetleni
265                 ClearDisplay();
266                 if  (_StruscReadKeyboard.DT_blik  ==1)  {
267                    BitSet(TTL_Minut_hiH_LAT,  TTL_Segment_DT_H);
268                }
269              break;
270                 
271              case  3  ://zobrazeni  teploty 
272                 if  (_StruscReadKeyboard.DT_blik  ==1)  {
273                    BitSet(TTL_Minut_loJ_LAT,  TTL_Segment_DT_J);
274                }
275              break;
276  
277              case  4  ://reserve
278                  ClearDisplay();
279                 if  (_StruscReadKeyboard.DT_blik  ==1)  {
280                    BitSet(TTL_Second_hiF_LAT,  TTL_Segment_DT_F);
281                }
282              break;
283  
284              case  5  ://reserve
285                  ClearDisplay();
286                 if  (_StruscReadKeyboard.DT_blik  ==1)  {
287                    BitSet(TTL_SecondLoC_LAT,  TTL_Segment_DT_C);
288                }
289              break;
290  
291            default  ://default...asi  je  neco  spatne 
292                ShowErr();
293             break;
294        }  
295   }
296   //*****************************************************************************
297   void  DTstatus  (void){
298        if  (_StruscReadKeyboard.DT_blik  ==  0){//DT  nesviti
299            _StruscReadKeyboard.DT_blik  =  1;
300        }
301        else  {//DT  sviti
302            _StruscReadKeyboard.DT_blik  =  0;
303        }
304   }
305   //*****************************************************************************
306   void  ClearSetDT  (void){
307        BitClear(TTL_Hour_hiD_LAT,  TTL_Segment_DT_D);
308        BitClear(TTL_Hour_loE_LAT,  TTL_Segment_DT_E);
309       
310        BitClear(TTL_Minut_hiH_LAT,  TTL_Segment_DT_H);
311        BitClear(TTL_Minut_loJ_LAT,  TTL_Segment_DT_J);
312       
313        BitClear(TTL_Second_hiF_LAT,  TTL_Segment_DT_F);
314        BitClear(TTL_SecondLoC_LAT,  TTL_Segment_DT_C);
315   }
316   //*****************************************************************************
317   void  _initInterrupt(void){
318        BitSet(tRB2_INT2,  INT2);     //Nastavi  RB2/INT2  jako  vstupni  pin
319        BitClear(RB2_INT2,  INT2);  //vynuluje  pripadnou  vystupni  hodnotu
320        INTEDG2  =  0;
321        //bit  4  INTEDG2:  External  Interrupt  2  Edge  Select  bit
322            //1  =  Interrupt  on  rising  edge
323            //0  =  Interrupt  on  falling  edge
324        INT2IE  =  1;
325        //bit  4  INT2IE:  INT2  External  Interrupt  Enable  bit
326        //     1  =  Enables  the  INT2  external  interrupt
327        //     0  =  Disables  the  INT2  external  interrupt
328       
329        INT2IP  =  1;
330        //bit  7  INT2IP:  INT2  External  Interrupt  Priority  bit
331        //     1  =  High  priority
332        //     0  =  Low  priority
333       
334        INT2IF  =  0;
335        //bit  1  INT2IF:  INT2  External  Interrupt  Flag  bit
336        //     1  =  The  INT2  external  interrupt  occurred  (must  be  cleared  in  software)
337        //     0  =  The  INT2  external  interrupt  did  not  occur
338        GIE  =  1;         //  Global  interrupt  enable
339       }
340   //*****************************************************************************
341   void  interrupt  tc_int  (void){
342        //  interrupt  function  
343        if((INT2IF  ==  _true)  &&  (INT2IE  ==  _true)){  //preruseni  od  INT2  
344            INT2IF  =  0;                              //clear  INT2  interupt
345            //BitSet(TTL_SecondLoC_LAT,  TTL_Segment_DT_C);
346            Read_keyboard_PCA955PW();                //read  keyboard
347        }
348   }
349   //*****************************************************************************
350   void  Edit_Time  (void){
351        _StruscReadKeyboard.nOK_SubMenuLoop  =  0;
352        for(;_StruscReadKeyboard.nOK_SubMenuLoop  ==  0;){//SubMenu
353            __delay_ms(_menuLoop  );
354            if  (_BUTTON._bit.TL_OK_BUTTON)  {
355                _StruscReadKeyboard.nOK_EndLoop  =  _StruscReadKeyboard.nOK_EndLoop  +  1;
356                if  (_StruscReadKeyboard.nOK_EndLoop  ==  254){_StruscReadKeyboard.nOK_EndLoop  =  255;}//korekce  preteceni...
357                if  (_StruscReadKeyboard.nOK_EndLoop &rsaquo =  (_Delka_stisku_tlacitka_Max)){//delka  stisku  3  sec.  Vyskoceni  z  menu
358                    _StruscReadKeyboard.nOK_SubMenuLoop  =  1;  //ukonceni  edit  submenu
359                   _BUTTON._bit.TL_OK_BUTTON  =  0;
360                   _StruscReadKeyboard.nOK_EndLoop  =  0;
361                   //kod  pro  ulozeni  editovanych  hodnot
362                   SetTime();
363                }
364            }
365            else  {
366                _StruscReadKeyboard.nOK_SubMenuLoop  =  0;
367                _StruscReadKeyboard.nOK_EndLoop  =  0;
368                _BUTTON._bit.TL_OK_BUTTON  =  0;
369            }
370            //*********************************************************************
371            //  kod  editace  a  nastaveni  hodin
372            IndikaceMenuTime();
373            switch  (_StruscReadKeyboard.position_sub_menu){
374                   
375                case  0  ://editace  hodin
376                   ChangeSegment  (&  _DateTimeDS3231.Hour_10,&  _DateTimeDS3231.Hour,  2,  3);
377                  break;
378  
379                case  1  ://editace  minut
380                   ChangeSegment  (&_DateTimeDS3231.Minutes_10,&_DateTimeDS3231.Minutes,  5,  9);
381                  break;
382                 
383                case  2  ://editace  sekund 
384                  ChangeSegment  (&_DateTimeDS3231.Seconds_10,&_DateTimeDS3231.Seconds,  5,  9); 
385                break;
386                 
387                default  ://default...asi  je  neco  spatne 
388                    ShowErr();
389                break;
390            } 
391            //  kod  pro  posouvani  v  menu  funkci  ...  doprava  doleva
392            if  (_BUTTON._bit.TL_LEFT_BUTTON)  {
393                _BUTTON._bit.TL_LEFT_BUTTON  =  0;
394                _StruscReadKeyboard.position_sub_menu  =  (unsigned)  _StruscReadKeyboard.position_sub_menu  -  1;
395                if  (_StruscReadKeyboard.position_sub_menu  ==  255){
396                    _StruscReadKeyboard.position_sub_menu  =  _end_menu_edit_time;
397                }
398            }
399           
400            if  (_BUTTON._bit.TL_RIGHT_BUTTON)  {
401                _BUTTON._bit.TL_RIGHT_BUTTON  =  0;
402                _StruscReadKeyboard.position_sub_menu  =(unsigned)  _StruscReadKeyboard.position_sub_menu  +  1;
403                if  (_StruscReadKeyboard.position_sub_menu &rsaquo =  (_end_menu_edit_time  +  1)){
404                    _StruscReadKeyboard.position_sub_menu  =  0;
405                }
406            }
407        }
408   }
409   //*****************************************************************************
410   void  ChangeSegment  (uint8_t  *SegmentHi,  uint8_t  *SegmetLo,  uint8_t  MaxSegmentHi,  uint8_t  MaxSegmentLo){
411        if  (_BUTTON._bit.TL_UP_BUTTON  or  _BUTTON._bit.TL_DOWN_BUTTON)  {   
412            if  (_BUTTON._bit.TL_UP_BUTTON){
413                _StruscReadKeyboard._SignalButtom  =  _UP_;
414                if  (_StruscReadKeyboard._SpeedFlag  ==  1){//rychle  pocitani  nahoru,  tlacitko  UP  je  stisknute  a  porad  je  drzeno,  takze  se  jedna  o  autorepeat
415                    _StruscReadKeyboard.DT_blik  =  0;  //Zobrazeni  segmentu
416                    _StruscReadKeyboard.DT_blik_Loop  =  0;//Nulovani  pocitani  kdy  zacit  blikat
417                    *SegmetLo  =  *SegmetLo  +(unsigned)  1;
418                    if  (*SegmetLo &rsaquo   9){//novy  rad
419                        *SegmetLo  =  0;
420                        *SegmentHi  =  *SegmentHi  +  (unsigned)1;
421                    }
422                   if  ((*SegmentHi &rsaquo   MaxSegmentHi  and   *SegmetLo  ==  0)  or  (*SegmentHi  ==  MaxSegmentHi  and  *SegmetLo &rsaquo   MaxSegmentLo)){
423                        *SegmentHi  =  0;
424                        *SegmetLo  =  0;
425                    }
426                }
427                else  {
428                    _StruscReadKeyboard.nUpDown_Loop  =  _StruscReadKeyboard.nUpDown_Loop  +  1;
429                    if  (_StruscReadKeyboard.nUpDown_Loop  ==  254){_StruscReadKeyboard.nUpDown_Loop  =  255;}//korekce  preteceni...
430                    if  (_StruscReadKeyboard.nUpDown_Loop &rsaquo =  (_Delka_stisku_tlacitka_HorniMer)){//delka  stisku  3  sec.  Vyskoceni  z  menu
431                        _StruscReadKeyboard._SpeedFlag  =  1;
432                    }
433                }
434            }
435            if  (_BUTTON._bit.TL_DOWN_BUTTON){
436                _StruscReadKeyboard._SignalButtom  =  _DOWN_;
437                if  (_StruscReadKeyboard._SpeedFlag  ==  1){//rychle  pocitani  dolu,  tlacitko  DOWN  je  stisknute  a  porad  je  drzeno,  takze  se  jedna  o  autorepeat
438                    _StruscReadKeyboard.DT_blik  =  0;  //Zobrazeni  segmentu
439                    _StruscReadKeyboard.DT_blik_Loop  =  0;//Nulovani  pocitani  kdy  zacit  blikat
440                    *SegmetLo  =  *SegmetLo  -(unsigned)  1;
441                    if  (*SegmetLo  ==  255){//novy  rad
442                        *SegmetLo  =  9;
443                        *SegmentHi  =  *SegmentHi  -  (unsigned)1;
444                    }
445                   if  (*SegmentHi  ==  255  and   *SegmetLo  ==  9){
446                        *SegmentHi  =  MaxSegmentHi;
447                        *SegmetLo  =  MaxSegmentLo;
448                    }   
449                }
450                else  {
451                    _StruscReadKeyboard.nUpDown_Loop  =  _StruscReadKeyboard.nUpDown_Loop  +  1;
452                    if  (_StruscReadKeyboard.nUpDown_Loop  ==  254){_StruscReadKeyboard.nUpDown_Loop  =  255;}//korekce  preteceni...
453                    if  (_StruscReadKeyboard.nUpDown_Loop &rsaquo =  (_Delka_stisku_tlacitka_HorniMer)){//delka  stisku  3  sec.  Vyskoceni  z  menu
454                        _StruscReadKeyboard._SpeedFlag  =  1;
455                    }
456                } 
457            }
458        }
459        else  {
460            if  (_StruscReadKeyboard._SignalButtom  ==  _UP_){
461                if  (_StruscReadKeyboard.nUpDown_Loop &rsaquo =  (_Delka_stisku_tlacitka_DolniMer)  and  _StruscReadKeyboard.nUpDown_Loop &lsaquo =  (_Delka_stisku_tlacitka_HorniMer)){
462                    //  tlacitko  UP  je  stisknuto  a  volneno,  tak  se  pricte  jen  jednou
463                    _StruscReadKeyboard.DT_blik  =  0;  //Zobrazeni  segmentu
464                    _StruscReadKeyboard.DT_blik_Loop  =  0;//Nulovani  pocitani  kdy  zacit  blikat
465                    *SegmetLo  =  *SegmetLo  +(unsigned)  1;
466                    if  (*SegmetLo &rsaquo   9){//novy  rad
467                        *SegmetLo  =  0;
468                        *SegmentHi  =  *SegmentHi  +  (unsigned)1;
469                    }
470                   if  ((*SegmentHi &rsaquo   MaxSegmentHi  and   *SegmetLo  ==  0)  or  (*SegmentHi  ==  MaxSegmentHi  and  *SegmetLo &rsaquo   MaxSegmentLo)){
471                        *SegmentHi  =  0;
472                        *SegmetLo  =  0;
473                    } 
474                 }
475            }
476            if  (_StruscReadKeyboard._SignalButtom  ==  _DOWN_){
477                 if  (_StruscReadKeyboard.nUpDown_Loop &rsaquo =  (_Delka_stisku_tlacitka_DolniMer)  and  _StruscReadKeyboard.nUpDown_Loop &lsaquo =  (_Delka_stisku_tlacitka_HorniMer)){
478                    //  tlacitko  DOWN  je  stisknuto  a  volneno,  tak  se  odecte  jen  jednou     
479                    _StruscReadKeyboard.DT_blik  =  0;  //Zobrazeni  segmentu
480                    _StruscReadKeyboard.DT_blik_Loop  =  0;//Nulovani  pocitani  kdy  zacit  blikat
481                    *SegmetLo  =  *SegmetLo  -(unsigned)  1;
482                    if  (*SegmetLo  ==  255){//novy  rad
483                        *SegmetLo  =  9;
484                        *SegmentHi  =  *SegmentHi  -  (unsigned)1;
485                    }
486                   if  (*SegmentHi  ==  255  and   *SegmetLo  ==  9){
487                        *SegmentHi  =  MaxSegmentHi;
488                        *SegmetLo  =  MaxSegmentLo;
489                    } 
490                }
491            }
492             //nulovani  vseho  co  zpusobuje  autorepeat  a  indikace  stisknuti  tlacitka
493            _StruscReadKeyboard._SpeedFlag  =  0;
494            _StruscReadKeyboard._SignalButtom  =  0;
495            _StruscReadKeyboard.nUpDown_Loop  =  0;
496            _BUTTON._bit.TL_UP_BUTTON  =  0; 
497        }
498   }
499   //*****************************************************************************
500   void  Edit_Datumu  (void){
501        _StruscReadKeyboard.nOK_SubMenuLoop  =  0;
502        for(;_StruscReadKeyboard.nOK_SubMenuLoop  ==  0;){//SubMenu
503            __delay_ms(_menuLoop  );
504            if  (_BUTTON._bit.TL_OK_BUTTON)  {
505                _StruscReadKeyboard.nOK_EndLoop  =  _StruscReadKeyboard.nOK_EndLoop  +  1;
506                if  (_StruscReadKeyboard.nOK_EndLoop  ==  254){_StruscReadKeyboard.nOK_EndLoop  =  255;}//korekce  preteceni...
507                if  (_StruscReadKeyboard.nOK_EndLoop &rsaquo =  (_Delka_stisku_tlacitka_Max)){//delka  stisku  3  sec.  Vyskoceni  z  menu
508                    _StruscReadKeyboard.nOK_SubMenuLoop  =  1;  //ukonceni  edit  submenu
509                   _BUTTON._bit.TL_OK_BUTTON  =  0;
510                   _StruscReadKeyboard.nOK_EndLoop  =  0;
511                   //kod  pro  ulozeni  editovanych  hodnot
512                   SetDate();    
513                }
514            }
515            else  {
516                _StruscReadKeyboard.nOK_SubMenuLoop  =  0;
517                _StruscReadKeyboard.nOK_EndLoop  =  0;
518                _BUTTON._bit.TL_OK_BUTTON  =  0;
519            }
520            //*********************************************************************
521            //  kod  editace  a  nastaveni  hodin
522            IndikaceMenuDate();
523            switch  (_StruscReadKeyboard.position_sub_menu){
524                   
525                case  0  ://editace  poradi  dne....Pondeli  je  1,  utery  je  2  atd
526                    ChangeSegmentDat  (&  _DateTimeDS3231.Day,  NULL,  ConsDay);
527                  break;
528  
529                case  1  ://editace  datumu
530                    ChangeSegmentDat  (&_DateTimeDS3231.Date,  NULL,   ConsDate);
531                  break;
532                 
533                 case  2  ://editace  cisla  mesice 
534                    ChangeSegmentDat  (&_DateTimeDS3231.Month_Century,  NULL,   ConstMonth); 
535                  break;
536                 
537                  case  3  ://editace  roku 
538                    ChangeSegmentDat  (&_DateTimeDS3231.Year,  &_DateTimeDS3231.Month_Century,  ConstYear); 
539                  break;
540                 
541                default  ://default...asi  je  neco  spatne 
542                    ShowErr();
543                 break;
544            } 
545            //  kod  pro  posouvani  v  menu  funkci  ...  doprava  doleva
546            if  (_BUTTON._bit.TL_LEFT_BUTTON)  {
547                _BUTTON._bit.TL_LEFT_BUTTON  =  0;
548                _StruscReadKeyboard.position_sub_menu  =  (unsigned)  _StruscReadKeyboard.position_sub_menu  -  1;
549                if  (_StruscReadKeyboard.position_sub_menu  ==  255){
550                    _StruscReadKeyboard.position_sub_menu  =  _end_menu_edit_date;
551                }
552            }
553           
554            if  (_BUTTON._bit.TL_RIGHT_BUTTON)  {
555                _BUTTON._bit.TL_RIGHT_BUTTON  =  0;
556                _StruscReadKeyboard.position_sub_menu  =(unsigned)  _StruscReadKeyboard.position_sub_menu  +  1;
557                if  (_StruscReadKeyboard.position_sub_menu &rsaquo =  (_end_menu_edit_date  +  1)){
558                    _StruscReadKeyboard.position_sub_menu  =  0;
559                }
560            }
561        }
562   }
563   //*****************************************************************************
564   void  ChangeSegmentDat  (uint8_t  *SegmentSource,  uint8_t  *Century,  uint16_t  MaxNumberSegment){
565        uint8_t  nBuffer;
566        uint8_t  nBuffer10;
567        if  (_BUTTON._bit.TL_UP_BUTTON  or  _BUTTON._bit.TL_DOWN_BUTTON)  {   
568            if  (_BUTTON._bit.TL_UP_BUTTON){
569                _StruscReadKeyboard._SignalButtom  =  _UP_;
570                if  (_StruscReadKeyboard._SpeedFlag  ==  1){//rychle  pocitani  nahoru,  tlacitko  UP  je  stisknute  a  porad  je  drzeno,  takze  se  jedna  o  autorepeat
571                    _StruscReadKeyboard.DT_blik  =  0;  //Zobrazeni  segmentu
572                    _StruscReadKeyboard.DT_blik_Loop  =  0;//Nulovani  pocitani  kdy  zacit  blikat
573                    switch  (MaxNumberSegment){
574                       case  ConsDay  ://editace  poradi  dne  v  tydnu 
575                            *SegmentSource  =  *SegmentSource  +  (unsigned)  1;
576                            if  (*SegmentSource  ==  8){*SegmentSource  =  1;}
577                         break;
578  
579                       case  ConstMonth  ://editace  mesice 
580                           nBuffer  =  *SegmentSource;
581                           if  ((unsigned)((nBuffer  and  0b00010000)  ror  4)  ==  1){nBuffer  =  (unsigned)  nBuffer  +  10;}
582                           BitClear  (nBuffer,  4);
583                           nBuffer  =  nBuffer  +  (unsigned)  1;
584                           switch  (nBuffer){
585                               case  10  :
586                                   *SegmentSource  =  0;
587                                    BitSet  (*SegmentSource,  4);
588                                break;
589  
590                                case  13  :
591                                    *SegmentSource  =  1;    
592                                break;
593  
594                                default  ://default. 
595                                    nBuffer  =  (unsigned)*SegmentSource  and  0b00010000;  //vytvorit  masku  5th  bytu
596                                    BitClear  (*SegmentSource,  4);
597                                    *SegmentSource  =  *SegmentSource  +  (unsigned)  1;
598                                    *SegmentSource  =  (unsigned)*SegmentSource  or  nBuffer;
599                                break; 
600                           }
601                         break;
602  
603                        case  ConsDate  ://editace  datuma 
604                            nBuffer  =  *SegmentSource;
605                            nBuffer10  =  *SegmentSource;
606                            nBuffer10  =  (unsigned)((nBuffer10  and  0b00110000)  ror  4)  ;
607                            BitClear  (nBuffer,  4);
608                            BitClear  (nBuffer,  5);
609                            nBuffer  =  nBuffer  +  (unsigned)  1;
610                            if  (nBuffer  ==  10){
611                                *SegmentSource  =  0;
612                                nBuffer10  =  nBuffer10  +  (unsigned)  1;
613                                *SegmentSource  =  (unsigned)  nBuffer10  rol  4;
614                            }
615                            else  if  (nBuffer10  ==  3  and  nBuffer  ==  2){
616                                *SegmentSource  =  1;
617                            }
618  
619                            else  {
620                                nBuffer10  =  (unsigned)*SegmentSource  and  0b00110000;  //vytvorit  masku  5th  bytu
621  
622                                BitClear  (*SegmentSource,  4);
623                                BitClear  (*SegmentSource,  5);
624                                *SegmentSource  =  nBuffer;
625                                *SegmentSource  =  (unsigned)*SegmentSource  or  nBuffer10;
626                            }
627                         break;
628  
629                         case  ConstYear  ://editace  roku 
630                            nBuffer  =  *SegmentSource;
631                            nBuffer10  =  *SegmentSource;
632                            nBuffer10  =  (unsigned)((nBuffer10  and  0b11110000)  ror  4)  ;
633                            BitClear  (nBuffer,  4);
634                            BitClear  (nBuffer,  5);
635                            BitClear  (nBuffer,  6);
636                            BitClear  (nBuffer,  7);
637                            nBuffer  =  nBuffer  +  (unsigned)  1;
638                            if  (nBuffer  ==  10){
639                                *SegmentSource  =  0;
640                                nBuffer10  =  nBuffer10  +  (unsigned)  1;
641                                *SegmentSource  =  (unsigned)  nBuffer10  rol  4;
642  
643                                if  (nBuffer10  ==  10  and  nBuffer  ==  10){
644                                    *SegmentSource  =  0;
645                                    nBuffer10  =  (unsigned)  *Century  and  0b10000000;
646                                    if  (nBuffer10  ==  0){
647                                        BitSet  (*Century,  7);
648                                    }
649                                    else{
650                                        BitClear  (*Century,  7);
651                                    }
652                                }
653                            }
654                            else  {
655                                nBuffer10  =  (unsigned)*SegmentSource  and  0b11110000;  //vytvorit  masku  5th  bytu
656  
657                                BitClear  (*SegmentSource,  4);
658                                BitClear  (*SegmentSource,  5);
659                                BitClear  (*SegmentSource,  6);
660                                BitClear  (*SegmentSource,  7);
661                                *SegmentSource  =  nBuffer;
662                                *SegmentSource  =  (unsigned)*SegmentSource  or  nBuffer10;
663                            }
664  
665                         break;
666  
667                       default  ://default...asi  je  neco  spatne 
668                           ShowErr();
669                        break;
670                   }
671                }
672                else  {
673                    _StruscReadKeyboard.nUpDown_Loop  =  _StruscReadKeyboard.nUpDown_Loop  +  1;
674                    if  (_StruscReadKeyboard.nUpDown_Loop  ==  254){_StruscReadKeyboard.nUpDown_Loop  =  255;}//korekce  preteceni...
675                    if  (_StruscReadKeyboard.nUpDown_Loop &rsaquo =  (_Delka_stisku_tlacitka_HorniMer)){//delka  stisku  3  sec.  Vyskoceni  z  menu
676                        _StruscReadKeyboard._SpeedFlag  =  1;
677                    }
678                }
679            }
680            if  (_BUTTON._bit.TL_DOWN_BUTTON){
681                _StruscReadKeyboard._SignalButtom  =  _DOWN_;
682                if  (_StruscReadKeyboard._SpeedFlag  ==  1){//rychle  pocitani  dolu,  tlacitko  DOWN  je  stisknute  a  porad  je  drzeno,  takze  se  jedna  o  autorepeat
683                    _StruscReadKeyboard.DT_blik  =  0;  //Zobrazeni  segmentu
684                    _StruscReadKeyboard.DT_blik_Loop  =  0;//Nulovani  pocitani  kdy  zacit  blikat
685                    switch  (MaxNumberSegment){
686                        case  ConsDay  ://editace  poradi  dne  v  tydnu 
687                            *SegmentSource  =  *SegmentSource  -  (unsigned)  1;
688                            if  (*SegmentSource  ==  0){*SegmentSource  =  7;}
689                           break;
690                        case  ConstMonth  ://editace  mesice 
691                           nBuffer  =  *SegmentSource;
692                            nBuffer10  =  *SegmentSource;
693                            nBuffer10  =  (unsigned)((nBuffer10  and  0b00010000)  ror  4)  ;
694                            BitClear  (nBuffer,  4);
695                            nBuffer  =  nBuffer  -  (unsigned)  1;
696  
697                           if  (nBuffer  ==  255){
698                               nBuffer10  =  (unsigned)*SegmentSource  and  0b10000000;  //vytvorit  masku  Century  BITu
699                               *SegmentSource  =(unsigned)  0b00001001  or  nBuffer10;//nastavi  segmenty  na  0  a  9
700                            }
701                            else  if  (nBuffer10  ==  0  and  nBuffer  ==  0){
702                                nBuffer10  =  (unsigned)*SegmentSource  and  0b10000000;  //vytvorit  masku  Century  BITu
703                                *SegmentSource  =  (unsigned)0b00010010  or  nBuffer10;//nastavi  segmenty  na  1  a  2
704                            }
705                            else  {
706                                nBuffer10  =  (unsigned)*SegmentSource  and  0b10010000;  //vytvorit  masku  5th  bytu  +  Century  BIT
707                                BitClear  (*SegmentSource,  4);
708                                *SegmentSource  =  nBuffer;
709                                *SegmentSource  =  (unsigned)*SegmentSource  or  nBuffer10;
710                            }
711                         break;
712  
713                        case  ConsDate  ://editace  datumu 
714                            nBuffer  =  *SegmentSource;
715                            nBuffer10  =  *SegmentSource;
716                            nBuffer10  =  (unsigned)((nBuffer10  and  0b00110000)  ror  4)  ;
717                            BitClear  (nBuffer,  4);
718                            BitClear  (nBuffer,  5);
719                            nBuffer  =  nBuffer  -  (unsigned)  1;
720                            if  (nBuffer  ==  255){
721                                nBuffer10  =  nBuffer10  -  (unsigned)  1;
722                                *SegmentSource  =  (unsigned)  (nBuffer10  rol  4)  or  9;
723                            }
724                            else  if  (nBuffer10  ==  0  and  nBuffer  ==  0){
725                                *SegmentSource  =  0b00110001;//nastavi  segmenty  na  3  a  1
726                            }
727                            else  {
728                                nBuffer10  =  (unsigned)*SegmentSource  and  0b00110000;  //vytvorit  masku  5th  bytu
729  
730                                BitClear  (*SegmentSource,  4);
731                                BitClear  (*SegmentSource,  5);
732                                *SegmentSource  =  nBuffer;
733                                *SegmentSource  =  (unsigned)*SegmentSource  or  nBuffer10;
734                            }
735                         break;
736                         
737                        case  ConstYear  ://editace  roku 
738                            nBuffer  =  *SegmentSource;
739                            nBuffer10  =  *SegmentSource;
740                            nBuffer10  =  (unsigned)((nBuffer10  and  0b11110000)  ror  4)  ;
741                            BitClear  (nBuffer,  4);
742                            BitClear  (nBuffer,  5);
743                            BitClear  (nBuffer,  6);
744                            BitClear  (nBuffer,  7);
745                            nBuffer  =  nBuffer  -  (unsigned)  1;
746                            if  (nBuffer  ==  0xff){
747                                nBuffer10  =  nBuffer10  -  (unsigned)  1;
748                                *SegmentSource  =  (unsigned)  (nBuffer10  rol  4)  or  9;
749                                if  (nBuffer10  ==  0xff  and  nBuffer  ==  0xff){
750                                    *SegmentSource  =  0b10011001;   //  9  +  9
751                                    nBuffer10  =(unsigned)  *Century  and  0b10000000;
752                                    if  (nBuffer10  ==  0){
753                                        BitSet  (*Century,  7);
754                                    }
755                                    else{
756                                        BitClear  (*Century,  7);
757                                    }
758                                }
759                            }
760                            else  {
761                                nBuffer10  =  (unsigned)*SegmentSource  and  0b11110000;  //vytvorit  masku  horni  poloviny  bytu
762                                *SegmentSource  =  nBuffer;
763                                BitClear  (*SegmentSource,  4);
764                                BitClear  (*SegmentSource,  5);
765                                BitClear  (*SegmentSource,  6);
766                                BitClear  (*SegmentSource,  7);
767                                *SegmentSource  =  (unsigned)*SegmentSource  or  nBuffer10;
768                            }
769                         break;
770                        
771                         default  ://default...asi  je  neco  spatne 
772                           ShowErr();
773                        break;              
774                    }  
775                }
776                else  {
777                    _StruscReadKeyboard.nUpDown_Loop  =  _StruscReadKeyboard.nUpDown_Loop  +  1;
778                    if  (_StruscReadKeyboard.nUpDown_Loop  ==  254){_StruscReadKeyboard.nUpDown_Loop  =  255;}//korekce  preteceni...
779                    if  (_StruscReadKeyboard.nUpDown_Loop &rsaquo =  (_Delka_stisku_tlacitka_HorniMer)){//delka  stisku  3  sec.  Vyskoceni  z  menu
780                        _StruscReadKeyboard._SpeedFlag  =  1;
781                    }
782                } 
783            }
784        }
785        else  {
786            if  (_StruscReadKeyboard._SignalButtom  ==  _UP_){
787                if  (_StruscReadKeyboard.nUpDown_Loop &rsaquo =  (_Delka_stisku_tlacitka_DolniMer)  and  _StruscReadKeyboard.nUpDown_Loop &lsaquo =  (_Delka_stisku_tlacitka_HorniMer)){
788                    //  tlacitko  UP  je  stisknuto  a  volneno,  tak  se  pricte  jen  jednou
789                    _StruscReadKeyboard.DT_blik  =  0;  //Zobrazeni  segmentu
790                    _StruscReadKeyboard.DT_blik_Loop  =  0;//Nulovani  pocitani  kdy  zacit  blikat
791                    switch  (MaxNumberSegment){
792                       case  ConsDay  ://editace  poradi  dne  v  tydnu 
793                            *SegmentSource  =  *SegmentSource  +  (unsigned)  1;
794                            if  (*SegmentSource  ==  8){*SegmentSource  =  1;}
795                         break;
796  
797                       case  ConstMonth  ://editace  mesice 
798                           nBuffer  =  *SegmentSource;
799                           if  ((unsigned)((nBuffer  and  0b00010000)  ror  4)  ==  1){nBuffer  =  (unsigned)  nBuffer  +  10;}
800                           BitClear  (nBuffer,  4);
801                           nBuffer  =  nBuffer  +  (unsigned)  1;
802                           switch  (nBuffer){
803                               case  10  :
804                                   *SegmentSource  =  0;
805                                    BitSet  (*SegmentSource,  4);
806                                break;
807  
808                                case  13  :
809                                    *SegmentSource  =  1;    
810                                break;
811  
812                                default  ://default. 
813                                    nBuffer  =  (unsigned)*SegmentSource  and  0b00010000;  //vytvorit  masku  5th  bytu
814                                    BitClear  (*SegmentSource,  4);
815                                    *SegmentSource  =  *SegmentSource  +  (unsigned)  1;
816                                    *SegmentSource  =  (unsigned)*SegmentSource  or  nBuffer;
817                                break; 
818                           }
819                         break;
820  
821                        case  ConsDate  ://editace  datumu 
822                            nBuffer  =  *SegmentSource;
823                            nBuffer10  =  *SegmentSource;
824                            nBuffer10  =  (unsigned)((nBuffer10  and  0b00110000)  ror  4)  ;
825                            BitClear  (nBuffer,  4);
826                            BitClear  (nBuffer,  5);
827                            nBuffer  =  nBuffer  +  (unsigned)  1;
828                            if  (nBuffer  ==  10){
829                                *SegmentSource  =  0;
830                                nBuffer10  =  nBuffer10  +  (unsigned)  1;
831                                *SegmentSource  =  (unsigned)  nBuffer10  rol  4;
832                            }
833                            else  if  (nBuffer10  ==  3  and  nBuffer  ==  2){
834                                *SegmentSource  =  1;
835                            }
836                            else  {
837                                nBuffer10  =  (unsigned)*SegmentSource  and  0b00110000;  //vytvorit  masku  5th  bytu
838                                BitClear  (*SegmentSource,  4);
839                                BitClear  (*SegmentSource,  5);
840                                *SegmentSource  =  nBuffer;
841                                *SegmentSource  =  (unsigned)*SegmentSource  or  nBuffer10;
842                            }
843                         break;
844  
845                         case  ConstYear  ://editace  roku 
846                            nBuffer  =  *SegmentSource;
847                            nBuffer10  =  *SegmentSource;
848                            nBuffer10  =  (unsigned)((nBuffer10  and  0b11110000)  ror  4)  ;
849                            BitClear  (nBuffer,  4);
850                            BitClear  (nBuffer,  5);
851                            BitClear  (nBuffer,  6);
852                            BitClear  (nBuffer,  7);
853                            nBuffer  =  nBuffer  +  (unsigned)  1;
854                            if  (nBuffer  ==  10){
855                                *SegmentSource  =  0;
856                                nBuffer10  =  nBuffer10  +  (unsigned)  1;
857                                *SegmentSource  =  (unsigned)  nBuffer10  rol  4;
858                                if  (nBuffer10  ==  10  and  nBuffer  ==  10){
859                                    *SegmentSource  =  0;
860                                    nBuffer10  =  (unsigned)*Century  and  0b10000000;
861                                    if  (nBuffer10  ==  0){
862                                        BitSet  (*Century,  7);
863                                    }
864                                    else{
865                                        BitClear  (*Century,  7);
866                                    }
867                                }
868                            }
869                            else  {
870                                nBuffer10  =  (unsigned)*SegmentSource  and  0b11110000;  //vytvorit  masku  5th  bytu
871                                BitClear  (*SegmentSource,  4);
872                                BitClear  (*SegmentSource,  5);
873                                BitClear  (*SegmentSource,  6);
874                                BitClear  (*SegmentSource,  7);
875                                *SegmentSource  =  nBuffer;
876                                *SegmentSource  =  (unsigned)*SegmentSource  or  nBuffer10;
877                            }
878                         break;
879  
880                       default  ://default...asi  je  neco  spatne 
881                           ShowErr();
882                        break;
883                    }
884                 }
885            }
886            if  (_StruscReadKeyboard._SignalButtom  ==  _DOWN_){
887                 if  (_StruscReadKeyboard.nUpDown_Loop &rsaquo =  (_Delka_stisku_tlacitka_DolniMer)  and  _StruscReadKeyboard.nUpDown_Loop &lsaquo =  (_Delka_stisku_tlacitka_HorniMer)){
888                    //  tlacitko  DOWN  je  stisknuto  a  volneno,  tak  se  odecte  jen  jednou     
889                    _StruscReadKeyboard.DT_blik  =  0;  //Zobrazeni  segmentu
890                    _StruscReadKeyboard.DT_blik_Loop  =  0;//Nulovani  pocitani  kdy  zacit  blikat
891                    switch  (MaxNumberSegment){
892                        case  ConsDay  ://editace  poradi  dne  v  tydnu 
893                            *SegmentSource  =  *SegmentSource  -  (unsigned)  1;
894                            if  (*SegmentSource  ==  0){*SegmentSource  =  7;}
895                           break;
896                        case  ConstMonth  ://editace  mesice 
897                           nBuffer  =  *SegmentSource;
898                            nBuffer10  =  *SegmentSource;
899                            nBuffer10  =  (unsigned)((nBuffer10  and  0b00010000)  ror  4)  ;
900                            BitClear  (nBuffer,  4);
901                            nBuffer  =  nBuffer  -  (unsigned)  1;
902  
903                           if  (nBuffer  ==  255){
904                               nBuffer10  =  (unsigned)*SegmentSource  and  0b10000000;  //vytvorit  masku  Century  BITu
905                               *SegmentSource  =  (unsigned)0b00001001  or  nBuffer10;//nastavi  segmenty  na  0  a  9
906                            }
907                            else  if  (nBuffer10  ==  0  and  nBuffer  ==  0){
908                                nBuffer10  =  (unsigned)*SegmentSource  and  0b10000000;  //vytvorit  masku  Century  BITu
909                                *SegmentSource  =  (unsigned)0b00010010  or  nBuffer10;//nastavi  segmenty  na  1  a  2
910                            }
911                            else  {
912                                nBuffer10  =  (unsigned)*SegmentSource  and  0b10010000;  //vytvorit  masku  5th  bytu  +  Century  BIT
913                                BitClear  (*SegmentSource,  4);
914                                *SegmentSource  =  nBuffer;
915                                *SegmentSource  =  (unsigned)*SegmentSource  or  nBuffer10;
916                            }
917                         break;
918  
919                        case  ConsDate  ://editace  datumu 
920                            nBuffer  =  *SegmentSource;
921                            nBuffer10  =  *SegmentSource;
922                            nBuffer10  =  (unsigned)((nBuffer10  and  0b00110000)  ror  4)  ;
923                            BitClear  (nBuffer,  4);
924                            BitClear  (nBuffer,  5);
925                            nBuffer  =  nBuffer  -  (unsigned)  1;
926                            if  (nBuffer  ==  255){
927                                nBuffer10  =  nBuffer10  -  (unsigned)  1;
928                                *SegmentSource  =  (unsigned)  (nBuffer10  rol  4)  or  9;
929                            }
930                            else  if  (nBuffer10  ==  0  and  nBuffer  ==  0){
931                                *SegmentSource  =  0b00110001;//nastavi  segmenty  na  3  a  1
932                            }
933                            else  {
934                                nBuffer10  =  (unsigned)*SegmentSource  and  0b00110000;  //vytvorit  masku  5th  bytu
935  
936                                BitClear  (*SegmentSource,  4);
937                                BitClear  (*SegmentSource,  5);
938                                *SegmentSource  =  nBuffer;
939                                *SegmentSource  =  (unsigned)*SegmentSource  or  nBuffer10;
940                            }
941                         break;
942                         
943                        case  ConstYear  ://editace  roku 
944                            nBuffer  =  *SegmentSource;
945                            nBuffer10  =  *SegmentSource;
946                            nBuffer10  =  (unsigned)((nBuffer10  and  0b11110000)  ror  4)  ;
947                            BitClear  (nBuffer,  4);
948                            BitClear  (nBuffer,  5);
949                            BitClear  (nBuffer,  6);
950                            BitClear  (nBuffer,  7);
951                            nBuffer  =  nBuffer  -  (unsigned)  1;
952                            if  (nBuffer  ==  0xff){
953                                nBuffer10  =  nBuffer10  -  (unsigned)  1;
954                                *SegmentSource  =  (unsigned)  (nBuffer10  rol  4)  or  9;
955                                if  (nBuffer10  ==  0xff  and  nBuffer  ==  0xff){
956                                    *SegmentSource  =  0b10011001;   //  9  +  9
957                                    nBuffer10  =  (unsigned)*Century  and  0b10000000;
958                                    if  (nBuffer10  ==  0){
959                                        BitSet  (*Century,  7);
960                                    }
961                                    else{
962                                        BitClear  (*Century,  7);
963                                    }
964                                }
965                            }
966                            else  {
967                                nBuffer10  =  (unsigned)*SegmentSource  and  0b11110000;  //vytvorit  masku  horni  poloviny  bytu
968                                *SegmentSource  =  nBuffer;
969                                BitClear  (*SegmentSource,  4);
970                                BitClear  (*SegmentSource,  5);
971                                BitClear  (*SegmentSource,  6);
972                                BitClear  (*SegmentSource,  7);
973                                *SegmentSource  =  (unsigned)*SegmentSource  or  nBuffer10;
974                            }
975                        break;
976                        
977                        default  ://default...asi  je  neco  spatne 
978                           ShowErr();
979                        break;                     
980                    }
981                }
982            }
983             //nulovani  vseho  co  zpusobuje  autorepeat  a  indikace  stisknuti  tlacitka
984            _StruscReadKeyboard._SpeedFlag  =  0;
985            _StruscReadKeyboard._SignalButtom  =  0;
986            _StruscReadKeyboard.nUpDown_Loop  =  0;
987            _BUTTON._bit.TL_UP_BUTTON  =  0; 
988        }
989   }
990   //*****************************************************************************
991   void  ShowDate  (void){
992        __delay_ms(100);
993        ShowDayDateMonth();
994        __delay_ms(1700);
995        ShowYear();
996       __delay_ms(1700);
997        ShowDayDateMonth();
998        __delay_ms(1700);
999        ShowYear(); 
1000        __delay_ms(1700);
1001   }
1002   //*****************************************************************************
1003   void  ShowDayDateMonth(void){
1004        _hour_raw  (decode_segment(_DateTimeDS3231.Day),decode_segment(21));//show  number  day
1005        _minut_raw  (decode_segment((unsigned)(_DateTimeDS3231.Date  and  0b00110000)  ror  4),decode_segment((unsigned)_DateTimeDS3231.Date  and  0b00001111));//show  date
1006        _second_raw  (decode_segment((unsigned)(_DateTimeDS3231.Month_Century  and  0b00010000)  ror  4),decode_segment((unsigned)_DateTimeDS3231.Month_Century  and  0b00001111));//show  month
1007   }
1008   //*****************************************************************************
1009   void  ShowYear  (void){
1010        _hour_raw  (decode_segment(21),decode_segment(21));//show  empty  char
1011        _minut_raw  (decode_segment(2),decode_segment((unsigned)(_DateTimeDS3231.Month_Century  and  0b10000000)  ror  7));//show  2  +  century
1012        _second_raw  (decode_segment(((unsigned)_DateTimeDS3231.Year  and  0b11110000)  ror  4),decode_segment((unsigned)_DateTimeDS3231.Year  and  0b00001111));//show  year
1013   }
1014   //*****************************************************************************
1015  
1016   void  Edit_Podsvetleni(void){
1017        _StruscReadKeyboard.nOK_SubMenuLoop  =  0;
1018        _StruscReadKeyboard.position_sub_menu  =  0;
1019        for(;_StruscReadKeyboard.nOK_SubMenuLoop  ==  0;){//SubMenu
1020            __delay_ms(_menuLoop  );
1021            if  (_BUTTON._bit.TL_OK_BUTTON)  {
1022                _StruscReadKeyboard.nOK_EndLoop  =  _StruscReadKeyboard.nOK_EndLoop  +  1;
1023                if  (_StruscReadKeyboard.nOK_EndLoop  ==  254){_StruscReadKeyboard.nOK_EndLoop  =  255;}//korekce  preteceni...
1024                if  (_StruscReadKeyboard.nOK_EndLoop &rsaquo =  (_Delka_stisku_tlacitka_Max)){//delka  stisku  3  sec.  Vyskoceni  z  menu
1025                    _StruscReadKeyboard.nOK_SubMenuLoop  =  1;  //ukonceni  edit  submenu
1026                   _BUTTON._bit.TL_OK_BUTTON  =  0;
1027                   _StruscReadKeyboard.nOK_EndLoop  =  0;
1028                   _StruscReadKeyboard.position_sub_menu  =  0;
1029                   //kod  pro  ulozeni  editovanych  hodnot
1030                   WriteEEprom();
1031                }
1032            }
1033            else  {
1034                _StruscReadKeyboard.nOK_SubMenuLoop  =  0;
1035                _StruscReadKeyboard.nOK_EndLoop  =  0;
1036                _BUTTON._bit.TL_OK_BUTTON  =  0;
1037            }
1038            //*********************************************************************
1039            //  kod  editace  a  nastaveni  hodin
1040            IndikaceMenuHLS_ALL();
1041            switch  (_StruscReadKeyboard.position_sub_menu){
1042                   
1043                case  0  ://editace  IC2
1044                   ChangeHLS_ALL  (IC2);
1045                break;
1046  
1047                case  1  ://editace  IC3 
1048                   ChangeHLS_ALL  (IC3);
1049                break;
1050                 
1051                case  2  ://editace  IC4  
1052                  ChangeHLS_ALL  (IC4); 
1053                break;
1054               
1055                case  3  ://editace  IC5  
1056                  ChangeHLS_ALL  (IC5); 
1057                break;
1058               
1059                case  4  ://editace  IC6  
1060                  ChangeHLS_ALL  (IC6); 
1061                break;
1062               
1063                case  5  ://editace  IC7  
1064                  ChangeHLS_ALL  (IC7); 
1065                break;
1066               
1067                case  6  ://editace  ALL  led  for  itrons 
1068                  ChangeHLS_ALL  (IC_ALL);
1069                break;
1070                 
1071                default  ://default...asi  je  neco  spatne 
1072                    ShowErr();
1073                break;
1074            } 
1075            //  kod  pro  posouvani  v  menu  funkci  ...  doprava  doleva
1076            if  (_BUTTON._bit.TL_LEFT_BUTTON)  {
1077                _BUTTON._bit.TL_LEFT_BUTTON  =  0;
1078                _StruscReadKeyboard.DT_blik_Loop  =  0;  //  nulovani  pocitadla  pocitani  blikani
1079                _StruscReadKeyboard.DT_blik  ==  1;  //  nastavrni  sviceni
1080                _StruscReadKeyboard.position_sub_menu  =  (unsigned)  _StruscReadKeyboard.position_sub_menu  -  1;
1081                if  (_StruscReadKeyboard.position_sub_menu  ==  255){
1082                    _StruscReadKeyboard.position_sub_menu  =  _end_menu_HLS_ALL;
1083                }
1084            }
1085           
1086            if  (_BUTTON._bit.TL_RIGHT_BUTTON)  {
1087                _BUTTON._bit.TL_RIGHT_BUTTON  =  0;
1088                _StruscReadKeyboard.DT_blik_Loop  =  0;  //  nulovani  pocitadla  pocitani  blikani
1089                _StruscReadKeyboard.DT_blik  ==  1;  //  nastavrni  sviceni
1090                _StruscReadKeyboard.position_sub_menu  =(unsigned)  _StruscReadKeyboard.position_sub_menu  +  1;
1091                if  (_StruscReadKeyboard.position_sub_menu &rsaquo =  (_end_menu_HLS_ALL  +  1)){
1092                    _StruscReadKeyboard.position_sub_menu  =  0;
1093                }
1094            }
1095        }
1096   }
1097   //*****************************************************************************
1098   void  ChangeHLS_ALL  (uint8_t  _tag){
1099        if  (_BUTTON._bit.TL_UP_BUTTON  or  _BUTTON._bit.TL_DOWN_BUTTON)  {   
1100            if  (_BUTTON._bit.TL_UP_BUTTON){
1101                _StruscReadKeyboard._SignalButtom  =  _UP_;
1102                if  (_StruscReadKeyboard._SpeedFlag  ==  1){//rychle  pocitani  nahoru,  tlacitko  UP  je  stisknute  a  porad  je  drzeno,  takze  se  jedna  o  autorepeat
1103                    _StruscReadKeyboard.DT_blik  =  0;  //Zobrazeni  segmentu
1104                    _StruscReadKeyboard.DT_blik_Loop  =  0;//Nulovani  pocitani  kdy  zacit  blikat
1105                    //*****************************************************************************
1106                   
1107                   
1108                    //*****************************************************************************
1109                }
1110                else  {
1111                    _StruscReadKeyboard.nUpDown_Loop  =  _StruscReadKeyboard.nUpDown_Loop  +  1;
1112                    if  (_StruscReadKeyboard.nUpDown_Loop  ==  254){_StruscReadKeyboard.nUpDown_Loop  =  255;}//korekce  preteceni...
1113                    if  (_StruscReadKeyboard.nUpDown_Loop &rsaquo =  (_Delka_stisku_tlacitka_HorniMer)){//delka  stisku  3  sec.  Vyskoceni  z  menu
1114                        _StruscReadKeyboard._SpeedFlag  =  1;
1115                    }
1116                }
1117            }
1118            if  (_BUTTON._bit.TL_DOWN_BUTTON){
1119                _StruscReadKeyboard._SignalButtom  =  _DOWN_;
1120                if  (_StruscReadKeyboard._SpeedFlag  ==  1){//rychle  pocitani  dolu,  tlacitko  DOWN  je  stisknute  a  porad  je  drzeno,  takze  se  jedna  o  autorepeat
1121                    _StruscReadKeyboard.DT_blik  =  0;  //Zobrazeni  segmentu
1122                    _StruscReadKeyboard.DT_blik_Loop  =  0;//Nulovani  pocitani  kdy  zacit  blikat
1123                    //*****************************************************************************
1124                   
1125                   
1126                   
1127                   
1128                    //*****************************************************************************
1129                }
1130                else  {
1131                    _StruscReadKeyboard.nUpDown_Loop  =  _StruscReadKeyboard.nUpDown_Loop  +  1;
1132                    if  (_StruscReadKeyboard.nUpDown_Loop  ==  254){_StruscReadKeyboard.nUpDown_Loop  =  255;}//korekce  preteceni...
1133                    if  (_StruscReadKeyboard.nUpDown_Loop &rsaquo =  (_Delka_stisku_tlacitka_HorniMer)){//delka  stisku  3  sec.  Vyskoceni  z  menu
1134                        _StruscReadKeyboard._SpeedFlag  =  1;
1135                    }
1136                } 
1137            }
1138        }
1139        else  {
1140            if  (_StruscReadKeyboard._SignalButtom  ==  _UP_){
1141                if  (_StruscReadKeyboard.nUpDown_Loop &rsaquo =  (_Delka_stisku_tlacitka_DolniMer)  and  _StruscReadKeyboard.nUpDown_Loop &lsaquo =  (_Delka_stisku_tlacitka_HorniMer)){
1142                    //  tlacitko  UP  je  stisknuto  a  volneno,  tak  se  pricte  jen  jednou
1143                    _StruscReadKeyboard.DT_blik  =  0;  //Zobrazeni  segmentu
1144                    _StruscReadKeyboard.DT_blik_Loop  =  0;//Nulovani  pocitani  kdy  zacit  blikat
1145                    //*****************************************************************************
1146                   
1147                   
1148                   
1149                   
1150                    //*****************************************************************************  
1151                }     
1152            }
1153            if  (_StruscReadKeyboard._SignalButtom  ==  _DOWN_){
1154                 if  (_StruscReadKeyboard.nUpDown_Loop &rsaquo =  (_Delka_stisku_tlacitka_DolniMer)  and  _StruscReadKeyboard.nUpDown_Loop &lsaquo =  (_Delka_stisku_tlacitka_HorniMer)){
1155                    //  tlacitko  DOWN  je  stisknuto  a  volneno,  tak  se  odecte  jen  jednou     
1156                    _StruscReadKeyboard.DT_blik  =  0;  //Zobrazeni  segmentu
1157                    _StruscReadKeyboard.DT_blik_Loop  =  0;//Nulovani  pocitani  kdy  zacit  blikat
1158                    //*****************************************************************************
1159                   
1160                   
1161                   
1162                    //*****************************************************************************  
1163                 }    
1164            }
1165             //nulovani  vseho  co  zpusobuje  autorepeat  a  indikace  stisknuti  tlacitka
1166            _StruscReadKeyboard._SpeedFlag  =  0;
1167            _StruscReadKeyboard._SignalButtom  =  0;
1168            _StruscReadKeyboard.nUpDown_Loop  =  0;
1169            _BUTTON._bit.TL_UP_BUTTON  =  0; 
1170        } 
1171   }
1172   //*****************************************************************************
1173   void  IndikaceMenuHLS_ALL  (void){
1174        //funkce  indikuje  editovany  udaj...pomoci  blikani  patricne  desetinne  tecky,  v  rezimu  ALL  blikaji  vsechny  desetinne  tecky
1175       
1176        _StruscReadKeyboard.DT_blik_Loop  =  (unsigned)_StruscReadKeyboard.DT_blik_Loop  +  1;
1177        if  (_StruscReadKeyboard.DT_blik_Loop  ==  _change_DT_Const){//provede  se  zmena  stavu  DT
1178            _StruscReadKeyboard.DT_blik_Loop  =  0;
1179            DTstatus();
1180        }
1181  
1182        if  (_StruscReadKeyboard.DT_blik  ==  0)  {     
1183            ClearALL_Dot();
1184        }
1185       
1186        switch  (_StruscReadKeyboard.position_sub_menu){
1187           case  0  ://editace  IC2
1188               PrintHex(1,PoleLedHSL.IC2_PWM.h);
1189               PrintHex(2,PoleLedHSL.IC2_PWM.s);
1190               PrintHex(3,PoleLedHSL.IC2_PWM.v);
1191               if  (_StruscReadKeyboard.DT_blik  ==  1)  {
1192                   ClearALL_Dot();
1193                   BitSet(TTL_HourHi_LAT,  TTL_Segment_DT_D);
1194               }
1195            break;
1196  
1197            case  1  ://editace  IC3
1198               PrintHex(1,PoleLedHSL.IC3_PWM.h);
1199               PrintHex(2,PoleLedHSL.IC3_PWM.s);
1200               PrintHex(3,PoleLedHSL.IC3_PWM.v);
1201               if  (_StruscReadKeyboard.DT_blik  ==  1)  {
1202                   ClearALL_Dot();
1203                   BitSet(TTL_HourLo_LAT,  TTL_Segment_DT_E);
1204               }
1205            break;
1206  
1207            case  2  ://editace  IC4 
1208               PrintHex(1,PoleLedHSL.IC4_PWM.h);
1209               PrintHex(2,PoleLedHSL.IC4_PWM.s);
1210               PrintHex(3,PoleLedHSL.IC4_PWM.v);
1211               if  (_StruscReadKeyboard.DT_blik  ==  1)  {
1212                   ClearALL_Dot();
1213                   BitSet(TTL_MinitHi_LAT,  TTL_Segment_DT_H);
1214                }
1215            break;
1216  
1217            case  3  ://editace  IC5  
1218               PrintHex(1,PoleLedHSL.IC5_PWM.h);
1219               PrintHex(2,PoleLedHSL.IC5_PWM.s);
1220               PrintHex(3,PoleLedHSL.IC5_PWM.v);
1221               if  (_StruscReadKeyboard.DT_blik  ==  1)  {
1222                   ClearALL_Dot();
1223                   BitSet(TTL_MinitLo_LAT,  TTL_Segment_DT_J);
1224                }
1225            break;
1226  
1227            case  4  ://editace  IC6
1228               PrintHex(1,PoleLedHSL.IC6_PWM.h);
1229               PrintHex(2,PoleLedHSL.IC6_PWM.s);
1230               PrintHex(3,PoleLedHSL.IC6_PWM.v);
1231               if  (_StruscReadKeyboard.DT_blik  ==  1)  {
1232                   ClearALL_Dot();
1233                   BitSet(TTL_SecondHi_LAT,  TTL_Segment_DT_F);
1234                }
1235            break;
1236  
1237            case  5  ://editace  IC7
1238                PrintHex(1,PoleLedHSL.IC7_PWM.h);
1239                PrintHex(2,PoleLedHSL.IC7_PWM.s);
1240                PrintHex(3,PoleLedHSL.IC7_PWM.v);
1241                if  (_StruscReadKeyboard.DT_blik  ==  1)  {
1242                    ClearALL_Dot();
1243                    BitSet(TTL_SecondLoC_LAT,  TTL_Segment_DT_C);
1244                }
1245            break;
1246  
1247            case  6  ://editace  ALL  led  for  itrons 
1248                PrintSpace(1);
1249                PrintSpace(2);
1250                PrintSpace(3);
1251                if  (_StruscReadKeyboard.DT_blik  ==  1)  {
1252                    BitSet(TTL_HourHi_LAT,  TTL_Segment_DT_D);
1253                    BitSet(TTL_HourLo_LAT,  TTL_Segment_DT_E);
1254                    BitSet(TTL_MinitHi_LAT,  TTL_Segment_DT_H);
1255                    BitSet(TTL_MinitLo_LAT,  TTL_Segment_DT_J);
1256                    BitSet(TTL_SecondHi_LAT,  TTL_Segment_DT_F);
1257                    BitSet(TTL_SecondLoC_LAT,  TTL_Segment_DT_C);
1258                }
1259            break;
1260  
1261            default  ://default...asi  je  neco  spatne 
1262                ShowErr();
1263            break;
1264        }  
1265   }
1266   //*****************************************************************************
1267   void  ClearALL_Dot  (void){
1268        BitClear(TTL_HourHi_LAT,  TTL_Segment_DT_D);
1269        BitClear(TTL_HourLo_LAT,  TTL_Segment_DT_E);
1270        BitClear(TTL_MinitHi_LAT,  TTL_Segment_DT_H);
1271        BitClear(TTL_MinitLo_LAT,  TTL_Segment_DT_J);
1272        BitClear(TTL_SecondHi_LAT,  TTL_Segment_DT_F);
1273        BitClear(TTL_SecondLoC_LAT,  TTL_Segment_DT_C);
1274   }
1275   //*****************************************************************************
1276   void  IndikaceMenuTime  (void){
1277        //funkce  indikuje  editovany  udaj...pomoci  blikani  patricne  dvojcislice
1278       
1279        _StruscReadKeyboard.DT_blik_Loop  =  (unsigned)_StruscReadKeyboard.DT_blik_Loop  +  1;
1280        if  (_StruscReadKeyboard.DT_blik_Loop  ==  _change_DT_Const){//provede  se  zmena  stavu  DT
1281            _StruscReadKeyboard.DT_blik_Loop  =  0;
1282            DTstatus();
1283        }
1284        //nacteni  a  zobrazeni  casu  na  editaci
1285        _hour_raw  (decode_segment(_DateTimeDS3231.Hour_10),decode_segment(_DateTimeDS3231.Hour));
1286        _minut_raw  (decode_segment(_DateTimeDS3231.Minutes_10),decode_segment(_DateTimeDS3231.Minutes));
1287        _second_raw  (decode_segment(_DateTimeDS3231.Seconds_10),decode_segment(_DateTimeDS3231.Seconds));
1288        switch  (_StruscReadKeyboard.position_sub_menu){
1289  
1290            case  0  ://editace  casu 
1291                if  (_StruscReadKeyboard.DT_blik  ==  1)  {
1292                    _hour_raw  (decode_segment(21),decode_segment(21));
1293                }
1294              break;
1295  
1296            case  1  ://editace  datumu 
1297                if  (_StruscReadKeyboard.DT_blik  ==1)  {
1298                    _minut_raw  (decode_segment(21),decode_segment(21));
1299                }
1300              break;
1301  
1302             case  2  ://editace  podsvetleni 
1303                 if  (_StruscReadKeyboard.DT_blik  ==1)  {
1304                    _second_raw  (decode_segment(21),decode_segment(21));
1305                }
1306              break;
1307  
1308            default  ://default...asi  je  neco  spatne 
1309                ShowErr();
1310             break;
1311        }  
1312   }
1313   //*****************************************************************************
1314   void  IndikaceMenuDate  (void){
1315        //funkce  indikuje  editovany  udaj...pomoci  blikani  patricne  dvojcislice
1316       
1317        _StruscReadKeyboard.DT_blik_Loop  =  (unsigned)_StruscReadKeyboard.DT_blik_Loop  +  1;
1318        if  (_StruscReadKeyboard.DT_blik_Loop  ==  _change_DT_Const){//provede  se  zmena  stavu  DT
1319            _StruscReadKeyboard.DT_blik_Loop  =  0;
1320            DTstatus();
1321        }
1322        //nacteni  a  zobrazeni  datumu  na  editaci
1323        if  (_StruscReadKeyboard.position_sub_menu  ==  3){ShowYear();}
1324        else  {     
1325            ShowDayDateMonth();
1326        }
1327        switch  (_StruscReadKeyboard.position_sub_menu){
1328  
1329            case  0  ://editace  dnu  v  tydnu 
1330                if  (_StruscReadKeyboard.DT_blik  ==  1)  {
1331                    _hour_raw  (decode_segment(21),decode_segment(21));
1332                }
1333              break;
1334  
1335            case  1  ://editace  Date 
1336                if  (_StruscReadKeyboard.DT_blik  ==1)  {
1337                    _minut_raw  (decode_segment(21),decode_segment(21));
1338                }
1339              break;
1340  
1341             case  2  ://editace  Month 
1342                 if  (_StruscReadKeyboard.DT_blik  ==1)  {
1343                    _second_raw  (decode_segment(21),decode_segment(21));
1344                }
1345              break;
1346             
1347             case  3  ://editace  Year 
1348                 if  (_StruscReadKeyboard.DT_blik  ==1)  {
1349                     _minut_raw  (decode_segment(21),decode_segment(21));
1350                    _second_raw  (decode_segment(21),decode_segment(21));
1351                }
1352              break;
1353  
1354            default  ://default...asi  je  neco  spatne 
1355                ShowErr();
1356             break;
1357        }  
1358   }