PDA

Visualizza la versione completa : [C - PIC16F877] Keypad 4x4 a matrice


deluxpc
05-03-2010, 16:08
Ho un dubbio nel scrivere il codice per il controllo di un tastierino alfanumerico 4x4 a matrice.
Devo visualizzare attraverso un software in C, utilizzando la suite MikroC di MikroElektronica, su un display i tasti che premo nel tastierino (0 1 2 3 4 5 6 7 8 9 A B C D * #).
Il codice che ho scritto è il seguente:



void main() {

unsigned int kp;

portb= 0;
trisb= 00001111;
portc= 0;

kp = 0;

Keypad_Init(&PORTB);

Lcd_Init(&PORTC); // Initialize LCD on PORTC
Lcd_Cmd(LCD_CLEAR); // Clear display
Lcd_Cmd(LCD_CURSOR_OFF); // Cursor off

Lcd_Out(1, 1, "Premuto:" );
Lcd_Out(3, 1, "A=10 B=20 C=30 D=40" );

ciclo:

//--- preparazione valori out

if(portb.F3=1, portb.F4=1) kp=1; //tasto 1
if(portb.F3=1, portb.F6=1) kp=2; //tasto 2
//stringa per tasto seguente;
//stringa per tasto seguente;
//stringa per tasto seguente;
//stringa per tasto seguente;
//stringa per tasto seguente;
//stringa per tasto seguente;
//stringa per tasto seguente;
//stringa per tasto seguente;
//stringa per tasto seguente;
//stringa per tasto seguente;
//stringa per tasto seguente;
//stringa per tasto seguente;

//--- preparazione valori out

goto ciclo;

kp = Keypad_Read(); //questa stringa forse non serve

Lcd_Chr(1, 10, kp); //stampa su LCD

}//fine


Questo codice però non mi funziona.
On-line non riesco a trovare niente.
Tempo addietro avevo fatto una cosa simile e andava, ora non riesco a capire...

ESSE-EFFE
05-03-2010, 16:36
if(portb.F3=1, portb.F4=1) kp=1; //tasto 1
if(portb.F3=1, portb.F6=1) kp=2; //tasto 2

Questo codice però non mi funziona.

Che significa "non mi funziona"? Non compila? Non esce nulla?

Quegli if mi sembrano strani, come vengono interpretati?

Niente antirimbalzo?

E poi la visualizzazione del tasto premuto è fuori dal ciclo infinito...

HTH,

deluxpc
05-03-2010, 16:50
Originariamente inviato da ESSE-EFFE
Che significa "non mi funziona"? Non compila? Non esce nulla?

Quegli if mi sembrano strani, come vengono interpretati?

Niente antirimbalzo?

E poi la visualizzazione del tasto premuto è fuori dal ciclo infinito...

HTH,

Viene compilato perfettamente.
Sul display esce la scritta "Premuto:" con sotto l'altra scritta, ma al nel posto carattere n. 10 non esce il dato relativo il tasto premuto...

oregon
05-03-2010, 16:53
Quelle if sono sbagliate ... cosa vorrebbero dire? Il confronto si fa con == e la virgola in mezzo non ha senso ...

ESSE-EFFE
05-03-2010, 16:59
Viene compilato perfettamente.
Sul display esce la scritta "Premuto:" con sotto l'altra scritta, ma al nel posto carattere n. 10 non esce il dato relativo il tasto premuto...

Sì... e quindi? Sulle altre cose che ho scritto che mi dici?

deluxpc
05-03-2010, 17:05
devo fare un test tra due pin della porta del PIC per vedere quale tasto del testierino vado a premere...

oregon
05-03-2010, 17:12
E ti ho detto che le if sono sbagliate ... ma tu conosci la sintassi del C ?

deluxpc
05-03-2010, 17:19
poco...senò non chiedevo "aiuto", senò avrei saputo farlo da solo... ;)

oregon
05-03-2010, 17:47
Originariamente inviato da deluxpc
poco...senò non chiedevo "aiuto", senò avrei saputo farlo da solo... ;)

Non è così logico come vorresti farci credere ... qui c'è chi chiede aiuto, ma conosce le basi sintattiche del linguaggio ... quindi, se hai scritto qui perchè vuoi un aiuto, devi anche dire che non sai come si scrive una if ... (ovvero che non conosci il linguaggio con cui realizzi il programma) ...

Ad esempio potresti scrivere

if (portb.F3 == 1) kp=1;

ma questo solo da un punto di vista sintattico ...

Per capire se quello che vuoi fare è corretto, dovresti dirci, ad esempio, perchè controlli i pin della porta F (F3, F4 ...) che non mi risulta esserci in quel micro.

La goto non ha senso, la funzione Keypad_Read non si sa a cosa serva nè come funzioni ...

A questo punto, non si puo' dare nessun aiuto che abbia senso ...

deluxpc
05-03-2010, 17:56
guarda che la porta da controllare è la B (portb) e i pin sui quali agire sono, in qst caso, il 3 e il 4 (F3, F4).

portb.F3, agisco sul pin 3 della porta B.

Io devo fare un test di due pin differenti, quindi nell'espressione devo inserire entrambi i pin per sapere quando entrambi vanno a livello logico alto. ;)

Loading