CH32V003 : clavier matriciel

Ce que vous allez faire

Cet exercice vise à mettre en pratique en autonomie les notions abordées dans les cours premiers pas et GPIO et interruptions afin de les approfondir et de consolider vos apprentissages.

Vous allez pour cela utiliser le clavier à membrane figurant dans la liste des fournitures et ressemblant à ceci :

Ce clavier est organisé de façon matricielle, c'est-à-dire que les touches sont disposées aux intersections de lignes et de colonnes de la façon suivante :

Ainsi, si vous appuyez sur la touche 1, vous mettez en contact la ligne 0 et la colonne 0, et si vous appuyez sur la touche 8, vous mettez en contact la ligne 2 et la colonne 1.

Je vous demande d'écrire un programme permettant de détecter l'appui sur une touche et d'envoyer le caractère correspondant au terminal de MRS.

Pistes et conseils

Le principe de base est de relier les lignes à des sorties et les colonnes à des entrées (ou l'inverse, peu importe). Vous mettrez au départ toutes les sorties à 1, puis dans votre boucle, vous en mettrez successivement une seule à 0. Si une des entrées est alors à 0, c'est que la touche correspondante est appuyée. Selon la ligne et la colonne, vous en déduisez la touche.

La solution optimale à laquelle vous pourrez arriver utilise :

  • 3 (colonnes) ou 4 (lignes) sorties

  • 4 (lignes) ou 3 (colonnes) entrées

  • les résistances pull-up des entrées

  • autant de lignes d'interruption externes que d'entrées

Notez qu'on peut configurer plusieurs lignes de GPIO dans un même mode si elles sont sur le même port.Ça donne quelque chose comme ça :

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	
	GPIO_InitTypeDef gpioInit = { 0 };
	gpioInit.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
	gpioInit.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(GPIOC, &gpioInit);

Créez un projet pour cet exercice, nous nous en resservirons plus tard.

Vous allez immanquablement rencontrer quelques problèmes qui vont vous faire tourner en bourrique. C'est normal, c'est grâce à cela que vous allez pouvoir comprendre en profondeur ce que vous faites et développer petit à petit une belle assurance et de solides compétences.

Gardez donc la tête froide dans l'épreuve et utilisez vos nouveaux amis le debugger et printf() pour diagnostiquer les problèmes. Une fois un problème compris, la solution vient d'elle-même.

Vous pourriez avoir envie de regarder ce que font les fonctions GPIO_ReadInputData() et GPIO_Write() (dans Peripheral/src/ch32v00x_gpio.c), pour voir si ça ne pourrait pas vous simplifier un peu la tâche. ;)


Copyright (c) 2024 Vincent DEFERT - Tous droits réservés