cosmin1986 Postat Martie 2, 2015 Partajează Postat Martie 2, 2015 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
svi67 Postat Martie 3, 2015 Partajează Postat Martie 3, 2015 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
Marius Rotundu Postat Martie 4, 2015 Partajează Postat Martie 4, 2015 Daca vrei sa se stinga dupa ce le aprinzi pe toate, adaugi if(n>=5){n=0;} sub linia if(n==4){LED_4=1;} Link spre comentariu
cosmin1986 Postat Martie 4, 2015 Autor Partajează Postat Martie 4, 2015 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
Liviu M Postat Martie 4, 2015 Partajează Postat Martie 4, 2015 (editat) 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 cicluSe 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 Martie 4, 2015 de Liviu M Link spre comentariu
bratueduard Postat Martie 4, 2015 Partajează Postat Martie 4, 2015 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
Liviu M Postat Martie 4, 2015 Partajează Postat Martie 4, 2015 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
cosmin1986 Postat Martie 4, 2015 Autor Partajează Postat Martie 4, 2015 Liviu M multumesc enorm!!! maine ma apuc ca compilez programul si il scriu in pic,va tin la curent cu rezultatul!! Multumesc mult tuturor colegilor pt ajutor! Link spre comentariu
Liviu M Postat Martie 4, 2015 Partajează Postat Martie 4, 2015 Codul e netestat (nu folosesc mikroc), dar ar trebui sa mearga. Daca ai probleme, posteaza-le. Link spre comentariu
cosmin1986 Postat Martie 4, 2015 Autor Partajează Postat Martie 4, 2015 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 cicluSe 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
Liviu M Postat Martie 4, 2015 Partajează Postat Martie 4, 2015 (editat) 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} //mainPS Cand nu se compileaza, e indicat sa postezi mesajele de eroare generate de compilator. Editat Martie 4, 2015 de Liviu M Link spre comentariu
Vezi Muti Postat Martie 5, 2015 Partajează Postat Martie 5, 2015 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
Liviu M Postat Martie 5, 2015 Partajează Postat Martie 5, 2015 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
Marius Rotundu Postat Martie 5, 2015 Partajează Postat Martie 5, 2015 (editat) 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 Martie 5, 2015 de Marius Rotundu Link spre comentariu
core Postat Martie 5, 2015 Partajează Postat Martie 5, 2015 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
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum