Bienvenue aux nouveaux arrivants sur FantasPic !
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
Modérateur : Jérémy
[résolu]Keypad 4x4
Bon j'ai un peut regarder, comme le dit temps-x le -48 fonctionne que sur 1 seul chiffre. Comment je peux récupérer une suite de touche ??
Car la dans mon code ci-dessus kp renvoie la valeur ascii et le souci c'est que kp renvoie uniquement le dernier chiffre taper (normal) c'est la que je coince.
j'ai ajouter sa au code :
A chaque touche taper, j'ai bien le bon chiffre sauf +-*/ Mais 1 seul J'ai mal a la tête.
@++
Car la dans mon code ci-dessus kp renvoie la valeur ascii et le souci c'est que kp renvoie uniquement le dernier chiffre taper (normal) c'est la que je coince.
j'ai ajouter sa au code :
Code : Tout sélectionner
longToStr(kp-48,Resultat1);
I2C_LCD_Out(2,1,Resultat1);
A chaque touche taper, j'ai bien le bon chiffre sauf +-*/ Mais 1 seul J'ai mal a la tête.
@++
[résolu]Keypad 4x4
-
Jérémy
Administrateur du site- Messages : 2725
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Yop c'est même un peu plus complexe que ça ! car imaginons que je souhaite entrer "1234" . Le premier chiffre taper sera les milliers puis les centaines les dizaines et enfin les unités.
Je te propose de faire un traitement après avoir valider la valeur rentrer par un signe . en fait les signes "+-*/" seront en quelques sorte un terminateur de ta chaine de chiffre .
Il faut donc tu stockes dans un tableau tes chiffres
Je te propose ceci :
Le premier sera le "1" . qui sera stocké dans ton tableau à l'emplacement Tableau[i], "i" étant un index qu'on va incrémenter en commençant par 0
- On incrémente i donc i vaut maintenant 1
Ensuite le "2" qui sera stocker à l'emplacement Tableau[i] etc ....
Quand on détecte un signe "+-*/" , le tableau est donc remplis. la valeur de i-1 nous donne le nombre de chiffres qui ont été rentrés. et donc on va pouvoir les multiplié par 10, 100, 1000 , 10000 ..... suivant la valeur de i.
ensuite on additionne tous ces chiffres et on obtiens notre valeur finale !
Je te propose de faire un traitement après avoir valider la valeur rentrer par un signe . en fait les signes "+-*/" seront en quelques sorte un terminateur de ta chaine de chiffre .
Il faut donc tu stockes dans un tableau tes chiffres
Je te propose ceci :
Le premier sera le "1" . qui sera stocké dans ton tableau à l'emplacement Tableau[i], "i" étant un index qu'on va incrémenter en commençant par 0
- On incrémente i donc i vaut maintenant 1
Ensuite le "2" qui sera stocker à l'emplacement Tableau[i] etc ....
Quand on détecte un signe "+-*/" , le tableau est donc remplis. la valeur de i-1 nous donne le nombre de chiffres qui ont été rentrés. et donc on va pouvoir les multiplié par 10, 100, 1000 , 10000 ..... suivant la valeur de i.
ensuite on additionne tous ces chiffres et on obtiens notre valeur finale !
[résolu]Keypad 4x4
[résolu]Keypad 4x4
[résolu]Keypad 4x4
Bonjour venom, Jérémy, et tout le forum,
Alors tu t'en sors venom,
Le signe * correspond au numéro 42
Le signe + correspond au numéro 43
Le signe - correspond au numéro 45
Le signe / correspond au numéro 47
Pour bien comprendre ton problème, il faut étudier la machine à calculer chinoise(le boulier), et ouais encore euh.......
A+
Alors tu t'en sors venom,
Le signe * correspond au numéro 42
Le signe + correspond au numéro 43
Le signe - correspond au numéro 45
Le signe / correspond au numéro 47
Pour bien comprendre ton problème, il faut étudier la machine à calculer chinoise(le boulier), et ouais encore euh.......
A+
[résolu]Keypad 4x4
Non,
J'ai mal a la tête.(je vais surement faire une petite pose a ce sujet, repartir avec un esprit saint) puis ta vidéo viens de me finir les quelques neurones qu'ils me restaient.
Je dois approfondir mes connaissances avec ce qui concerne les tableaux, les conversions etc... Le problème, c'est que j’exécute trop comme en programmation informatique, mais tout ne se passent pas de la même façon que sur un ordi en électronique
Au dodo pour aujourd’hui...
Merci de vous souciez de ma santé
@++
J'ai mal a la tête.(je vais surement faire une petite pose a ce sujet, repartir avec un esprit saint) puis ta vidéo viens de me finir les quelques neurones qu'ils me restaient.
Je dois approfondir mes connaissances avec ce qui concerne les tableaux, les conversions etc... Le problème, c'est que j’exécute trop comme en programmation informatique, mais tout ne se passent pas de la même façon que sur un ordi en électronique
Au dodo pour aujourd’hui...
Merci de vous souciez de ma santé
@++
[résolu]Keypad 4x4
Bonsoir venom,
Je crois que beaucoup de personne sur ce forum pourrais faire ce que tu demandes, mais ça t'aiderais pas, comme le dit le
proverbe chinois,
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours.
Reste juste à espérer qu'il aime le poisson.
Repose toi bien, et revient nous en pleine forme.
A+
Je crois que beaucoup de personne sur ce forum pourrais faire ce que tu demandes, mais ça t'aiderais pas, comme le dit le
proverbe chinois,
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours.
Reste juste à espérer qu'il aime le poisson.
Repose toi bien, et revient nous en pleine forme.
A+
[résolu]Keypad 4x4
Salut Temps-X,
Entièrement d'accord avec toi. C'est d'ailleurs pour ça que je n'ai pas dit "auriez vous un code de calculatrice tout fait s'il vous plaît ?"
Mais la le boulier a 0h00 trop fort pour moi pu assez frais
@++
Entièrement d'accord avec toi. C'est d'ailleurs pour ça que je n'ai pas dit "auriez vous un code de calculatrice tout fait s'il vous plaît ?"
Mais la le boulier a 0h00 trop fort pour moi pu assez frais
@++
[résolu]Keypad 4x4
Bonjour a tous,
Bon ça avance J'ai mis une led pour avoir un visuel plus parlant. D’après ma led, je suis capable maintenant de savoir quel touche est appuyer notamment +-*/= Et quand je fait égale, je sais dire si l’opération est un addition, soustraction, multiplication ou division. C'est déjà sa
Aller j'y retourne...
@++
Bon ça avance J'ai mis une led pour avoir un visuel plus parlant. D’après ma led, je suis capable maintenant de savoir quel touche est appuyer notamment +-*/= Et quand je fait égale, je sais dire si l’opération est un addition, soustraction, multiplication ou division. C'est déjà sa
Aller j'y retourne...
@++
[résolu]Keypad 4x4
Bon voici mon code actuel :
Pensez vous que je pars sur la bonne piste pour essayé de récupérer les valeurs pour ensuite les additionnées ? Ça se situe au niveau des lignes 228 - 234 dans la procedure Resultat_Calcul()
Est-ce que Premiere_Valeur et Deuxieme_Valeur on bien les bonnes valeurs ?
D'avance merci.
@++
Pensez vous que je pars sur la bonne piste pour essayé de récupérer les valeurs pour ensuite les additionnées ? Ça se situe au niveau des lignes 228 - 234 dans la procedure Resultat_Calcul()
Est-ce que Premiere_Valeur et Deuxieme_Valeur on bien les bonnes valeurs ?
Code : Tout sélectionner
///////////////////////////////
// name : CALCULATERICE //
// create : venom //
// date : 23/04/2019 //
// pic : 16f887 4MHz //
///////////////////////////////
// LCD Definitions
#define _LCD_CLEAR 0x01 //vide l'ecran
#define _LCD_CURSOR_OFF 0x0C //cache le curseur
#define _LCD_UNDERLINE_ON 0x0E //Underline cursor on
// I2C adresse
#define LCD_ADDR 0x7E // adresse du PCF8574A = 0x7E. adresse du PCF8574 = 0x4E
// initialisation des varialbes etc...
unsigned short kp = 0;
char code1[15];
int i = 0;
int Type_Operation = 0;
int Longeur_Premiere_Valeur = 0;
int Longeur_Deuxieme_Valeur = 0;
int Premiere_Valeur = 0;
int Deuxieme_Valeur = 0;
int Longeur_Operation = 0;
int j = 0;
int k = 0;
int l = 0;
// Keypad module connections
char keypadPort at PORTD;
// textes constants
char txt1[] = "CALCULATRICE";
char txt2[] = "BY VENOM";
char txt3[] = "ENTREZ VOTRE";
char txt4[] = "OPERATION";
char txt5[] = "ERREUR";
// procedure I2C_LCD_Cmd By paulfjujo
void I2C_LCD_Cmd(char out_char) {
char hi_n, lo_n;
char rs = 0x00;
hi_n = out_char & 0xF0;
lo_n = (out_char << 4) & 0xF0;
I2C1_Start();
I2C1_Is_Idle();
I2C1_Wr(LCD_ADDR);
I2C1_Is_Idle();
I2C1_Wr(hi_n | rs | 0x04 | 0x08);
I2C1_Is_Idle();
Delay_us(50);
I2C1_Wr(hi_n | rs | 0x00 | 0x08);
I2C1_Is_Idle();
Delay_us(100);
I2C1_Wr(lo_n | rs | 0x04 | 0x08);
I2C1_Is_Idle();
Delay_us(50);
I2C1_Wr(lo_n | rs | 0x00 | 0x08);
I2C1_Is_Idle();
I2C1_stop();
if(out_char == 0x01)Delay_ms(2);
}
// procedure I2C_LCD_Chr By paulfjujo
void I2C_LCD_Chr(char row, char column, char out_char) {
char hi_n, lo_n;
char rs = 0x01;
switch(row){
case 1:
I2C_LCD_Cmd(0x80 + (column - 1));
break;
case 2:
I2C_LCD_Cmd(0xC0 + (column - 1));
break;
};
hi_n = out_char & 0xF0;
lo_n = (out_char << 4) & 0xF0;
I2C1_Start();
I2C1_Is_Idle();
I2C1_Wr(LCD_ADDR);
I2C1_Is_Idle();
I2C1_Wr(hi_n | rs | 0x04 | 0x08);
I2C1_Is_Idle();
Delay_us(50);
I2C1_Wr(hi_n | rs | 0x00 | 0x08);
I2C1_Is_Idle();
Delay_us(100);
I2C1_Wr(lo_n | rs | 0x04 | 0x08);
I2C1_Is_Idle();
Delay_us(50);
I2C1_Wr(lo_n | rs | 0x00 | 0x08);
I2C1_Is_Idle();
I2C1_stop();
}
// procedure I2C_LCD_Init By paulfjujo
void I2C_LCD_Init() {
char rs = 0x00;
Delay_ms(100); // laisser le temps au LCD de s'alimenter correctement
I2C1_Start();
I2C1_Is_Idle();
I2C1_Wr(LCD_ADDR);
I2C1_Is_Idle();
Delay_ms(30); //30 // laisser le temps au LCD de s'alimenter correctement
I2C1_Wr(0x30 | rs | 0x04 | 0x08);
I2C1_Is_Idle();
Delay_us(50);
I2C1_Wr(0x30 | rs | 0x00 | 0x08);
I2C1_Is_Idle();
Delay_ms(10); //10 // laisser le temps au LCD de s'alimenter correctement
I2C1_Wr(0x30 | rs | 0x04 | 0x08);
I2C1_Is_Idle();
Delay_us(50);
I2C1_Wr(0x30 | rs | 0x00 | 0x08);
I2C1_Is_Idle();
Delay_ms(10); //10 // laisser le temps au LCD de s'alimenter correctement
I2C1_Wr(0x30 | rs | 0x04 | 0x08);
I2C1_Is_Idle();
Delay_us(50);
I2C1_Wr(0x30 | rs | 0x00 | 0x08);
I2C1_Is_Idle();
Delay_ms(10); //10 // laisser le temps au LCD de s'alimenter correctement
I2C1_Wr(0x20 | rs | 0x04 | 0x08);
I2C1_Is_Idle();
Delay_us(50);
I2C1_Wr(0x20 | rs | 0x00 | 0x08);
I2C1_Is_Idle();
I2C1_Stop();
Delay_ms(100); //100 // laisser le temps au LCD de s'alimenter correctement
I2C_LCD_Cmd(0x28);
I2C_LCD_Cmd(0x06);
}
// procedure I2C_LCD_Out By paulfjujo
void I2C_LCD_Out(char row, char col, char *text) {
while(*text)
I2C_LCD_Chr(row, col++, *text++);
}
// procedure texte au demarrage
void Welcome() {
I2C_LCD_Cmd(_LCD_CURSOR_OFF); // supprime le curseur
I2C_LCD_Cmd(_LCD_CLEAR); // vide l'ecran
delay_ms(100); // attend 100ms
I2C_Lcd_Out(1,3,txt1); // affiche le texte CALCULATRICE en 1ere ligne
I2C_Lcd_Out(2,5,txt2); // affiche le texte BY VENOM en 2eme ligne
delay_ms(3000); // attend 2 secondes
I2C_LCD_Cmd(_LCD_CURSOR_OFF); // supprime le curseur
I2C_LCD_Cmd(_LCD_CLEAR); // vide l'ecran
I2C_Lcd_Out(1,3,txt3); // affiche le texte ENTREZ VOTRE en 1ere ligne
I2C_Lcd_Out(2,4,txt4); // affiche le texte OPERATION en 2eme ligne
delay_ms(3000); // attend 2 secondes
I2C_LCD_Cmd(_LCD_CURSOR_OFF); // supprime le curseur
I2C_LCD_Cmd(_LCD_CLEAR); // vide l'ecran
delay_ms(100);
RA0_bit = 1; // allume led RA0
delay_ms(500);
RA0_bit = 0; // eteint led RA0
}
// procedure annulation de l'operation (touche *)
void Annulation(){
I2C_LCD_Cmd(_LCD_CURSOR_OFF); // supprime le curseur
I2C_LCD_Cmd(_LCD_CLEAR); // vide l'ecran
kp = 0; // reset de la variable kp
i = 0;
delay_ms(10); // attend 10ms
}
// procedure qui calcul l'operation
void Resultat_Calcul(){
if(Type_Operation == 1) // si l'operation est une addition
{
for (j=0; j<Longeur_Premiere_Valeur; j++)
{
//I2C_LCD_Chr(2,1+j,code1[j]);
Premiere_Valeur = code1[j]-48; // recupere la valeur de la premiere partie de l'operation
}
for (k=Longeur_Premiere_Valeur; k<Longeur_operation; k++)
{
//I2C_LCD_Chr(2,1+k,code1[k]);
Deuxieme_Valeur = code1[k]-48; // recupere la valeur de la deuxieme partie de l'operation
}
}
else if(Type_Operation == 2) // si l'operation est une soustraction
{
}
else if(Type_Operation == 3) // si l'operation est une multiplication
{
}
else if(Type_Operation == 4) // si l'operation est une division
{
}
}
// procedure recupere la touche appuyer et l'affichea l'ecran
void Touche_Clavier() {
do {
kp = 0; // Reset key code variable
// Wait for key to be pressed and released
do
// kp = Keypad_Key_Press(); // Store key code in kp variable
kp = Keypad_Key_Click(); // Store key code in kp variable
while (!kp);
// Prepare value for output, transform key to it's ASCII value
switch (kp) {
case 1: kp = 49; break; // 1
case 2: kp = 50; break; // 2
case 3: kp = 51; break; // 3
case 4: kp = 43; break; // +
case 5: kp = 52; break; // 4
case 6: kp = 53; break; // 5
case 7: kp = 54; break; // 6
case 8: kp = 45; break; // -
case 9: kp = 55; break; // 7
case 10: kp = 56; break; // 8
case 11: kp = 57; break; // 9
case 12: kp = 120; break; // x
case 13: kp = 42; break; // *
case 14: kp = 48; break; // 0
case 15: kp = 61; break; // =
case 16: kp = 47; break; // /
}
code1[i] = kp;
I2C_LCD_Chr(1,1+i,code1[i]); // affiche les touches presser sur la 1ere ligne
i++;
if(kp == 43) // si on appuie sur +
{
Type_Operation = 1; // Type_Operation prend la valeur 1 qui correspond a une addition
Longeur_Premiere_Valeur = i-1; // longeur de la premiere valeur
delay_ms(50);
}
if(kp == 45) // si on appuie sur -
{
Type_Operation = 2; // Type_Operation prend la valeur 2 qui correspond a une soustraction
Longeur_Premiere_Valeur = i-1; // longeur de la premiere valeur
delay_ms(50);
}
if(kp == 120) // si on appuie sur x
{
Type_Operation = 3; // Type_Operation prend la valeur 3 qui correspond a une multiplication
Longeur_Premiere_Valeur = i-1; // longeur de la premiere valeur
delay_ms(50);
}
if(kp == 47) // si on appuie sur /
{
Type_Operation = 4; // Type_Operation prend la valeur 4 qui correspond a une division
Longeur_Premiere_Valeur = i-1; // longeur de la premiere valeur
delay_ms(50);
}
if(kp == 42) // si on appuie sur * (etoile)
{
Annulation(); // on appele la procedure Annulation()
delay_ms(50);
}
if(kp == 61) // si on appuie sur =
{
Longeur_Deuxieme_Valeur = Longeur_Operation-Longeur_Premiere_Valeur-1; // longeur de la deuxieme valeur
Resultat_Calcul(); // on appele la procedure Resultat_Calcul()
delay_ms(50);
}
if(i > 16) // si i est plus grand que 16 caracteres
{
Annulation(); // on appele la procedure Annulation()
delay_ms(50);
}
Longeur_Operation = i; // longeur de l'operation
} while (1);
}
void main() {
OSCCON = 0b01101000; // configuration OSCCON interne 4mhz
// 0b01110000 oscillateur 8 Mhz
// 0b01101000 oscillateur 4 Mhz
// 0b01011000 oscillateur 2 Mhz
// 0b01001000 oscillateur 1 Mhz
// 0b00111000 oscillateur 500 Khz
// 0b00101000 oscillateur 250 Khz
// 0b00011000 oscillateur 125 Khz
// 0b00001000 oscillateur 31 kHz
while(OSCCON.HTS==0); // boucle en attendant de voir le flag à 1
C1ON_bit = 0; // Disable comparators // Fill data buffer
ANSEL = 0; // Configure AN pins as digital I/O
ANSELH = 0;
TRISA = 0x00; // en sortie par defaut
TRISC = 0xFE; // en entree par defaut sauf RC0
Keypad_Init(); // Initialize Keypad
delay_ms(100);
I2C1_Init(100000); // initialisation de l'I2C
delay_ms(100);
I2C_LCD_Init();
delay_ms(100);
I2C_LCD_Cmd(_LCD_CURSOR_OFF);
Welcome(); // appele la procedure Welcome
Touche_Clavier();
while(1); { // boucle infini
}
}
D'avance merci.
@++
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 117 invités