- Messaggi: 583
- Ringraziamenti ricevuti 1
Tastiera a matrice.
- Guido
- Autore della discussione
- Platino Utente
-
Less
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
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 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
-
Less
Di più
- Messaggi: 583
- Ringraziamenti ricevuti 1
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.
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
-
Less
Di più
- Messaggi: 527
- Ringraziamenti ricevuti 86
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?
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
-
Less
Di più
- Messaggi: 583
- Ringraziamenti ricevuti 1
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
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 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