#include <stdio.h>
#include "pico/stdlib.h"
// Définition des broches pour le LCD
#define RS 2
#define EN 3
#define D4 4
#define D5 5
#define D6 6
#define D7 7
// Définition des broches pour le pavé numérique
const uint keypad_rows[] = {8, 9, 10, 11}; // Lignes
const uint keypad_cols[] = {12, 13, 14, 15}; // Colonnes
// Matrice des touches du pavé numérique
const char keys[4][4] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// Prototypes des fonctions
void lcd_init();
void lcd_command(uint8_t cmd);
void lcd_write_char(char c);
void lcd_clear();
char keypad_get_key();
int main() {
// Initialisation des entrées/sorties et de l’écran LCD
stdio_init_all();
lcd_init();
// Initialisation des broches pour le pavé numérique
for (int i = 0; i < 4; i++) {
gpio_init(keypad_rows[i]);
gpio_set_dir(keypad_rows[i], GPIO_OUT);
gpio_put(keypad_rows[i], 1); // Mettre les lignes à 1
gpio_init(keypad_cols[i]);
gpio_set_dir(keypad_cols[i], GPIO_IN);
gpio_pull_down(keypad_cols[i]); // Activer la résistance pull-down
}
lcd_clear(); // Efface l’écran
lcd_write_char('>'); // Affiche un curseur initial
while (1) {
char key = keypad_get_key(); // Lire une touche du pavé numérique
if (key) {
lcd_clear(); // Efface l’écran
lcd_write_char(key); // Affiche la touche sur l’écran LCD
}
sleep_ms(200); // Anti-rebond
}
}
// --- Fonctions LCD ---
void lcd_init() {
gpio_init(RS); gpio_init(EN);
gpio_init(D4); gpio_init(D5); gpio_init(D6); gpio_init(D7);
gpio_set_dir(RS, GPIO_OUT); gpio_set_dir(EN, GPIO_OUT);
gpio_set_dir(D4, GPIO_OUT); gpio_set_dir(D5, GPIO_OUT);
gpio_set_dir(D6, GPIO_OUT); gpio_set_dir(D7, GPIO_OUT);
// Initialisation de l'écran en mode 4 bits
lcd_command(0x33);
lcd_command(0x32); // Mode 4 bits
lcd_command(0x28); // 2 lignes, caractères 5x8
lcd_command(0x0C); // Affichage ON, curseur OFF
lcd_command(0x06); // Déplacement automatique du curseur
lcd_clear(); // Nettoyer l'écran
}
void lcd_command(uint8_t cmd) {
gpio_put(RS, 0); // Mode commande
// Envoyer les 4 bits de poids fort
gpio_put(D4, (cmd >> 4) & 1);
gpio_put(D5, (cmd >> 5) & 1);
gpio_put(D6, (cmd >> 6) & 1);
gpio_put(D7, (cmd >> 7) & 1);
gpio_put(EN, 1); sleep_us(50); gpio_put(EN, 0);
// Envoyer les 4 bits de poids faible
gpio_put(D4, cmd & 1);
gpio_put(D5, (cmd >> 1) & 1);
gpio_put(D6, (cmd >> 2) & 1);
gpio_put(D7, (cmd >> 3) & 1);
gpio_put(EN, 1); sleep_us(50); gpio_put(EN, 0);
sleep_ms(2); // Délai pour commandes lentes
}
void lcd_write_char(char c) {
gpio_put(RS, 1); // Mode écriture
lcd_command(c);
}
void lcd_clear() {
lcd_command(0x01); // Efface l'écran
sleep_ms(2); // Temps pour effacer
}
// --- Fonction pour lire une touche du pavé numérique ---
char keypad_get_key() {
for (int row = 0; row < 4; row++) {
gpio_put(keypad_rows[row], 0); // Activer la ligne
for (int col = 0; col < 4; col++) {
if (gpio_get(keypad_cols[col])) { // Si une touche est pressée
gpio_put(keypad_rows[row], 1); // Désactiver la ligne
return keys[row][col]; // Retourner la touche
}
}
gpio_put(keypad_rows[row], 1); // Désactiver la ligne
}
return 0; // Aucune touche pressée
}