Tastiera a matrice.

  • Guido
  • Autore della discussione
  • Platino Utente
  • Platino Utente
Di più
9 Anni 10 Mesi fa #11 da Guido
Risposta da Guido al topic Tastiera a matrice.
Ciao grande, lo trovi nella prima pagina. Per cortesia hai occasione di testarlo?
Grazie

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

  • Guido
  • Autore della discussione
  • Platino Utente
  • Platino Utente
Di più
9 Anni 10 Mesi fa #12 da Guido
Risposta da Guido al topic Tastiera a matrice.
Ciao, mi sono ricordato che ho corretto un tuo aiuto/suggerimento.
Code:
//Nota: granparte del codice lo preso da settorezero. #include <xc.h> #include "PIC18F4550_config.h" #define LCD_DEFAULT #include "LCD_44780.h" #include "LCD_44780.c" #include "delay.h" #include "delay.c" #define MAX_X 16 // numero di colonne del display #define MAX_Y 2 // numero di righe del display unsigned char lcdXpos=0; // posizione colonna attuale unsigned char lcdYpos=0; // posizione riga attuale // Variabile usata per creare un conteggio fittizio di pausa unsigned int i; bit keyok; // flag di pulsante premuto //************************************* // Prototipo di funzione //************************************* void board_initialization (void) { // Imposto PORTA tutti ingressi LATA = 0x00; TRISA = 0xFF; // Imposto PORTB tutti ingressi LATB = 0x00; //Le porte sono settate per avere le colonne come uscita e le righe come ingresso. TRISB=0b10101010; // Imposto PORTC tutti ingressi, RC1 come output LATC = 0x00; TRISC = 0b11111101; // Imposto PORTD tutte uscite, RD0 come ingresso LATD = 0x00; TRISD = 0b00000001; // Imposto PORTE tutti ingressi LATE = 0x00; TRISE = 0xFF; }//void board_initialization (void) // Programma principale //************************************* int main (void){ // Abilita i resistori di pull-up sulla PORTB INTCON2bits.RBPU = 0x00; board_initialization (); /*Definisco un array da scansionare con un ciclo for, che mi permetterà di mettere * a massa le colonne una alla volta e riportare a livello logico alto le altre, andando * dal valore colMask[0] al valore colMask[3], porterò a massa le colonne una alla volta.*/ unsigned char colMask[]= { 0b11111110, // Colonna 1 => RB0 a massa 0b11111011, // Colonna 2 => RB2 a massa 0b11101111, // Colonna 3 => RB4 a massa 0b10111111 // Colonna 4 => RB6 a massa }; unsigned char colScan=0; // va da 0 a 3 per scansionare l'array colMask /*Definisco un array da scansionare con un ciclo for, che mi permetterà la scansione * delle righe e controllare quale riga è andata a massa, più una variabile per contenere * l'indice della riga scansionata.*/ unsigned char rowMask[]= { 0b00000010, // Riga 1 0b00001000, // Riga 2 0b00100000, // Riga 3 0b10000000 // Riga 4 }; unsigned char rowScan=0; //Arrary che contiene i simboli disegnati sul tastierino. unsigned char keys[]={'1','4','7','*','2','5','8','0','3','6','9','#','A','B','C','D'}; unsigned char keypressed=0; // peso numerico del pulsante premuto // Inizializzo il display LCD con quarzo a 20MHz LCD_initialize (20); LCD_backlight (TURN_ON_LED_LCD); /*Effetuo la scansione delle colonne contando da 0 a 3 e ponendo i relativi pin a livello logico basso uno * alla volta e ripristinando a 1 gli altri facendo uso dell' array colMask.*/ for (colScan=0; colScan<4; colScan++){ // porto a massa una colonna alla volta PORTB &= colMask[colScan]; // porto a zero la colonna attuale } /*Per ogni colonna posta a 0 effetuo un ciclo di scansione delle 4 righe.*/ for (rowScan=0; rowScan<4; rowScan++){ } /*Controllo che la riga attuale si trovi a massa effettuando un AND con l'elemento delll'array rowScan * che permette di verificare soltanto il bit interessato su tutta la pota.*/ if (!(PORTB & rowMask[rowScan])) { // Pausa che filtra gli spike. Per i pulsanti è sempre meglio metterla. for (i=0;i<32000; i++) { } if (!(PORTB & rowMask[rowScan])) { keypressed=rowScan+(4*colScan); // numero di pulsante premuto keyok=1; // è stato premuto un pulsante LCD_write_char (keys[keypressed]); //Scrive un carattere sul display. //LCD_write_message(keys[keypressed]); //Vedo il carattere premuto. }//secondo if }//primo if //Rimango in un ciclo continuo fino a che il pulsante non viene rilasciato PORTB=0b10101010; while(PORTB != 0b10101010) { continue; }//while }//main

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

  • Guido
  • Autore della discussione
  • Platino Utente
  • Platino Utente
Di più
9 Anni 10 Mesi fa #13 da Guido
Risposta da Guido al topic Tastiera a matrice.
Ciao, ho trovato che è questa funzione a fare le lineette:
LCD_write_char (keys[keypressed]); //Scrive un carattere sul display.

Purtroppo se scrivo:
LCD_write_message(keys[keypressed]); //Vedo il carattere premuto.
vedo solo i piksel del display.

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

  • alfa75
  • Platino Utente
  • Platino Utente
Di più
9 Anni 10 Mesi fa #14 da alfa75
Risposta da alfa75 al topic Tastiera a matrice.
Guido usi il pickit per programmare?
se si lo tieni collegato anche dopo aver programmato?

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

  • Guido
  • Autore della discussione
  • Platino Utente
  • Platino Utente
Di più
9 Anni 10 Mesi fa #15 da Guido
Risposta da Guido al topic Tastiera a matrice.
Ciao, si uso il pickit3 e lo uso anche per alimentare la schedina (per pigrizia), posso alimentare il pic anche da fonte esterna (batteria da 9V).
Solo che al momento non riesco a proseguire Mpilabx non mi da errore su questa funzione:

LCD_write_char (keys[keypressed]); //Scrive un carattere sul display.
ed è con questa che vedo i trattini (ho fatto una prova su un altro codice).

Purtroppo se scrivo:
LCD_write_message(keys[keypressed]); //Vedo il carattere premuto.
vedo solo i piksel del display.

Non mi viene in mente come risolvere il problema.
Grazie

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

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.

Forum - Ultimi messaggi