J'ai un problème avec les voyants. 2 boutons en entrée et 3 voyants et 7 segments en sortie. Si nous poussons en appuyant une fois sur le bouton, nous pouvons observer "1" sur l'afficheur à 7 segments. Lorsque le bouton de confirmation est enfoncé, le voyant vert s'allume 1 seconde plus tard après que le bouton de confirmation est enfoncé.Utilisation des interruptions de port et des temporisateurs sur CCS
Si on appuie deux fois sur le bouton de sélection, on peut observer "2" sur l'afficheur à 7 segments. Lorsque vous appuyez sur le bouton de confirmation, le voyant jaune s'allume 2 secondes plus tard, après quoi le bouton de confirmation est enfoncé.
Si nous poussons trois fois le bouton de sélection, nous pouvons observer "3" sur l'affichage à 7 segments. Lorsque le bouton de confirmation est enfoncé, le voyant rouge s'allume 3 secondes plus tard, après quoi le bouton de confirmation est enfoncé.
Je dois utiliser les interruptions de port et les minuteurs. Je ne pouvais pas trouver comment les LED seront allumées 1,2 et 3 secondes plus tard. Mon code fonctionne mais quand j'appuie sur le bouton de confirmation, il est allumé instantanément et parfois retardé. Je ne comprends pas. Et segments retardés, aussi. Voici mon code:
#include <msp430.h>
#define BUTTON1 0x04 //confirmation Button P1.2
#define BUTTON2 0x02
#define Yellow (P1OUT |= 0x10)
#define Red (P1OUT |= 0x20)
#define Green (P1OUT |= 0x08)
#define LedOff (P1OUT &= ~0x38)
int counter =0;
int main(void) {
WDTCTL = WDTPW|WDTHOLD;
P2SEL &= ~0x40;
P1DIR |= (BIT5|BIT4|BIT3); // Set the LEDs on P1.5, P1.4, P1.3 as outputs
P1OUT = 0;
P2DIR |= (0x01|0x02|0x04|0x08|0x10|0x20|0x40); //segments
P1OUT = LedOff;
P2OUT = ~0x7F;
P1IE =BUTTON2|BUTTON1; // interrupt enable
P1IES=BUTTON2|BUTTON1; //interrupt edge select from high to low
P1IFG=0x00;
BCSCTL3 |= LFXT1S_2;
TACTL = TASSEL_2|ID_1|MC_3|TAIE|TACLR;
TACCR0 = 3000;
_enable_interrupts();//enable all interrupts
LPM0;
}
#pragma vector=TIMER0_A1_VECTOR
__interrupt void bahar(void){
if(P1IFG==BUTTON2){
P2OUT = ~0x7F;
counter++;
if(counter==1){
P2OUT = 0x06; // 1
}
if (counter == 2) {
P2OUT = 0x5b; // 2
}
if (counter == 3) {
P2OUT = 0x4F; // 3
counter =0;
}
}
if(P1IFG==BUTTON1){
P1OUT =LedOff;
if (counter == 1) {
Green;
}
if (counter == 2) {
Yellow;
}
if (counter == 0) {
Red;
}
// TACTL |= TACLR;
}
P1IFG=0x00; //clear the interrupt flag
}