Sari la conținut
ELFORUM - Forumul electronistilor

Aprindere 4 leduri cu pic push buton


cosmin1986

Postări Recomandate

Buna,si ma adresez tuturor colegilor cu o mica problema.As dori sa ma ajute mai bine spus un coleg care se pricepe la pic sa imi conceapa un program pt pic16f84a care sa imi aprinda 4 leduri pe rand si in ordine la apasare unui buton push.

 

exp cand apas odata pe buton sa imi aprinda ledul 1(sa ramana si aprins),daca mai apas odata sa imi aprinda urmatorul led(sa ramana aprins) si tot asa pana la ledul 4.

 

Multumesc mult de tot!!!!

Link spre comentariu
  • Răspunsuri 19
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Liviu M

    8

  • cosmin1986

    4

  • core

    3

  • Marius Rotundu

    2

Top autori în acest subiect

sbit LED_1 at RB0_bit;sbit LED_2 at RB1_bit;sbit LED_3 at RB2_bit;sbit LED_4 at RB3_bit;short n=0;void main() {PORTA = 0x00;PORTB = 0x00;TRISA = 0x01;TRISB = 0x00;LED_1=0;LED_2=0;LED_3=0;LED_4=0; do { if(Button(&PORTA, 0, 1, 0)){ n++;   } if(n==1){LED_1=1;} if(n==2){LED_2=1;} if(n==3){LED_3=1;} if(n==4){LED_4=1;} Delay_ms(750);  } while(1); //Sfarsit ciclu}

 

Cod scris in MikroC.

Link spre comentariu

Este ok,dar o modificare de exp cand apas pe buton sa imi aprinda ledul 1 si sa ramana aprins pana apas iar butonul,cand am apasat  butonul sa se stinga ledul nr1 si sa se aprinda nr 2,si sa ramana aprins,cand apas iar butonul sa se aprinda nr3 si sa se stinga nr 2 si tot asa pana la nr 4.si ciclul sa se repete cand s-a ajuns la ultimul led.

 

 

Multumesc mult 

svi67 si Marius Rotundu daca se poate add ym: [email protected] sa explic mai in detaliu!
Link spre comentariu
do {   if(Button(&PORTA, 0, 1, 0)){	  n++;   }   if(n==1){      PORTB = PORTB & 0xF0; //stinge ledurile, lasa RB7..RB4 cum erau; se poate scrie si PORTB &= 0xF0;      LED_1=1;   }   if(n==2){      PORTB = PORTB & 0xF0; //stinge ledurile, lasa RB7..RB4 cum erau; se poate scrie si PORTB &= 0xF0;      LED_2=1;   }   if(n==3){      PORTB = PORTB & 0xF0; //stinge ledurile, lasa RB7..RB4 cum erau; se poate scrie si PORTB &= 0xF0;      LED_3=1;   }   if(n==4){      PORTB = PORTB & 0xF0; //stinge ledurile, lasa RB7..RB4 cum erau; se poate scrie si PORTB &= 0xF0;      LED_4=1;      n = 0; //reseteaza-l pe n, s-o ia de la capat   }   Delay_ms(750);  } while(1);	 //Sfarsit ciclu
Se poate face si inlocuind if-urile cu switch: 
do {   if(Button(&PORTA, 0, 1, 0)){      n++;   }   switch(n){       case 1 : PORTB = PORTB & 0xF0; //stinge ledurile, lasa RB7..RB4 cum erau; se poate scrie si PORTB &= 0xF0;                LED_1=1;                break;       case 2 : PORTB = PORTB & 0xF0; //stinge ledurile, lasa RB7..RB4 cum erau; se poate scrie si PORTB &= 0xF0;                LED_2=1;                break;       case 3 : PORTB = PORTB & 0xF0; //stinge ledurile, lasa RB7..RB4 cum erau; se poate scrie si PORTB &= 0xF0;                LED_3=1;                break;       case 4 : PORTB = PORTB & 0xF0; //stinge ledurile, lasa RB7..RB4 cum erau; se poate scrie si PORTB &= 0xF0;                LED_4=1;                n = 0; //reseteaza-l pe n, s-o ia de la capat               break;   } //switch(n)   Delay_ms(750);  } while(1);     //Sfarsit ciclu
Editat de Liviu M
Link spre comentariu

ar trebui sa mearga asa:

 

 do { if(Button(&PORTA, 0, 1, 0)){ n++;   } if(n==1){LED_1=1;} if(n==2){LED_1=0; LED_2=1;} if(n==3){LED_1=0; LED_2=0; LED_3=1;} if(n==4){LED_1=0; LED_2=0; LED_3=0; LED_4=1;} Delay_ms(750);  } while(1); //Sfarsit ciclu}

Link spre comentariu

Iar daca mai definesti o variabila "buton apasat" pe care o faci 1 cand detectezi butonul apasat, poti sa mai reduci din PORTB &= 0xF0:

unsigned char ucButApasat = 0;do {   if(Button(&PORTA, 0, 1, 0)){      n++;      ucButApasat++;   }   if (ucButApasat) {      ucButApasat = 0; //reseteaza flagul buton apasat      PORTB = PORTB & 0xF0; //stingem toate ledurile      switch(n){        case 1 : LED_1=1;                  break;         case 2 : LED_2=1;                  break;         case 3 : LED_3=1;                  break;         case 4 : LED_4=1;                  n = 0; //reseteaza-l pe n, s-o ia de la capat                  break;      } //switch(n)   } //if (ucButApasat)   Delay_ms(750);  } while(1);     //Sfarsit ciclu
Link spre comentariu
do {   if(Button(&PORTA, 0, 1, 0)){	  n++;   }   if(n==1){      PORTB = PORTB & 0xF0; //stinge ledurile, lasa RB7..RB4 cum erau; se poate scrie si PORTB &= 0xF0;      LED_1=1;   }   if(n==2){      PORTB = PORTB & 0xF0; //stinge ledurile, lasa RB7..RB4 cum erau; se poate scrie si PORTB &= 0xF0;      LED_2=1;   }   if(n==3){      PORTB = PORTB & 0xF0; //stinge ledurile, lasa RB7..RB4 cum erau; se poate scrie si PORTB &= 0xF0;      LED_3=1;   }   if(n==4){      PORTB = PORTB & 0xF0; //stinge ledurile, lasa RB7..RB4 cum erau; se poate scrie si PORTB &= 0xF0;      LED_4=1;      n = 0; //reseteaza-l pe n, s-o ia de la capat   }   Delay_ms(750);  } while(1);	 //Sfarsit ciclu
Se poate face si inlocuind if-urile cu switch: 
do {   if(Button(&PORTA, 0, 1, 0)){      n++;   }   switch(n){       case 1 : PORTB = PORTB & 0xF0; //stinge ledurile, lasa RB7..RB4 cum erau; se poate scrie si PORTB &= 0xF0;                LED_1=1;                break;       case 2 : PORTB = PORTB & 0xF0; //stinge ledurile, lasa RB7..RB4 cum erau; se poate scrie si PORTB &= 0xF0;                LED_2=1;                break;       case 3 : PORTB = PORTB & 0xF0; //stinge ledurile, lasa RB7..RB4 cum erau; se poate scrie si PORTB &= 0xF0;                LED_3=1;                break;       case 4 : PORTB = PORTB & 0xF0; //stinge ledurile, lasa RB7..RB4 cum erau; se poate scrie si PORTB &= 0xF0;                LED_4=1;                n = 0; //reseteaza-l pe n, s-o ia de la capat               break;   } //switch(n)   Delay_ms(750);  } while(1);     //Sfarsit ciclu

Nu reusesc sa compilez pt a genera fiserul hex ....imi da eroare..daca se poate sa mi-l compileze un coleg..multumesc.

Link spre comentariu

Pai asta nu e codul complet, e doar partea cu do{...} while.Restul iei din programul original.

sbit LED_1 at RB0_bit;sbit LED_2 at RB1_bit;sbit LED_3 at RB2_bit;sbit LED_4 at RB3_bit;short n=0;void main() {  PORTA = 0x00;  PORTB = 0x00;  TRISA = 0x01;  TRISB = 0x00;  LED_1=0;  LED_2=0;  LED_3=0;  LED_4=0;  do {    if(Button(&PORTA, 0, 1, 0)){       n++;    }    switch(n){      case 1 : PORTB = PORTB & 0xF0; //stinge ledurile, lasa RB7..RB4 cum erau; se poate scrie si PORTB &= 0xF0;             LED_1=1;             break;      case 2 : PORTB = PORTB & 0xF0; //stinge ledurile, lasa RB7..RB4 cum erau; se poate scrie si PORTB &= 0xF0;             LED_2=1;             break;      case 3 : PORTB = PORTB & 0xF0; //stinge ledurile, lasa RB7..RB4 cum erau; se poate scrie si PORTB &= 0xF0;             LED_3=1;             break;      case 4 : PORTB = PORTB & 0xF0; //stinge ledurile, lasa RB7..RB4 cum erau; se poate scrie si PORTB &= 0xF0;             LED_4=1;             n = 0; //reseteaza-l pe n, s-o ia de la capat             break;    } //switch(n)    Delay_ms(750);  } while(1); //Sfarsit ciclu} //main
PS Cand nu se compileaza, e indicat sa postezi mesajele de eroare generate de compilator. Editat de Liviu M
Link spre comentariu

provocare:

se poate cu mai putine linii de code?

char n=0;void main(){  PORTA = 0x00;  PORTB = 0x00;  TRISA = 0x01;  TRISB = 0x00;  while(1)  {    if(Button(&PORTA, 0, 1, 0))    {       PORTB&=0xF0;       PORTB|=(1<<n++);       n%=4;    }  }}
Link spre comentariu

He, he, imi place. :)Pe undeva pe la jumatatea distantei intre ultimul pus de mine si al tau probabil ajungeam si eu, da' la al tau in nici un caz.Pe de alta parte, am fost tentat si eu de o "optimizare" in genul

PORTB|=(1<<n++);

da' m-am straduit sa nu. Am preferat sa scriu defalcat, ca sa fie mai clar ce am incercat sa fac (aveam senzatia ca initiatorul topicului incearca sa invete, caz in care codul tau s-ar putea sa fie cam criptic).

Link spre comentariu

Nu reusesc sa compilez pt a genera fiserul hex ....imi da eroare..daca se poate sa mi-l compileze un coleg..multumesc.

Nu te incomodeaza la compilare dar la inițializarea porturilor (trisx, portx) o sa ma fie nevoie de o linie care sa dezactiveze functiile multiplexate pe respectivul pin (de exemplu comparatorul) bineînteles depinde ce pic folosesti. Editat de Marius Rotundu
Link spre comentariu

oare asta merge?

doar ca porneste cu un bec aprins. :)

void main(){  PORTA = 0x00;  PORTB = 0x01;  TRISA = 0x01;  TRISB = 0x00;  while(1)  {    if(Button(&PORTA, 0, 1, 0))    {       PORTB = ( PORTB << 1 ) | ( PORTB >> 3 );    }  }}
Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări