Problema con codice per tastiera a matrice
Inviato: 21/03/2015, 10:06
Salve, uso un pic18f4550 con Mplabx, non riesco a far funzionare un tastierino a matrice, in pratica dovrei visualizzare il tasto premuto su un display 16x2, potete darmi una mana a dirmi dove ho sbagliato a compilare il codice?
Al momento sul display vedo solo 4 righette orrizontali.
Grazie.
Al momento sul display vedo solo 4 righette orrizontali.
Grazie.
Codice: Seleziona tutto
//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