Più led con un pulsante solo: come fare?

12 Anni 1 Mese fa #1 da speedfish
Più led con un pulsante solo: come fare? è stato creato da speedfish
Buonasera! Studio da pomeriggio sul seguente problema: ho un pulsante su un pic18f4550 in RB4 e 4 led con transistor su RD0, RD1, RD2 ed RD3 volevo realizzare qualcosa che alla prima pressione del pulsante accenda il led su RD0, lasciato il pulsante si spenga il led; alla seconda pressione del pulsante si accenda il led su RD1, lasciato il pulsante si spenga il led e così via fino ad RD3... Ho provato in 2000 modi differenti ma non sono riuscito nel mio intento in nessun modo... Penso, logicamente, dovrebbe essere:

#include <p18f4550.h>
#include <portb.h>

#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF

void main (void){

char i = 0;

LATA = 0x00;
TRISA = 0xFF;
LATB = 0x00;
TRISB = 0xFF;
LATC = 0x00;
TRISC = 0xFF;
LATD = 0x00;
TRISD = 0x00;
LATE = 0x00;
TRISE = 0xFF;
EnablePullups();

while (1) {
if (PORTBbits.RB4 == 0) {
if (i == 1) {
LATDbits.LATD0 = 1;
LATDbits.LATD1 = 0;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 0;
}
if (i == 2) {
LATDbits.LATD0 = 0;
LATDbits.LATD1 = 1;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 0;
}
if (i == 3) {
LATDbits.LATD0 = 0;
LATDbits.LATD1 = 1;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 0;
}
if (i == 4) {
LATDbits.LATD0 = 0;
LATDbits.LATD1 = 0;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 1;
i=0;
}
}
else {
LATDbits.LATD0 = 0;
LATDbits.LATD1 = 0;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 0;
i++;
}
}
}

Ma chiaramente se non premo il pulsante i aumenta in continuazione... Ma allora come si fa? Credo sia semplice risolvere ma non ho idea di come fare... in attesa di risposte,
Grazie in anticipo,
Giuseppe.

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • speedfish
  • Avatar di speedfish
  • New Member
  • New Member
Di più
12 Anni 1 Mese fa - 12 Anni 1 Mese fa #2 da speedfish
Risposta da speedfish al topic Re: Più led con un pulsante solo: come fare?
Ho pensato a questo e sembra quasi funzionare, solo che ogni tanto i led rimangono accesi:

#include <p18f4550.h>
#include <portb.h>

#pragma config FOSC = HS

#pragma config WDT = OFF

#pragma config LVP = OFF

#pragma config PBADEN = OFF

void main (void)

char i = 0;

LATA = 0x00;
TRISA = 0xFF;

LATB = 0x00;
TRISB = 0xFF;

LATC = 0x00;
TRISC = 0xFF;

LATD = 0x00;
TRISD = 0x00;

LATE = 0x00;
TRISE = 0xFF;

while (PORTBbits.RB4 == 0) {

switch(i) {

case 0:
LATDbits.LATD0 = 1;
LATDbits.LATD1 = 0;
if (PORTBbits.RB4 == 1) {
i++;
break;
}
break;

case 1:
LATDbits.LATD0 = 0;
LATDbits.LATD1 = 1;
if (PORTBbits.RB4 == 1) {
i=0;
break;
}
break;
}
}
}

qualcuno ha delle idee?
Grazie in anticipo :)
Ultima Modifica 12 Anni 1 Mese fa da speedfish.

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • speedfish
  • Avatar di speedfish
  • New Member
  • New Member
Di più
12 Anni 1 Mese fa - 12 Anni 1 Mese fa #3 da Matteo Garia
Risposta da Matteo Garia al topic Re: Più led con un pulsante solo: come fare?
#include <p18f4550.h>
#include <portb.h>

#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF

void main (void){

char i = 0;
static bit premuto;

LATA = 0x00;
TRISA = 0xFF;
LATB = 0x00;
TRISB = 0xFF;
LATC = 0x00;
TRISC = 0xFF;
LATD = 0x00;
TRISD = 0x00;
LATE = 0x00;
TRISE = 0xFF;
EnablePullups();

while (1) {
if (PORTBbits.RB4 == 0) {
if(!premuto){
i++;
premuto = 1;
}


if (i ==5){i=0;}

if (i == 1) {
LATDbits.LATD0 = 1;
LATDbits.LATD1 = 0;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 0;
}
if (i == 2) {
LATDbits.LATD0 = 0;
LATDbits.LATD1 = 1;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 0;
}
if (i == 3) {
LATDbits.LATD0 = 0;
LATDbits.LATD1 = 1;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 0;
}
if (i == 4) {
LATDbits.LATD0 = 0;
LATDbits.LATD1 = 0;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 1;
i=0;
}
}
else {
LATDbits.LATD0 = 0;
LATDbits.LATD1 = 0;
LATDbits.LATD2 = 0;
LATDbits.LATD3 = 0;
i++;
premuto = 0;
}
}
}



Ho messo in evidenza le modifiche.
"premuto" è un flag che tiene conto dello stato del pulsante al ciclo precedente

Il codice funziona solo in teoria, è necessario aggiungere una funzione di antirimbalzo per il pulsante.
Semplicmente quando è premuto puoi aspettare un certo tempo intorno a 50-200 ms e verificare se è ancora premuto, prima di eseguire il codice
Ultima Modifica 12 Anni 1 Mese fa da Matteo Garia.

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Matteo Garia
  • Avatar di Matteo Garia
  • Moderator
  • Moderator
Di più
12 Anni 1 Mese fa #4 da speedfish
Risposta da speedfish al topic Re: Più led con un pulsante solo: come fare?

Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • speedfish
  • Avatar di speedfish
  • New Member
  • New Member
Di più
12 Anni 1 Mese fa #5 da shinshi
Risposta da shinshi al topic Re: Più led con un pulsante solo: come fare?
Scusate l'ignoranza,

Potete spiegarmi cosa è
static bit premuto;
Forse è una variabile statica lunga 1 bit?
Invece:
if(!premuto){
Forse è ....se diverso da 1 {....

Grazie anticipatamente per le risposte.

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • shinshi
  • Avatar di shinshi
  • Elite Member
  • Elite Member
Di più
Moderatori: Mauro LaurentiPinnaStefAMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Login