Problema con codice per tastiera a matrice

Problemi legati alla programmazione dei microcontrollori.
Consigli su come realizzare routine dedicate.
Rispondi
picgu
Messaggi: 2
Iscritto il: 21/03/2015, 10:04
Home_Page: http://

Problema con codice per tastiera a matrice

Messaggio da picgu » 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.

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

picgu
Messaggi: 2
Iscritto il: 21/03/2015, 10:04
Home_Page: http://

Re: Problema con codice per tastiera a matrice

Messaggio da picgu » 21/03/2015, 14:55

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.

Rispondi