Bonjour,
J'ai un petit souci. Je veux relier un afficheur LCD à un pic. J'ai commencé à écrire le programme en C dans lequel j'initialise l'afficheur et où je teste le busy flag.
Mais je n'arrive pas à écrire une instruction (sous programme void lcd_write_instr(byte c)) et je ne sais pas également écrire un octet.
Est-ce quelqu'un peut m'aider ?
#include<16F877.h>
#fuses XT,NOWDT,NOPROTECT
#use delay(clock=20000000)
#use fast_io(D)
//D0 LCD_D4
//D1 LCD_D5
//D2 LCD_D6
//D3 LCD_D7
//D4 LCD_rs
//D5 LCD_rw
//D6 LCD_enable
struct port_D_sortie
{
int LCD_data:4; //en sortie les quatre bits D4,D5,D6,D7
int LCD_RS:1; //Définition du format de chaque des bits RS, RW et EN
int LCD_RW:1;
int LCD_EN:1;
int bidon:1;
};
struct port_D_entree
{
int bidon:3; //en entree les trois bits
int FLAG_BUSY : 1;
int bidon2 : 4;
};
struct port_D_sortie port_D;
struct port_D_entree status_D;
#byte port_D=0xf83
#byte status_D=0xf83
#define port_D_LCD_IN 0b00001111 //à vérifier
#define port_D_LCD_OUT 0b11110000 //à vérifier
void test_lcd_busy(void);
void lcd_init(void);
void lcd_STROBE (void);
void lcd__write_instr(void);
void lcd_clear(void);
#define LCD_STROBEport_D.LCD_EN=1;dela y_us(1);port_D.LCD_EN=0;delay_ us(1);
void test_lcd_busy(void)
{
boolean LCD_BF;
set_tris_D(port_D_LCD_IN);
port_D.LCD_RS=1;
do
{
port_D.LCD_EN=1;
delay_us(1);
LCD_BF=status_D.FLAG_BUSY;
port_D.LCD_EN=0;
delay_us(1);
LCD_STROBE();
}
while (LCD_BF);
port_D.LCD_RW=0;
set_tris_D(port_D_LCD_OUT); //tant que BF=1 on peut écrire sur afficheur donc port D configuré en sortie
}
//void lcd_write_instr(byte c)
//{
// byte c;
// test_lcd_busy();
// set_tris_D(port_D_LCD_OUT);
//{ port_D.LCD_RW=0;
// port_D.LCD_RS=0;
// port_D.LCD_data = c;
// LCD_STROBE();
//}
//void lcd_clear(void)
//{
//port_D.LCD_RS=0;
//port_D.LCD_data = 0b0010;
//LCD_STROBE();
//delay_ms(2);
//}
void lcd_init(void)
{
byte a;
set_tris_D(port_D_LCD_OUT);
port_D=0;
delay_ms(30);
port_D.LCD_data = 0b0011;
for (a=0;a<3;a++)
{
LCD_STROBE(); //cette instruction permet d'obtenir un front descendant sur l'entrée de validation de l'afficheur
delay_ms(2);
}
port_D.LCD_data = 0b0010;
LCD_STROBE();
delay_ms(2);
lcd_write_instr(0x28);
lcd_write_instr(0x06);
lcd_write_instr(0x0C);
lcd_clear();
}
-----