Projet TuMP3? : Software

Accueil

Infos

Hardware

Software

Contact

Liens

Projet : TuMP3?

Software

[ Introduction ] [ Piloter le LCD ] [ Piloter le Joypad ] [ Piloter Winamp ]
[ LCD3 Soft Player v1.x ] [ LCD3 Soft Player v2.x ]

Introduction

J'ai choisi Windows comme platforme de developpement car je ne connais très peu Linux et que je programme facilement avec Delphi 4 (bien que je devrai me mettre au C++ mais j'ai pas le courage). De plus, pour le décodage MP3, j'ai la possibilité d'utiliser Winamp. J'aurais pu programmer un plug-ins mais j'ai pas trouvé la documentation suffisante. J'ai donc décidé de créer une application qui pilote Winamp, affiche les informations sur le LCD et qui se pilote au joypad.

Les sections suivantes décrivent plus ou moins précisément les différentes parties de mon software.

[ Introduction ] [ Piloter le LCD ] [ Piloter le Joypad ] [ Piloter Winamp ]
[ LCD3 Soft Player v1.x ] [ LCD3 Soft Player v2.x ]

Piloter le LCD

Le LCD est connecté au port parallèle. Il est très simple à utiliser. Après lui avoir envoyé une séquence d'initialisation, il suffit de lui envoyer les codes des caractères (la table est quasi identique à la table ASCII) pour voir les caractères s'afficher.

J'ai connecté le module en 8 bits mais il est possible de connecter que 4 bits (les écritures sur le port se font en 2 fois).

Comme décrit dans la section Hardware, les huits bits correspondent aux 8 bits du port //. Par défaut, l'addresse du port est 0378h. A ma connaissance Delphi ne sait pas écrire directement sur le port, j'ai donc programmé tous les accès au port en assembleur. Pour activer les bits correspondants au RS et E, j'utilise les procédures suivantes :

Procedure e_on;assembler;
asm
 mov dx,37Ah {addresse 37A en hexa}
 in al,dx    {lit le port}
 or al,01h   {met le premier bit à 1}
 out dx,al   {écrit sur le port}
end;
Procedure e_off;assembler;
asm
 mov dx,37Ah {addresse 37A en hexa}
 in al,dx    {lit le port}
 and al,0FEh {met le premier bit à 0}
 out dx,al   {écrit sur le port}
end;
Procedure rs_on;assembler;
asm
 mov dx,37Ah {addresse 37A en hexa}
 in al,dx    {lit le port}
 or al,08h   {met le 4eme bit à 1}
 out dx,al   {écrit sur le port}
end;
Procedure rs_off;assembler;
asm
 mov dx,37Ah {addresse 37A en hexa}
 in al,dx    {lit le port}
 and al,0F7h {met le 4eme bit à 0}
 out dx,al   {écrit sur le port}
end;
Procedure wport(portnum : word;b : byte);
begin
asm
 mov dx,portnum
 mov al,b
 out dx,al
end;
end;

Les procédures e_on, e_off, rs_on, rs_off commandent les états de E et RS. La procédure wport(portnum,b) écrit l'octet b sur le port d'addresse portnum.

La procedure d'initialisation est la suivante :

Procedure delay(t : integer);
var l : longint;
begin
 for l := 0 to t*80000 do
  begin
  end;
end;


Procedure initlcd(Cursor_on : boolean; Blink_on : boolean);
{Cursor_on : le curseur est visible, Blink_on : il clignote}

var i : integer;
    init : array[0..4] of byte;
begin
if Cursor_on then
 if Blink_on then init[0] := $0F
  else init[0] := $0E
 else
  if Blink_on then init[0] := $0D
  else init[0] := $0C;
 init[1] := $01; {efface l'écran}
 init[2] := $38; {8 bits, 2 lignes}
 init[3] := $38;
 init[4] := $80; {1er caractère ligne du haut}
 asm
  mov dx,37Ah
  in al,dx
  and al,0DFh
  out dx,al
 end;
 rs_on;
 for i := 0 to 4 do
  begin
   wport($378,init[i]);
   e_on;
   delay(3);
   e_off;
   delay(3);
  end;
 rs_off;
end;

La procédure delay permet une temporisation de manière à ce que le LCD est le temps de tout traiter.

Procedure addcar(c : char); {écrit le caractère c à la position du curseur}
begin
 wport($378,ord(c));
 e_on;
 delay(1);
 e_off;
 delay(1);
end;


Procedure LCDpos(x,y : byte); {place le curseur à la ligne y, position x}
{Première ligne premier caractère -> (x,y) = (0,0)}

var w : Byte;
begin
 case y of
  0 : w := $80;
  1 : w := $C0;
  else w := $80;
 end;
 w := w + x;
 rs_on;
 wport($378,w);
 e_on;
 delay(2);
 e_off;
 delay(2);
 rs_off;
end;


Procedure writelcd(st : string; l : boolean);
{Ecrit une chaine sur la ligne 1 si l = true, 2 si l = false}
var i : integer;
begin
 rs_on;
 if l then wport($378,$80) else wport($378,$C0);
 e_on;
 delay(2);
 e_off;
 delay(2);
 rs_off;
 for i := 1 to length(st) do
  case st[i] of
   ' '..'Z' : addcar(st[i]);
   'a'..'z' : addcar(st[i]);
        '\' : addcar(chr(126));
   chr(126) : addcar(chr(126))
       else addcar(chr(219));
  end;
end;

Voilà tout ce qui peut vous être utile concernant le LCD. N'hésitez pas à me contacter au cas où vous souhaiteriez de plus amples expliquations.

[ Introduction ] [ Piloter le LCD ] [ Piloter le Joypad ] [ Piloter Winamp ]
[ LCD3 Soft Player v1.x ] [ LCD3 Soft Player v2.x ]

 

Piloter le Joypad

[ Introduction ] [ Piloter le LCD ] [ Piloter le Joypad ] [ Piloter Winamp ]
[ LCD3 Soft Player v1.x ] [ LCD3 Soft Player v2.x ]

Piloter Winamp

[ Introduction ] [ Piloter le LCD ] [ Piloter le Joypad ] [ Piloter Winamp ]
[ LCD3 Soft Player v1.x ] [ LCD3 Soft Player v2.x ]

LCD3 Soft Player v1.x

[ Introduction ] [ Piloter le LCD ] [ Piloter le Joypad ] [ Piloter Winamp ]
[ LCD3 Soft Player v1.x ] [ LCD3 Soft Player v2.x ]

LCD3 Soft Player v2.x

[ Introduction ] [ Piloter le LCD ] [ Piloter le Joypad ] [ Piloter Winamp ]
[ LCD3 Soft Player v1.x ] [ LCD3 Soft Player v2.x ]