// 01-08-2024 // rev 26-03-2024 corection bug validation // rev 02-12-2023 // rajout fonction pour roll-Over incr / decr // rev 30-11-2023 AVEC bouclage deplacement X fin et debut // 25/10/2023 sans bouclage 8 ->20 ... 20->8 void Ajuste_cx( char min, char max) { if (c1==SW2) //SW2=4=Incremente { cx++; U1TXB='+'; if(cx>max) cx=min; } if (c1==SW3) //SW3=8=decremente { cx--; U1TXB='-'; if(cx20 ... 20->8 void MAJ_RTC_Manuelle() { // static char *px; // pointeur local au lieu de pointeur global *p1 Display_Date_Time(1); // lecture et affichage RTC sur terminal YAT // DS3231_Read_All_Registers(); LCD_Cmd(LCD_CLEAR); LCD_Write_CText_At(1,l,"MAJ RTC DS3231 "); LCD_Write_CText_At(2,l,"modele AAMMJJxSHHMN "); Erase_Line(3); sprintf(CRam1,"modify %02x%02x%02x%02x%02x%02x ",tmp[6],tmp[5],tmp[4],tmp[3],tmp[2],tmp[1]); LCD_Write_Text_At(3,1,CRam1); // valeur RTC en ascii dans la ligne 3 RTC //strcpy(Contenu_Ligne_LCD_En_Cours,CRam1); // memo dans la variable Contenu_Ligne_LCD_En_Cours strncpy(Contenu_Ligne_LCD_En_Cours,CRam1,20); // memo dans la variable Contenu_Ligne_LCD_En_Cours Erase_Line(4); LCD_Write_CText_At(4,l,"SW 0< 1> 2+ 3- 5=Val"); __delay_xSec(1); // CPrint("\r\n ICSP ne doit pas etre connecté \r\n"); CPrint("\r\n Test mode Pooling des 6 BP sur PORTB , de gauche a droite \r\n"); Init_Timer0_10S(0); // utilise en pooling // rappel: SW0 0x01 , SW1 0x02 , SW2 0x04 , SW3 0x08 n, SW4 0x10, SW5 0x20 c1=0; k=PORTB &0x7F ; m=k; CPrint(" Sorti de test par validation par SW5>2 sec ou Timeout de 10sec ou SW4 \r\n"); sprintf(CRam1," Etat initial : k=%5d soit 0x%04X m= %5d soit 0x%04X\r\n",k,k,m,m); Print(CRam1); CRLF1(); PosX=8; // position de depart translation horizontale sur ligne #3 do { c1=0; k=PORTB & 0x7F ; __delay_us(80); // if ( (m != k) && ( k!=0x7F) ) if ( ( PORTB &0x7F) !=0x7F ) { m = PORTB & 0x7F ; Duree_Appui=0; while((PORTB & 0x7F)!=0x7F) // attente relache BP { __delay_us(100); Duree_Appui++; } Duree_Appui=Duree_Appui/10; cx= (unsigned char) m ; cx= ~cx & 0x7F; c1=(cx >> 1); sprintf(CRam1," Bp= 0x%02X, Duree = %5d \r\n",c1,Duree_Appui); Print(CRam1); m=0; Restart_Timeout(); } // attention index LCD va de 1 a  20 , mais contenu ligne de 0 a 19 switch (c1) { case 0 : // pas de BP actionnee, clignote position LCD_Chr_At(3,PosX,255); __delay_ms(200); // change 14-07 was 100 cx=Contenu_Ligne_LCD_En_Cours[PosX-1]; LCD_Chr_At(3,PosX,cx); __delay_ms(200); // change 14-07 was 100 break; case 1: //SW0 PosX--; if(PosX==7) PosX=19; cx=Contenu_Ligne_LCD_En_Cours[PosX-1]; c1=0; break; case 2: //SW1 PosX++; if(PosX==20) PosX=8; cx=Contenu_Ligne_LCD_En_Cours[PosX-1]; // Table c1=0; break; }// switch //if(c1>2 && c1<16) // // rev 02-12 if( ( c1==SW2) || (c1==SW3) ) // SW2(+) ou SW3(-) { px=Contenu_Ligne_LCD_En_Cours+PosX-1; cx=*(px); switch (PosX) // positon en cours de la colonne LCD ( entre 8 et 19 ) { case 8: // Annee * 10 Ajuste_cx('2','6'); break; case 9: //Anne (unites) Ajuste_cx('0','9'); break; case 10:// Mois * 10 Ajuste_cx('0','1'); break; case 11://Mois (unites) Ajuste_cx('0','9'); break; case 12: //Jour *10 Ajuste_cx('0','2'); break; case 13:// Jour (Unites) Ajuste_cx('0','9'); break; case 14: // jS *10 toujours a 0 cx='0'; *(px)=cx; break; case 15: // jS Jour de la Semaine 0 a 6 Ajuste_cx('0','6'); break; case 16: //HH * 10 Ajuste_cx('0','2'); break; case 17: // HH (unites) Ajuste_cx('0','9'); break; case 18: //Minute * 10 Ajuste_cx('0','5'); // break; case 19: // Minute (unites) Ajuste_cx('0','9'); // break; default: break; } // switch PosX // rafraichissement ligne 3 LCD LCD_Write_Text_At(3,1,Contenu_Ligne_LCD_En_Cours); c1=0; Restart_Timeout(); } // if SW2 SW3 // sortie preventive sans MAJ RTC par SW4>2sec ou TimeOut 10Sec if ( (c1==SW4) && ( Duree_Appui>2000)) TMR0IF=1; if (TMR0IF==1) { break; // sortie de boucle sur timeOut 10sec } } // boucle do while while ( c1!=SW5) ; if( (TMR0IF==0) && (c1==SW5) ) //sw5=32 { // on est pas sorti en timeout , et bien via SW5 validation Erase_Line(4); LCD_Write_CText_At(4,l,"Validat. OK par SW5 "); __delay_xSec(1); CPrint("Contenu Ligne #3 LCD :"); Print(Contenu_Ligne_LCD_En_Cours); CRLF1(); px=&Contenu_Ligne_LCD_En_Cours[0]+7; // debut au 8em char du LCD j=0; for (i=0;i<6;i++) { CPrint("px : ");PrintChar(*(px));PrintChar(*(px+1));PrintChar(TAB); cd=*(px)-48; cx=cd<<4; cu=*(px+1)-48; cx=cx+cu ; tmp[7-i]=cx; sprintf(CRam1," i=%2d offset j=%2d tmp[%2d]=%02X\r\n",7-i,j,7-i,tmp[7-i]); Print(CRam1); j=j+2; px++; px++; // deplacement du pointeur , sur 2 caracteres a  droite } CRLF1(); sprintf(CRam1,"new RTC %02x%02x%02x%02x%02x%02x\r\n",tmp[7],tmp[6],tmp[5],tmp[4],tmp[3],tmp[2]); // attention tmp[4] , jS=0 pour Lundi ! Print(CRam1); // tmp[2 a 6 ] remplis via dialogue operateur tmp[0]=0; tmp[1]=0x01; //second tmp[8]=0x00; px=&tmp[0]; I2C1_WriteNBytes(DS3231_ADDR,px,8); CPrint( " Memo dans RTC \r\n"); CRLF1(); LCD_Write_CText_At(4,l,"Sauvegarde dans RTC "); CPrint(" Verif. Nouvelle Date et Heure RTC\r\n"); Display_Date_Time(1); // sur terminal YAT CRLF1(); // __delay_xSec(2); // Erase_Line(3); } else { CPrint(" Sortie via Timeout 10sec ou SW4\r\n"); //LCD_Cmd(LCD_CLEAR); LCD_Write_CText_At(2,l,"...Pas de MAJ RTC! "); LCD_Write_CText_At(3,l,"Sortie preventive "); Erase_Line(4); } __delay_xSec(2); }