Bonjour je suis nouveau sur le forum et j'ai un petit soucis avec un porjet qu'on m'a soumis.
Je dois gérer le fonctionnement d'un LCD à partir d'un PIC.
J'utilise un PIC 18F4550 dont vous trouverez facilement le datasheet sur internet.
Voici les caractéristiques du LCD que j'utilise : LCD 64128E
Et voici un datasheet complémentaire du fonctionnement du LCD en question.
KS0713
Le compilateur que j'utilise est : PCW-C-Complier.
J'ai bien ententu développé un code (et un code c'est façon de parler car ça va faire près de deux mois que je bloque toujours sur ce fonctionnement).
Le voici:
Voilà si vous pouvez m'aider et m'aiguiller afin que j'arrive à mes fins ce serait gentil. Je vous remercie par avance.#define LCD_TYPE 1
#use fast_io(B)
#use fast_io(D)
#define NOP #asm nop #endasm
#byte pb =0xF81 //b //
#byte pd =0xF83 //d // usb port 8 bits parallel
#bit lcd_enable =pd.5// RD5
#bit lcd_rs =pd.4 // RD4
#bit lcd_rst =pd.3 // RD3
#bit lcd_rw =pd.2 // RD2
#bit lcd_cs =pd.1 // RD1
#bit lcd_bl =pd.0 // RD0
#bit B0 =pb.0
#bit B1 =pb.1
#bit B2 =pb.2
#bit B3 =pb.3
#bit B4 =pb.4
#bit B5 =pb.5
#bit B6 =pb.6
#bit B7 =pb.7
///////////////////////// Table ASCII ///////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
BYTE TABLE5[240]= {0x00,0x00,0x00,0x00,0x00, // 20 space ASCII table for NOKIA LCD: 96 rows * 5 bytes= 480 bytes
0x00,0x00,0x5f,0x00,0x00, // 21 !
0x00,0x07,0x00,0x07,0x00, // 22 "
0x14,0x7f,0x14,0x7f,0x14, // 23 #
0x24,0x2a,0x7f,0x2a,0x12, // 24 $
0x23,0x13,0x08,0x64,0x62, // 25 %
0x36,0x49,0x55,0x22,0x50, // 26 &
0x00,0x05,0x03,0x00,0x00, // 27 '
0x00,0x1c,0x22,0x41,0x00, // 28 (
0x00,0x41,0x22,0x1c,0x00, // 29 )
0x14,0x08,0x3e,0x08,0x14, // 2a *
0x08,0x08,0x3e,0x08,0x08, // 2b +
0x00,0x50,0x30,0x00,0x00, // 2c ,
0x08,0x08,0x08,0x08,0x08, // 2d -
0x00,0x60,0x60,0x00,0x00, // 2e .
0x20,0x10,0x08,0x04,0x02, // 2f /
0x3e,0x51,0x49,0x45,0x3e, // 30 0
0x00,0x42,0x7f,0x40,0x00, // 31 1
0x42,0x61,0x51,0x49,0x46, // 32 2
0x21,0x41,0x45,0x4b,0x31, // 33 3
0x18,0x14,0x12,0x7f,0x10, // 34 4
0x27,0x45,0x45,0x45,0x39, // 35 5
0x3c,0x4a,0x49,0x49,0x30, // 36 6
0x01,0x71,0x09,0x05,0x03, // 37 7
0x36,0x49,0x49,0x49,0x36, // 38 8
0x06,0x49,0x49,0x29,0x1e, // 39 9
0x00,0x36,0x36,0x00,0x00, // 3a :
0x00,0x56,0x36,0x00,0x00, // 3b ;
0x08,0x14,0x22,0x41,0x00, // 3c <
0x14,0x14,0x14,0x14,0x14, // 3d =
0x00,0x41,0x22,0x14,0x08, // 3e >
0x02,0x01,0x51,0x09,0x06, // 3f ?
0x32,0x49,0x79,0x41,0x3e, // 40 @
0x7e,0x11,0x11,0x11,0x7e, // 41 A
0x7f,0x49,0x49,0x49,0x36, // 42 B
0x3e,0x41,0x41,0x41,0x22, // 43 C
0x7f,0x41,0x41,0x22,0x1c, // 44 D
0x7f,0x49,0x49,0x49,0x41, // 45 E
0x7f,0x09,0x09,0x09,0x01, // 46 F
0x3e,0x41,0x49,0x49,0x7a, // 47 G
0x7f,0x08,0x08,0x08,0x7f, // 48 H
0x00,0x41,0x7f,0x41,0x00, // 49 I
0x20,0x40,0x41,0x3f,0x01, // 4a J
0x7f,0x08,0x14,0x22,0x41, // 4b K
0x7f,0x40,0x40,0x40,0x40, // 4c L
0x7f,0x02,0x0c,0x02,0x7f, // 4d M
0x7f,0x04,0x08,0x10,0x7f, // 4e N
0x3e,0x41,0x41,0x41,0x3e}; // 4f O
BYTE TABLE6[240]= {0x7f,0x09,0x09,0x09,0x06, // 50 P
0x3e,0x41,0x51,0x21,0x5e, // 51 Q
0x7f,0x09,0x19,0x29,0x46, // 52 R
0x46,0x49,0x49,0x49,0x31, // 53 S
0x01,0x01,0x7f,0x01,0x01, // 54 T
0x3f,0x40,0x40,0x40,0x3f, // 55 U
0x1f,0x20,0x40,0x20,0x1f, // 56 V
0x3f,0x40,0x38,0x40,0x3f, // 57 W
0x63,0x14,0x08,0x14,0x63, // 58 X
0x07,0x08,0x70,0x08,0x07, // 59 Y
0x61,0x51,0x49,0x45,0x43, // 5a Z
0x00,0x7f,0x41,0x41,0x00, // 5b [
0x02,0x04,0x08,0x10,0x20, // 5c
0x00,0x41,0x41,0x7f,0x00, // 5d
0x04,0x02,0x01,0x02,0x04, // 5e
0x40,0x40,0x40,0x40,0x40, // 5f
0x00,0x01,0x02,0x04,0x00, // 60
0x20,0x54,0x54,0x54,0x78, // 61 a
0x7f,0x48,0x44,0x44,0x38, // 62 b
0x38,0x44,0x44,0x44,0x20, // 63 c
0x38,0x44,0x44,0x48,0x7f, // 64 d
0x38,0x54,0x54,0x54,0x18, // 65 e
0x08,0x7e,0x09,0x01,0x02, // 66 f
0x0c,0x52,0x52,0x52,0x3e, // 67 g
0x7f,0x08,0x04,0x04,0x78, // 68 h
0x00,0x44,0x7d,0x40,0x00, // 69 i
0x20,0x40,0x44,0x3d,0x00, // 6a j
0x7f,0x10,0x28,0x44,0x00, // 6b k
0x00,0x41,0x7f,0x40,0x00, // 6c l
0x7c,0x04,0x18,0x04,0x78, // 6d m
0x7c,0x08,0x04,0x04,0x78, // 6e n
0x38,0x44,0x44,0x44,0x38, // 6f o
0x7c,0x14,0x14,0x14,0x08, // 70 p
0x08,0x14,0x14,0x18,0x7c, // 71 q
0x7c,0x08,0x04,0x04,0x08, // 72 r
0x48,0x54,0x54,0x54,0x20, // 73 s
0x04,0x3f,0x44,0x40,0x20, // 74 t
0x3c,0x40,0x40,0x20,0x7c, // 75 u
0x1c,0x20,0x40,0x20,0x1c, // 76 v
0x3c,0x40,0x30,0x40,0x3c, // 77 w
0x44,0x28,0x10,0x28,0x44, // 78 x
0x0c,0x50,0x50,0x50,0x3c, // 79 y
0x44,0x64,0x54,0x4c,0x44, // 7a z
0x00,0x08,0x36,0x41,0x00, // 7b
0x00,0x00,0x7f,0x00,0x00, // 7c
0x00,0x41,0x36,0x08,0x00, // 7d
0x10,0x08,0x08,0x10,0x08, // 7e
0x78,0x46,0x41,0x46,0x78}; // 7f
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
char charrange,charenvoie,charposit ion,chardonnee;
void lcd_gestion_port(char donnee_envoye)// permet la gestion de l'état des ports
{
if ((donnee_envoye & 0x80) == 1){B7=1;}
else {B7=0;}
donnee_envoye=donnee_envoye<<1 ;
if ((donnee_envoye & 0x80) == 1){B6=1;}
else {B6=0;}
donnee_envoye=(donnee_envoye<< 1);
if ((donnee_envoye & 0x80) == 1){B5=1;}
else {B5=0;}
donnee_envoye=donnee_envoye<<1 ;
if ((donnee_envoye & 0x80) == 1){B4=1;}
else {B4=0;}
donnee_envoye=donnee_envoye<<1 ;
if ((donnee_envoye & 0x80) == 1){B3=1;}
else {B3=0;}
donnee_envoye=donnee_envoye<<1 ;
if ((donnee_envoye & 0x80) == 1){B2=1;}
else {B2=0;}
donnee_envoye=donnee_envoye<<1 ;
if ((donnee_envoye & 0x80) == 1){B1=1;}
else {B1=0;}
donnee_envoye=donnee_envoye<<1 ;
if ((donnee_envoye & 0x80) == 1){B0=1;}
else {B0=0;}
delay_ms(2);
lcd_enable=0;
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void lcd_write_command(char donnee)
{
lcd_cs=0;
lcd_enable=1;
lcd_rs=0;
lcd_gestion_port(donnee);
lcd_cs=1;
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void lcd_write_data(char donnee_a_ecrire)
{
lcd_cs=0;
lcd_enable=1;
lcd_rs=1;
lcd_gestion_port(donnee_a_ecri re); // write display data
lcd_cs=1;
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void aw_lcd_init(void)
{
lcd_cs=0;
lcd_rst = 0;
delay_ms(15);
lcd_rst = 1;
delay_ms(1);
lcd_write_command(0xe2); //reste
lcd_write_command(0xa0); // ADC select: normal
lcd_write_command(0xc0); // SHL select:
lcd_write_command(0xb2); // LCD bias select:
lcd_write_command(0x2c); // Voltage converter ON
delay_ms(2);
lcd_write_command(0x2e); // Voltage regulator ON
delay_ms(2);
lcd_write_command(0x2f); // Voltage follower ON
lcd_write_command(0x25); // Regulator resistor select 0x20..0x27
lcd_write_command(0x81); // Reference voltage register set
lcd_write_command(0x18); // Reference voltage 0..63
lcd_write_command(0x40); // initial display line 0x40..0x7f
lcd_write_command(0xaf); // display ON
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void aw_lcd_gotoxy(byte x_col, byte y_row) // Positionnement du curseur
{
char hi_col,lo_col;
lo_col= (x_col&0x0f);
hi_col= ((x_col>>4)&0x0f)|0x10;
lcd_write_command(hi_col); // set higher column address
lcd_write_command(lo_col); // set lower column address
lcd_write_command(0xb0|(y_row& 0x0f)); // set GDDRAM page address 0..7 (for 8 rows)
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void ascii_to_lcd(void) // extract ascii from tables & write to LCD
{
if (charenvoie<0x20)return;
if (charenvoie>0x7f)return;
for (charrange=0;charrange<5;charr ange++) { // 5 bytes
if (charenvoie<0x50){charposition =(((charenvoie&0xff)-0x20)*5);chardonnee=TABLE5[(charposition+charrange)];} // use TABLE5
else if (charenvoie>0x4f){charposition =(((charenvoie&0xff)-0x50)*5);chardonnee=TABLE6[(charposition+charrange)];} // use TABLE6
lcd_write_data(chardonnee); // send data to nokia
}
lcd_write_data(0x00); // 1 byte (always blank)
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void aw_lcd_printchar(byte cvar) // Write 1 character to LCD
{
charenvoie=cvar;
ascii_to_lcd();
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void lcd_clear_screen(void)
{
char y;
for (y=0;y!=8;y++){
aw_lcd_gotoxy(0,y);
printf(aw_lcd_printchar," ");
}
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void main()
{
/****************************** ****************************** ***************/
//initialisation des ports en sortie
set_tris_B(0x00);// oooo oooo
set_tris_D(0xc0);// iioo oooo // RD1..5 all outputs
B0 =0;
B1 =0;
B2 =0;
B3 =0;
B4 =0;
B5 =0;
B6 =0;
B7 =0;
/****************************** ****************************** ***************/
//début de l'initialisation
aw_lcd_init();
lcd_clear_screen();
lcd_bl=1;
//fin d'initialisation
aw_lcd_gotoxy(0,0); // goto cursur location x= 0..127 PIXEL COLUMNS // y= 0..7 CHAR. ROWS
printf(aw_lcd_printchar,"bonjo ur !!"); // show simple text
}
Ps: J'ai oublié de vous spécifier que j'utilise le PORTD pour ce qui est "contrôle" du LCD et le PORTB pour tout ce qui est transfert des données.
-----