... KeyBoard
Nous avons jusqu'ici utilisé nos I/O en sorties. Regardons à présent comment les configurer et les utiliser en entrée.
Pour cela, nous utiliserons également Speedy.
Nous allons dans un premier temps associer un bouton poussoir à P0.24, ce qui nous permettra ensuite de créer un clavier pour gérer nos menus par exemple.
De la même façon, on pourra lire des switches de fin de course logiques sur un système plus important.
// ..........................................
//
// Premiers pas dans le monde de l'ARM
//
// Auteur: Fred Microcontrollers and Robotics
// Date : 06 Octobre 2011
//
// Checked : 10 Aout 2009 23:25
//
// Program_4: Entrées Clavier
// ..........................................
#include "lpc210x.h"
#define LED7 (1 << b7)
#define KEYB1 (1 << b24)
#define out |
#define in &~
#define PLL_PLOCK (1<<b10) // Bit b10 de PLLSTAT
// Le port P0.N est mis en entrée
void Keyb_Init(int N)
{
IODIR = IODIR in N;
}
char Keyb_Pressed(int N)
{
return((IOPIN & N) == 0);
}
// Initialisation du diviseur de Pclk
void Init_Pclk(void)
{
VPBDIV = 0x02; // Bus périphérique : Cclk div 2
}
// Initialisation du MAM
void Init_MAM(void)
{
MAMCR = 0x00; // Désactivation des fonctions MAM
MAMTIM = 0x03; // Clock Cclk > 40MHz => MAM timing: 3
MAMCR = 0x02; // MAM fully enabled
}
// Initialisation de la PLL
void PLL_Init(void)
{
PLLCFG=0x23; // P= 2 et M=4 => 00100011
PLLCON=0x01; //Validation de la PLL
PLLFEED=0xAA; //Feed sequence
PLLFEED=0x55;
while(!(PLLSTAT & PLL_PLOCK)); // Attente que la PLL soit vérouillée
PLLCON=0x03; //Connection de la PLL
PLLFEED=0xAA; //Feed sequence
PLLFEED=0x55;
}
// Le port P0.N est mis en sortie
void Led_Init(int N)
{
IODIR = IODIR out N;
}
// La Led n° N est allumée
void Led_On(int N)
{
IOSET = N;
}
// La Led n° N est éteinte
void Led_Off(int N)
{
IOCLR = N;
}
// Attente d'un certain temps défini par T
void Delai(unsigned long T)
{
while (--T!=0);
}
int main(void)
{
IODIR = 0;
PLL_Init();
Init_MAM();
Init_Pclk();
Led_Init(LED7);
Keyb_Init(KEYB1);
while (1)
{
if (Keyb_Pressed(KEYB1)) Led_On(LED7);
else Led_Off(LED7);
}
return(0);
}
Lors de l'écriture de Blinky, nous avions défini des équivalences à out et à in afin de rendre notre programme plus lisible.
Ici, nous utiliserons donc pour lire les entrées:
#define in &~
Notre première touche de clavier sera connectée à P0.24
#define KEYB1 (1 << b24)
Tout d'abord, il va falloir initialiser P0.24 en entrée. Comme nous l'avions vu précédemment, le fait de travailler avec des OR et des AND (donc in et out), nous permet de traiter chaque bit indépendamment des autres.
void Keyb_Init(int N)
{
IODIR = IODIR in N;
}
Lorsque ce sera nécessaire, on lira son état par:
char Keyb_Pressed(int N)
{
return((IOPIN & N) == 0);
}
Le résultat retourné par Keyb_Pressed(n) donnera l'état de la touche numéro n, enfoncée ou non.
Si vous avez un doute sur le résultat, regardez à nouveau ce que l'on a détaillé pour Blinky.
Dans le main(), on voit donc que l'on va tourner en rond en attendant que la touche soit enfoncée. Suivant l'état de cette touche, la Led sera éteinte ou allumée.
Ça nous fait tout de même un bel interrupteur ...