Bonjour, je souhaite incrémenter ou décrémenter une valeur d'une variable lors de l'appui d'un bouton poussoir afin de réglé l'heure sur mon afficheur LCD, pour cela je dois passé par le bus SPI, je ne souhaite pas faire de conversion BCD.
J'ai trouvé comment incrémenter, mais pour décrémenter je n'y arrive pas car par exemple lorsque je décrémente de "50" à "49" j'obtiens "4?" au lieu de 49. De plus mon code n'est pas du tout optimisé, j'aimerais aussi détecter un front montant lors de l'appui du bouton. J'utilise actuellement la fonction delay qui attends après chaque appui du bouton poussoir.
Voici l'extrait du code :
J'aimerais aussi si possible d'utiliser un filtre anti rebonds pour les boutons poussoirs si c'est possible niveau soft et sans ajouter de condensateur.Code:void regheure() { #define led_v LATCbits.LATC5 #define led_j LATCbits.LATC2 #define led_r LATGbits.LATG3 #define led_b LATGbits.LATG4 #define CS_ON LATDbits.LATD7 = 1 #define CS_OFF LATDbits.LATD7 = 0 #define BP2 PORTEbits.RE0 == 0 #define BP1 PORTEbits.RE1 == 0 #define BP3 PORTEbits.RE2 == 0 #define BP4 PORTEbits.RE3 == 0 if (BP1) { //Lors de l'appui sur BP1, on arrête le comptage de l'heure INTCONbits.TMR0IF = 0; INTCONbits.GIE = 0; hr = 0x00; min = 0x00; sec = 0x00; } if (BP2) {//Lors de l'appui sur BP2 on incrémente les secondes CS_ON; sec = sec + 1; if (sec == 0x0A) { sec = 0x10; } if (sec == 0x1A) { sec = 0x20; } if (sec == 0x2A) { sec = 0x30; } if (sec == 0x3A) { sec = 0x40; } if (sec == 0x4A) { sec = 0x50; } if (sec == 0x5A) { sec = 0x00; } WriteSPI2(0x80);//Ecriture dans le registre de la RTC WriteSPI2(sec); __delay_ms(25); __delay_ms(25); __delay_ms(25); __delay_ms(25); CS_OFF; } if (BP3) {//On décrémente les secondes CS_ON; sec = sec - 1; if (sec == 0xFF) sec = 0x59; if (sec == 0x4A) sec = 0x50; if (sec == 0x3A) sec = 0x40; if (sec == 0x2A) sec = 0x30; if (sec == 0x1A) sec = 0x20; if (sec == 0x0A) sec = 0x10; if (sec == 0x5A) sec = 0x00; } WriteSPI2(0x80);//Ecriture dans le registre de la RTC WriteSPI2(sec); __delay_ms(25); __delay_ms(25); __delay_ms(25); __delay_ms(25); CS_OFF; if (BP4) {//On réactive les interruptions pour la lecture de l'heure (Validation de l'heure) INTCONbits.GIE = 1; INTCONbits.TMR0IF = 1; led_r = 0; led_j = 0; led_v = 0; led_b = 0; } }
Cordialement,
Robintou
-----