Sketch Tastiera 3x4 e display I2C
/* 2
Utilizzo di un Display con circuiteria I2C e tastiera a matrice 3x4
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
unsigned char a;
unsigned char b;
unsigned char c;
int a1, b1, c1;
int rit = 150;
void setup ()
{
 Serial.begin(9600);
 lcd.init(); // inizializza il display
 lcd.backlight(); //accende la retroilluminazione
DDRD = 0b00000000; // Il registro di direzione dati Port D - lettura/scrittura. 1 = pin_Out, 0 = Pin_In
 // In particolare, Pin da 4 a 7 come input.
PORTD = 0b11110000; // Ponendo 1 ad un pin dichiarato come Input attiva resistenza di pull up
// Scrittura dei testi sul display
 lcd.setCursor(0, 0);
 lcd.print("CORSO ARDUINO ED");

 lcd.setCursor(0, 1);
 lcd.print("ELEM.DI ROBOTICA");
 delay (5000);
 lcd.clear();
}
void loop ()
{
// Dispongo il pin 8 come output
DDRB = 0b100001; // PIN 13,.....,8 Stringa di sei bit. 1 = pin_Out, 0 = Pin_In
// Porto a 0 la prima colonna A
PORTB =0b011110; // Pin 8 e 13 = Low
a = PIND & 0b11110000; // And logico con Porta D
switch (a)
{
 case 112:
 Serial.println("1"); a1 = 1; lcd.print("1");
 break;
 case 176:
 Serial.println("4"); a1 = 4; lcd.print("4");
 break;
 case 208:
 Serial.println("7"); a1 = 7; lcd.print("7");
 break;
 case 224:
 Serial.println("*"); lcd.print("*");
 a1=b1=c1=0; // Premendo * le variabili si azzerano. Utile in caso di errato inserimento codice.
 Serial.println("Reset"); lcd.print("Reset"); delay(2000); lcd.clear();
 break;
}
delay(rit);
// Dispongo il pin 9 come output
DDRB = 0b100010; // PIN 13,.....,8 Stringa di sei bit. 1 = pin_Out, 0 = Pin_In
// Porto a 0 la seconda colonna B
 PORTB =0b011101; // Pin 9 e 13 = Low
b = PIND & 0b11110000; // And logico
switch (b)
{
 case 112:
 Serial.println("2"); b1 = 2; lcd.print("2");
 break;
 case 176:
 Serial.println("5"); b1 = 5; lcd.print("5");
 break;
 case 208:
 Serial.println("8"); b1 = 8; lcd.print("8");
 break;
 case 224:
 Serial.println("0"); b1 = 0; lcd.print("0");
 break;
}
delay(rit); 
// Dispongo il pin 10 come output
DDRB = 0b100100; // PIN 13,.....,8 Stringa di sei bit. 1 = pin_Out, 0 = Pin_In
// Porto a 0 la terza colonna C
 PORTB =0b011011; // Pin 10 e 13 = Low
c = PIND & 0b11110000; // And logico
switch (c)
{
 case 112:
 Serial.println("3"); c1 = 3; lcd.print("3");
 break;
 case 176:
 Serial.println("6"); c1 = 6; lcd.print("6");
 break;
 case 208:
 Serial.println("9"); c1 = 9; lcd.print("9");
 break;
 case 224:
 Serial.println("#"); lcd.print("#");
 if(a1+b1+c1==6)
 {
 PORTB =0b100000; // Password Ok. Attiva led pin 13 + relè.
 Serial.println(a1+b1+c1); lcd.clear(); lcd.print("Ok Password");
 delay (1000);
 }
 break;
delay(rit);
}
}