Bonsoir à tous,
Je viens à vous encore une fois, il y a quelque jour j'ai mis au point une routine de gestion pour un LCD 2 lignes 16 caractères en mode 4 bit.
Mias voila que j'aimerai passé en Mode 8bit est faire l'envoi de donné sur le PORTC de mn Atmaga8535 et la gestion du Enable et RS apart a savoir que je ne fais que écrir dessus, Donc voici ci-contre ma routine de gestion est que quelqu'un pourrai m'aidé a passé en mode 4bit ( je connais un peu le C mais je débute que depuis quelque temps alors queleque tuyeau serai les bienvenue) Merci déclairé Ma l'aide
Merci d'avance!!!!!/* +gestion de l'afficheur LCD */
/* juin 2007 */
#include <io8535.h>
#include <avr/io.h>
#include <avr/interrupt.h> // nécessaire pour les interruptions
#include <avr/signal.h>
#include <stdlib.h> // nécessaire pour l'instruction itoa
#include <avr/delay.h>
/* Définition des ports utilisés */
/* Port gérant l'affichage sur écran LCD (bits tous en sortie) */
#define PORT_AFFICHEUR PORTC
#define DIRECTION_PORT_AFFICHEUR DDRC
#define val_bit(bit) (1<<bit)
#define set_bit(port,bit) port|=(1<<bit)
#define clear_bit(port,bit) port&=(~(val_bit(bit)))
/* Définitions utilisées pour gérer l'afficheur LCD (PORT_AFFICHEUR) */
#define BIT_ENABLE 1
#define BIT_RS 0
/* Données gérant l'affichage */
unsigned char lcd_x = 0, lcd_y = 0;
/********** Routines de gestion de l'afficheur ****************************** ******/
void lcd_delay (unsigned int t)
{
unsigned int i;
for (i = 0; i < t; i++);
}
void lcd_ready (void)
{
clear_bit (PORT_AFFICHEUR, BIT_RS); /* Mode commande */
lcd_delay (1000);
}
/* Routine d'écriture d'un quartet (mode 4 bits) */
void lcd_write_nibble (unsigned char data)
{
PORT_AFFICHEUR = data;
set_bit (PORT_AFFICHEUR, BIT_ENABLE); /* Impulsion sur le bit EN */
lcd_delay (5);
clear_bit (PORT_AFFICHEUR, BIT_ENABLE);
lcd_delay (5);
}
/* Routine d'écriture d'une donnée ou
* d'une commande. (Dépend du bit RS) */
void lcd_write_data (unsigned char data)
{
unsigned char d;
d=PORT_AFFICHEUR & 3;
/* Ecriture du quartet de poids fort */
lcd_write_nibble ((data & 0xF0) | d);
/* Ecriture du quartet de poids faible */
data &= 0x0F;
data = data << 4;
lcd_write_nibble ((data & 0xF0) | d);
}
/* Positionnement du curseur à un emplacement donné */
void lcd_gotoXY (unsigned char x, unsigned char y)
{
unsigned char base_y[2] = { 0x80, 0xC0 };
lcd_ready ();
lcd_write_data (x + base_y[y]);
lcd_x = x;
lcd_y = y;
}
/* Effacement de l'afficheur */
void lcd_clear (void)
{
lcd_ready ();
lcd_write_data (0x0C);
lcd_ready ();
lcd_write_data (1);
lcd_ready ();
lcd_x = lcd_y = 0;
}
/* Ecriture d'un caractère */
void lcd_putchar (unsigned char c)
{
if (c == 10)
goto newline;
++lcd_x;
if (lcd_x > 16)
{
newline:
++lcd_y;
lcd_gotoXY (0, lcd_y);
if (c == 10)
return;
}
lcd_ready ();
set_bit (PORT_AFFICHEUR, BIT_RS); /* Mode donnée */
lcd_write_data (c);
}
/* Ecriture d'une chaîne de caractères */
void lcd_puts (unsigned char * str)
{
while (* str)
{
lcd_putchar (* str);
str++;
}
}
/* Initialisation de l'afficheur */
void lcd_init (void)
{
lcd_ready ();
lcd_write_data (0x28); /* Bus de données 4 bits, 2 lignes valides */
lcd_ready ();
lcd_write_data (0x28); /* Envoi de la commande une seconde fois (ne fonctionne pas toujours sinon ?) */
lcd_ready ();
lcd_write_data (6); /* Déplacement du curseur vers la droite */
lcd_clear ();
lcd_ready ();
}
void delay_ms (unsigned int ms)
{
unsigned int i, j, k;
for (i = 0; i < ms; i++)
{
for (j = 0; j < 28; j++)
{
for (k = 0; k < 2500; k++)
; // Boucle de 36 us
}
}
}
void aff_ligne0 (char * m)
{
lcd_gotoXY (0, 0);
lcd_puts (m);
}
void aff_ligne1 (char * m)
{
lcd_gotoXY (0, 1);
lcd_puts (m);
}
/*********** Programme principal ****************************** ************/
int main (void)
{
DIRECTION_PORT_AFFICHEUR=0xFF; // Port C en sortie (Gestion de l'afficheur LCD)
lcd_init ();
lcd_clear ();
do
{
aff_ligne0(" **bonjour** ");
}
while (1);
}
-----