a. Le fonctionnement de la calculatrice :
Lorsque
l'alimentation est appliquée au système, l'écran LCD de Calculatrice affiche au
départ « calculatrice » Ensuite,
« NO 1 » l'utilisateur saisit première
numéro puis appuis sure ENTRE, par la suit
affiche « NO 2 » pour entre le deuxième numéro, puis
entre l’opération (+, -, *, /).
Après cela, Le résultat est affiché
automatiquement sur l'écran LCD prêt
pour le prochain calcule. Si l’opération ne peut pas effectue on aura valeur « -1 » sur écran LCD.
Il est
important de réaliser que lorsqu'une touche est enfoncée ou relâchée, nous
obtenons ce que l'on appelle contacter le bruit, où la sortie impulsions touche
haut et bas momentanément, la production d'un certain nombre de logique 0 et 1
des impulsions à la sortie. Bruit de contact de commutation est habituellement
retiré soit en matériel ou par programmation dans un processus appelé le
contact anti-rebond.
Dans le
logiciel le plus simple pour éliminer le bruit de contact est d'attendre
environ 20 ms après une clé de contact est pressé ou clé de contact est libéré.
Une fonction appelée getkeypad a été développé pour lire une clé du clavier.
Une fonction appelée getkeypad a été développé pour lire une clé du clavier.
La langue
mikroC a intégré les fonctions appelées Keypad_Read et Keypad_Released de lire
une clé à partir d'un clavier lorsqu'une touche est enfoncée et quand une
touche est relâchée
II. Application :
1. Programmation sur MICRO C :
a. Algorithme :
Le clavier à 4 x 4 est connecte à PORTB de microcontrôleur PIC18F452. Et LCD connecte a PORTC.
Notre projet et une simple calculatrice qui peut
effectuer une arithmétique entière.
Les touches sont organisées comme suit:
Les touches sont organisées comme suit:
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
Les touches sont étiquetées comme suit:
4 5 6 7
8 9 10 11
12 13 14 15
Les touches sont étiquetées comme suit:
1 2 3 4
5 6 7 8
9 0 . Enter
+ − * /
- Programme pour LCD : pour qu’on puisse voir le résultat affiché dans LCD en décimale.
- Programme calculatrice : pour que le PIC18F452, Seras capable d’exécute les opérations : Addition, Soustraction, Multiplication et Division.
- Programme clavier : pour entres les donner (le premier et le seconde numéro et l’opération) au système de microcontrôleur.
a. Sur MikroC:
#define MASK 0xF0
#define Enter 11
#define Plus 12
#define Minus 13
#define Multiply 14
#define Divide 15
//
// Cette fonction
obtient une touche du clavier
//
unsigned char getkeypad()
{
unsigned char i, Key = 0;
PORTB = 0x01; // Commencer par la colonne 1
while((PORTB & MASK) == 0) // Masquer si aucune touche ne pas
pressée
{
PORTB = (PORTB << 1); // Colonne suivante
Key++; // Numéro de colonne
if(Key == 4)
{
PORTB = 0x01; // Sauvegarder la colonne 1
Key = 0;
}
}
Delay_ms(20); // Mettre anti-rebond
for(i = 0x10; i !=0; i <<=1)
// Déterminer la
touche enfoncée
{
if((PORTB & i) != 0)break;
Key = Key + 4;
}
PORTB=0x0F;
while((PORTB & MASK) != 0); /* Attendre jusqu'a ce que touche
sera relâchée */
Delay_ms(20); // Mettre anti-rebond
return (Key); // Retour le numéro de la touche
}
// Connections de LCD
sbit LCD_RS at RC2_bit;
sbit LCD_EN at RC3_bit;
sbit LCD_D4 at RC4_bit;
sbit LCD_D5 at RC5_bit;
sbit LCD_D6 at RC6_bit;
sbit LCD_D7 at RC7_bit;
sbit LCD_RS_Direction at
TRISC2_bit;
sbit LCD_EN_Direction at
TRISC3_bit;
sbit LCD_D4_Direction at
TRISC4_bit;
sbit LCD_D5_Direction at
TRISC5_bit;
sbit LCD_D6_Direction at
TRISC6_bit;
sbit LCD_D7_Direction at
TRISC7_bit;
// Fin de connections
//Start du
program principale
//
void main()
{
unsigned char MyKey,
i,j,lcd[5],op[12];
unsigned long Calc, Op1,
Op2;
TRISC = 0; // PORTC est configure en sortie
TRISB = 0xF0; // RB4-RB7 sont configures en
entrée
//
// Configuration de
LCD
//
Lcd_Init(); // LCD est connecte ˆ PORTC
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1,"CALCULATRICE"); // Ecrire CALCULATRICE
Delay_ms(2000); // Temporisation de 2 secondes
Lcd_Cmd(_LCD_CLEAR); // Effacer l'écran LCD
//
// Boucle de programme
//
for(;;) // Boucle sans fin
{
MyKey = 0;
Op1 = 0;
Op2 = 0;
Lcd_Out(1,1,"No1:
"); // Afficher No1:
while(1) // Composer la première chiffre
{
MyKey = getkeypad();
if(MyKey == Enter)break;
// Presser ENTRER
MyKey++;
if(MyKey == 10)MyKey = 0; //
Si la touche 0 est pressée
Lcd_Chr_CP( MyKey + '0');
Op1 = 10*Op1 + MyKey; // Premier numéro de Op1
}
Lcd_Out(2,1,"No2:
"); // Afficher No2:
while(1) // Composer la deuxième chiffre
{
MyKey = getkeypad();
if(MyKey == Enter)break; //
Si ENTRER est pressée
MyKey++;
if(MyKey == 10)MyKey = 0; // Si la touche 0 est pressée
Lcd_Chr_CP( MyKey +'0');
Op2 = 10*Op2 + MyKey; // Second numéro de Op2
}
Lcd_Cmd(_LCD_CLEAR); // Effacer l'écran de LCD
Lcd_Out(1,1,"Op:
"); // Afficher Op:
MyKey = getkeypad(); // Obtenir le fonctionnement
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1,"Res=");
// Afficher Res=
switch(MyKey) // Effectuer l'opération
{
case Plus:
Calc = Op1 + Op2; // Si Plus
break;
case Minus:
Calc = Op1 - Op2; // Si Minus
break;
case Multiply:
Calc = Op1 * Op2; // Si Multiply
break;
case Divide:
Calc = Op1 / Op2; // Si Divide
break;
}
LongToStr(Calc, op); // Convertir en chaine dans op
//
// Supprimer les
espaces à gauche
//
j=0;
for(i=0;i<=11;i++)
{
if(op[i] != ' ') // Si un blanc
{
lcd[j]=op[i];
j++;
}
}
Lcd_Out_CP(lcd); // Afficher le résultat
Delay_ms(5000); // Temporisation de 5 secondes
Lcd_Cmd(_LCD_CLEAR);
}
}
Aucun commentaire:
Enregistrer un commentaire