Bonjour, comme vous pouvez le voir je suis toujours sur debian.
Je me remets à vous, car pour mes programmations de PIC j’utilise piklab que je trouve très bien.
Mais depuis peu je me suis lancé sur les afficheurs LCD, mais cela se passe bien si l’on considère qu’il faut tout paramétrer.
Voici mon problème. Je récupère une valeur qui et convertie de l’analogique en numérique dans une variable, que je nomme valeur.
Ce que je veux, c’est afficher le résultat obtenu sauf que je ne sais pas comment la convertir en ASCII pour que l’afficheur l’accepte.
Je vous joins tous le code désolé si c’est long, mais comme ça vous pouvez mieux voir.
Le problème est tout en bas, a c’est endroits.
LCD_ECRIRE_CHAINE(valeur ,7);
il faudrait convertir la valeur en ASCII
J’ai testé plein de choses, mais ce qui est étrange c’est quand je programme en c et que j’utilise une fonction comme:
nbr = strlen("Bonjour");
comme substr.
Il ne reconnaît pas substr bien que #include <string.h> soit présent.
Avez-vous une idée?
/* ----------------------------------------------------------------------- */
/* Fichier source modèle généré par Piklab */
#include <pic16f876.h>
#include <string.h>
#include <math.h>
/* ----------------------------------------------------------------------- */
/* Bits de configuration: adapté à votre dispositif et à vos besoins */
typedef unsigned int word;
word at 0x2007 CONFIG = 0x3F39;
//word at 0x2007 CONFIG = _RC_OSC & _WDT_ON & _PWRTE_OFF & _BODEN_ON & _LVP_ON & _CPD_OFF & _WRT_ENABLE_ON & _DEBUG_OFF & _CP_OFF;
#define LCD_LIGNE_1 0x80 // Adresse ligne 1
#define LCD_LIGNE_2 0xC0 // Adresse ligne 2
#define LCD_LIGNE_3 0x94 // Adresse ligne 3
#define LCD_LIGNE_4 0xD4 // Adresse ligne 4
// Declaration des h
void antirebond(void);
void Pause(int duree);
void LCD_INITIALISATION(void);
void LCD_INIT_8_BITS(void);
void LCD_EFFACER(void);
void LCD_RETOUR_HOME(void);
void LCD_ECRIS_VALEUR(int valeur);
void LCD_ECRIS_COMMANDE(char mot);
void LCD_ECRIS_LETTRE(char mot);
void LCD_ECRIRE_CHAINE(char *chaine, int nb_caracteres);
// Debut programme
void antirebond(void)
{
Pause(500);
}
void Pause(int duree)
{
int boucle;
boucle = 0;
while(boucle < duree)
{
boucle++;
TMR0 = 0;
}
}
// Lance la procedure d'initialisation
void LCD_INITIALISATION(void)
{
// Regle en mode 8 bits plusieurs fois de suite pour etre sur
LCD_INIT_8_BITS();
Pause(300);
LCD_INIT_8_BITS();
Pause(300);
LCD_INIT_8_BITS();
Pause(300);
// Regle le curseur nombre de ligne et format
RC2 = 1;
RC0 = 0;
RC1 = 0;
PORTB = 0b00111000;
RC2 = 0;
Pause(800);
// Pas de curseur
RC2 = 1;
RC0 = 0;
RC1 = 0;
PORTB = 0b00001100;
RC2 = 0;
Pause(800);
// Retour en haut a gauche
LCD_RETOUR_HOME();
Pause(300);
// efface
LCD_EFFACER();
Pause(300);
}
// Initialise l'afficheur sur 8 bits
void LCD_INIT_8_BITS(void)
{
RC2 = 1;
RC0 = 0;
RC1 = 0;
PORTB = 0b00110011;
RC2 = 0;
Pause(200);
}
// Efface le texte et place le curseur au debut
void LCD_EFFACER(void)
{
RC2 = 1;
RC0 = 0;
RC1 = 0;
PORTB = 0b00000001;
RC2 = 0;
Pause(100);
}
// Renvois le curseur au debut sans effacer
void LCD_RETOUR_HOME(void)
{
RC2 = 1;
RC0 = 0;
RC1 = 0;
PORTB = 0b00000010;
RC2 = 0;
Pause(100);
}
// Ecris une valeur
void LCD_ECRIS_VALEUR(int valeur)
{
PORTB = 0;
RC2 = 1;
RC0 = 1;
RC1 = 0;
PORTB = valeur;
RC2 = 0;
Pause(50);
}
// Envois une commande a l'afficheur
void LCD_ECRIS_COMMANDE(char mot)
{
PORTB = 0;
RC2 = 1;
RC0 = 0;
RC1 = 0;
PORTB = mot;
RC2 = 0;
Pause(50);
}
// Ecris un caractere
void LCD_ECRIS_LETTRE(char mot)
{
PORTB = 0;
RC2 = 1;
RC0 = 1;
RC1 = 0;
PORTB = mot;
RC2 = 0;
Pause(50);
}
// Ecris une chaine ascii
void LCD_ECRIRE_CHAINE(char *chaine, int nb_caracteres)
{
int u;
for (u=0;u<nb_caracteres;u++)
{
LCD_ECRIS_LETTRE(chaine[u]);
}
}
void main()
{
int temps;
unsigned int valeur;
TRISA = 0xFF; // 1 = Entree 0 = Sortie
TRISB = 0x00;
TRISC = 0x10;
OPTION_REG = 0xC7; // reglage option temps
TMR0 = 0; // Mise a 0
ADCON1 = 0x80; // config entree A/D 0x06 Dig 0x80 analogique
PORTA = 0x00; //etat des pattes
PORTB = 0x00; // tous etaint
PORTC = 0x00;
temps = 0;
valeur = 0;
TMR0 = 0;
// Initialisation de l'afficheur
Pause(3000);
LCD_INITIALISATION();
LCD_ECRIRE_CHAINE("Initialisation OK",17);
Pause(5000);
LCD_EFFACER();
Pause(3000);
LCD_ECRIS_COMMANDE(LCD_LIGNE_1); // Ce place a la premiere ligne
LCD_ECRIRE_CHAINE("Bonjour",7); // Envois le texte
LCD_ECRIS_COMMANDE(LCD_LIGNE_2);
LCD_ECRIRE_CHAINE("Resultat:",9);
while (1)
{
if (TMR0 >= 250)
{
TMR0 = 0;
temps++;
}
if (temps >= 8) // mise a jour environ toutes les 1/2 second
{
temps = 0;
ADCON0 = 0xC5; // Reglage du port a controler demarrage test
//ADCON1 = 0x80; // Reglage decodeur sur 8 bits a droite
valeur = ADRESH; // recuperation
valeur <<= 8; // des valeurs
valeur |= ADRESL; // analogique
LCD_ECRIS_COMMANDE(LCD_LIGNE_4); // Ce place a la ligne 4
LCD_ECRIRE_CHAINE(valeur ,7);
}
}
}