J'étais partie sur ta première solution, mais je n'arrive pas a récupérer la ligne et l'exploiter
En faite, j'ai essayé de faire une calculatrice tout seul sans demander de l'aide. Mais sa fait 2 jours que je suis dessus et pas moyen. Je vais devoir me tourner vers mon forum fétiche
Pour le moment j'arrive a écrire sur la première ligne de l'écran ex: 12+8=
Et forcément je souhaiterais qu'à l'appui de la touche = j'obtiens le résultat sur la deuxième ligne. Mais pas moyen de réussir a récupérer 12+8 et l'exploiter genre 12 d'un côté et le 8 de l'autre.
Existe t-il des fonctions genre couper, se déplacer de autant dans la chaîne etc... ?
Peut être que je cherche trop compliqué
code:
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;
char code1[16];
int i = 0;
int j = 0;
int k = 0;
int l = 0;
int Type_Operation = 0;
int Operation = 0;
int Longeur_Operation = 0;
char Premiere_Valeur[16];
char Deuxieme_Valeur[16];
int Longeur_Premiere_Valeur = 0;
int Longeur_Deuxieme_Valeur = 0;
int Resultat;
int Resultat1;
float Resultat_Str;
// 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);
}
// 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 = -1; // reset de la variable i
Type_Operation = 0; // reset de la variable Type_Operation
Longeur_Operation = 0; // longeur de l'operation
Longeur_Premiere_Valeur = 0; // longeur de la premiere valeur
Longeur_Deuxieme_Valeur = 0; // longeur de la deuxieme valeur
delay_ms(10); // attend 10ms
}
// procedure qui calcul l'operation
void Resultat_Calcul(){
if(Type_Operation == 1) // si l'operation est une addition
{
}
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() {
kp = 0; // reset de la variable kp
do
kp = Keypad_Key_Click(); // Mémoriser la touche dans la variable kp
while (!kp);
// Préparer la valeur de sortie, transformer la touche en sa valeur ASCII
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,i+1,code1[i]); // affiche la touche presser sur la 1ere ligne
if(code1[i] == 43) // si on appuie sur +
{
Type_Operation = 1; // Type_Operation prend la valeur 1 qui correspond a une addition
Longeur_Premiere_Valeur = i; // longeur de la premiere valeur
}
if(code1[i] == 45) // si on appuie sur -
{
Type_Operation = 2; // Type_Operation prend la valeur 2 qui correspond a une soustraction
Longeur_Premiere_Valeur = i; // longeur de la premiere valeur
}
if(code1[i] == 120) // si on appuie sur x
{
Type_Operation = 3; // Type_Operation prend la valeur 3 qui correspond a une multiplication
Longeur_Premiere_Valeur = i; // longeur de la premiere valeur
}
if(code1[i] == 47) // si on appuie sur /
{
Type_Operation = 4; // Type_Operation prend la valeur 4 qui correspond a une division
Longeur_Premiere_Valeur = i; // longeur de la premiere valeur
}
if(code1[i] == 42) // si on appuie sur * (etoile)
{
Annulation(); // on appele la procedure Annulation()
}
if(code1[i] == 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()
}
if(i > 16) // si i est plus grand que 16 caracteres
{
Annulation(); // on appele la procedure Annulation()
}
i++;
Longeur_Operation = i; // longeur de l'operation
delay_ms(100); // attend 100ms antirebond
}
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
do {
Touche_Clavier();
}
while(1); { // boucle infini
}
}
@++