- Messaggi: 583
- Ringraziamenti ricevuti 1
Tastiera a matrice.
- Guido
- Autore della discussione
- Platino Utente
-
Less
Di più
9 Anni 11 Mesi fa - 9 Anni 10 Mesi fa #1
da Guido
Tastiera a matrice. è stato creato da Guido
No eBay APP ID and/or Cert ID defined in Kunena configurationCiao, ho comprato un tastierino a matrice a 16 pulsanti
per iniziare ad imparare a usarlo, mi date qualche dritta su come scrivere il codice per visualizzare il numero del pulsante premuto?
Grazie.
per iniziare ad imparare a usarlo, mi date qualche dritta su come scrivere il codice per visualizzare il numero del pulsante premuto?
Grazie.
Ultima Modifica 9 Anni 10 Mesi fa da StefA.
Si prega Accesso o Crea un account a partecipare alla conversazione.
- alfa75
-
- Platino Utente
-
Less
Di più
- Messaggi: 527
- Ringraziamenti ricevuti 86
9 Anni 11 Mesi fa #2
da alfa75
Risposta da alfa75 al topic Tastiera a matrice.
intanto butta un occhio su questo...
www.settorezero.com/wordpress/corso-prog...astierino-a-matrice/
www.settorezero.com/wordpress/corso-prog...astierino-a-matrice/
Si prega Accesso o Crea un account a partecipare alla conversazione.
- Guido
- Autore della discussione
- Platino Utente
-
Less
Di più
- Messaggi: 583
- Ringraziamenti ricevuti 1
9 Anni 11 Mesi fa #3
da Guido
Risposta da Guido al topic Tastiera a matrice.
Ottimo grazie.
Si prega Accesso o Crea un account a partecipare alla conversazione.
- Guido
- Autore della discussione
- Platino Utente
-
Less
Di più
- Messaggi: 583
- Ringraziamenti ricevuti 1
9 Anni 11 Mesi fa #4
da Guido
Risposta da Guido al topic Tastiera a matrice.
Ciao, ho provato a mettere in pratica il codice di settorezero, purtroppo non posso testarlo, non ho ancora il tastierino, ricevo una warring in questa funzione:
LCD_write_message(keys[keypressed]); //Vedo il carattere premuto.
Tastiera a matrice con display.c:110: warning: (357) illegal conversion of integer to pointer
Per cortesia, per curiosità, potete testarmi il codice per vedere se funziona?
Grazie.
LCD_write_message(keys[keypressed]); //Vedo il carattere premuto.
Tastiera a matrice con display.c:110: warning: (357) illegal conversion of integer to pointer
Per cortesia, per curiosità, potete testarmi il codice per vedere se funziona?
Grazie.
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_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.
- alfa75
-
- Platino Utente
-
Less
Di più
- Messaggi: 527
- Ringraziamenti ricevuti 86
9 Anni 11 Mesi fa #5
da alfa75
Risposta da alfa75 al topic Tastiera a matrice.
Ciao Guido
prova a sostituire con LCD_write char dovrebbe funzionare
prova a sostituire con LCD_write char dovrebbe funzionare
Si prega Accesso o Crea un account a partecipare alla conversazione.
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.
Forum - Ultimi messaggi
-
- Freedom III e compilazioni fallite
- da Black
-
- MODULO GSM SIM900A
- da FABRIZIO
-
- LTerminal - nuove funzioni
- da Mauro Laurenti
-
- Aggiornamento sito completato
- da Mauro Laurenti
-
- registro a scorrimento PIPO in cascata
- da Mauro Laurenti