In pratica memorizzo il codice, lo digito sulla tastiera, se il codice è esatto accendo il led su LATD0.
La parte di codice che riguarda il tastierino funziona, infatti vedo solo i tasti premuti.
Uso un pic18f4550 con MplabX V. 2.35.
Grazie
- Codice: Seleziona tutto
/*Nota: codice tratto da settorezero, riadattato da: StefA */
#include <xc.h>
#include "PIC18F4550_config.h"
#define LCD_DEFAULT
#include "LCD_44780.h"
#include "LCD_44780.c"
#include "delay.h"
#include "delay.c"
//*************************************
// Prototipi di funzione
//*************************************
void board_initialization (void);
//void serratura_elettronica (void);
/* tastierino numerico collegato su PORTB
uso un tastierino 4x4 (16 pulsanti)
Per comodità ho collegato il tastierino in questo modo
(C=colonna R=riga)
R1 = RB1
R2 = RB3
R3 = RB5
R4 = RB7
C1 = RB0
C2 = RB2
C3 = RB4
C4 = RB6
I pin di riga saranno input ed attiveremo le resistenze di pullup interne
i pin di colonna saranno output e messi a 1 di default
*/
/* Definisco un array, che scansiona con un ciclo FOR, esso permette di mettere a massa
* le colonne una alla volta e riporta a livello logico alto le altre.
* Andando quindi dal valore colMask[0] al valore colMask[3], porto 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, che scansiona con un ciclo FOR, esso permette di mettere a massa
* le righe una alla volta e riporta a livello logico alto le altre.
* Andando quindi dal valore rowMask[0] al valore rowMask[3], porto a massa le righe una alla volta. */
unsigned char rowMask[]=
{
0b00000010, // Riga 1
0b00001000, // Riga 2
0b00100000, // Riga 3
0b10000000 // Riga 4
};
unsigned char rowScan=0; // va da 0 a 3 per scansionare l'array rowMask
//Array che contiene i simboli disegnati sui pulsanti del tastierino, disposti in un certo ordine:
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
unsigned char keyok; // flag del pulsante premuto
//unsigned char x=1;
//unsigned char y=2;
//unsigned char z=3;
unsigned char k;
// Impostazione codice segreto e inizializzazione codice digitato
#define dim 4 // lunghezza del codice segreto
unsigned char key_code[dim] = {'1','2','3','4'};
unsigned char pressed_code[dim];
char code_index = 0;
char code_ok = 0; // variabile per determinare se il codice è esatto
//*************************************
// Programma principale
//*************************************
int main (void){
unsigned char frase [] = " StefA TEST ";
// Abilita i resistori di pull-up sulla PORTB
INTCON2bits.RBPU = 0x00;
keyok=0;
board_initialization ();
//serratura_elettronica ();
// Inizializzo il display LCD con quarzo a 20MHz
LCD_initialize (20);
LCD_backlight (LCD_TURN_ON_LED);
LCD_write_message ("Tastiera Matrice");
LCD_goto_line (2);
LCD_write_string (frase);
delay_s(2);
LCD_clear();
LCD_write_message ("Premere un tasto");
// Ciclo infinito
while(1) {
/*Effettuo la scansione delle colonne contando da zero a 3 e metto i relativi
*pin a livello logico basso uno alla volta, ripristinando a 1 gli altri facendo
*uso dell?array colMask */
for (colScan=0; colScan<4; colScan++) // porto a massa una colonna alla volta
{
PORTB=0xFF; // porto tutte le colonne a 1
PORTB &= colMask[colScan]; // porto a zero la colonna attuale
/*Effettuo la scansione delle righe contando da zero a 3 e metto i relativi
*pin a livello logico basso uno alla volta, ripristinando a 1 gli altri facendo
*uso dell?array rowMask */
for (rowScan=0; rowScan<4; rowScan++) {
/*Controllo se la riga attuale si trova a massa effettuando un AND
*con l?elemento dell?array rowScan che mi permette di verificare soltanto
*il bit che mi interessa su tutta la porta */
if (!(PORTB & rowMask[rowScan])) // Riga rowScan trovata a massa
{
delay_ms(50); //Ritardo spike
if (!(PORTB & rowMask[rowScan])) {
/*Se viene confermato che un pulsante è stato premuto, imposto
*il valore che permette di risalire al tasto e indico al programma
*che un pulsante è stato premuto */
keypressed=rowScan+(4*colScan); // numero di pulsante premuto
keyok=1; // è stato premuto un pulsante
}
}
} // fine scansione righe
}//for // fine scansione colonne
if (keyok) // è stato premuto un pulsante
{
// Solo dopo che ho controllato in che punto si trova il
// cursore posso piazzare il carattere premuto
LCD_goto_line (2);
LCD_write_char(keys[keypressed]);
keyok=0; // resetto il flag del pulsante premuto
// rimango in un ciclo continuo fino a che il pulsante non viene rilasciato
PORTB=0b10101010;
while(PORTB != 0b10101010)
/*Se voglio che i simboli visualizzati siano senpre visibili sul
display (cioè cambino alla pressione del tasto) omettere:
LCD_goto_line (2);
LCD_write_message (" ");*/
LCD_goto_line (2);
//delay_s(1); //determino per quanto tempo voglio visualizzare il simbolo
delay_ms(800);
LCD_write_message (" ");
{continue;}
}//if (keyok)
if (code_index == dim) { // controllo codice
for ( k=0; k=<dim; k++) {
if (key_code[k] == pressed_code[k]){
code_ok = 1;
}//if (code_index == dim
else { // cifra del codice errata, codice sbagliato
code_ok = 0; // codice errato, esce dal ciclo
}//else
}//for
if (code_ok == 1){ // se il codice è giusto accendo LATD0
LATDbits.LATD0 = 1;
}//if (code_ok == 1
else {
LATDbits.LATD0 = 0;
}//else
code_ok = 0; // resetto la variabile se il codice è giusto (cioè se code_ok era = 1)
code_index = 0; // resetto l'indice che scorre l'array del codice
} // if (code_index == dim)
}//while
}//main
//*************************************
// Implementazione della funzione
//*************************************
void board_initialization (void) {
//******************//
//Impostazione porte//
//******************//
// Imposto PORTA tutti ingressi
LATA = 0x00;
TRISA = 0x00;
// Imposto PORTB
LATB = 0x00;
TRISB = 0b10101010;
// Imposto PORTC tutti ingressi e RC1 come uscita
LATC = 0x00;
TRISC = 0b11111101;
// Imposto PORTD tutte uscite
LATD = 0x00;
TRISD = 0x00;
// Imposto PORTE tutti ingressi
LATE = 0x00;
TRISE = 0xFF;
}//void board_initialization (void)
//*************************************
// Funzione serratura
//*************************************
//void serratura_elettronica (void){
/*if ( tasto1 == 0 ) {
//Questa funzione serve a far scorrere la scritta.
//x determina di quanto deve spostarsi la scritta.
//y se 1 la scritta scorre sopra, se 2 sotto.
LCD_goto_xy (x,2);
LCD_write_message ("*");
}//if
else {
// Altrimenti codice errato, led spento
LATAbits.LATA1 = 0;
}//else
if ( tasto2 == 0 ) {
//Questa funzione serve a far scorrere la scritta.
//x determina di quanto deve spostarsi la scritta.
//y se 1 la scritta scorre sopra, se 2 sotto.
LCD_goto_xy (y,2);
LCD_write_message ("*");
}//if
else {
// Altrimenti codice errato, led spento
LATAbits.LATA1 = 0;
}//else
*/
// }//void serratura_elettronica
Parte codice serratura
- Codice: Seleziona tutto
unsigned char k;
// Impostazione codice segreto e inizializzazione codice digitato
#define dim 4 // lunghezza del codice segreto
unsigned char key_code[dim] = {'1','2','3','4'};
unsigned char pressed_code[dim];
char code_index = 0;
char code_ok = 0; // variabile per determinare se il codice è esatto
if (code_index == dim) { // controllo codice
for ( k=0; k=<dim; k++) {
if (key_code[k] == pressed_code[k]){
code_ok = 1;
}//if (code_index == dim
else { // cifra del codice errata, codice sbagliato
code_ok = 0; // codice errato, esce dal ciclo
}//else
}//for
if (code_ok == 1){ // se il codice è giusto accendo LATD0
LATDbits.LATD0 = 1;
}//if (code_ok == 1
else {
LATDbits.LATD0 = 0;
}//else
code_ok = 0; // resetto la variabile se il codice è giusto (cioè se code_ok era = 1)
code_index = 0; // resetto l'indice che scorre l'array del codice
} // if (code_index == dim)

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)






