... 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 ...