déplacer tête d'impression [Aide] - Divers - Programmation
Marsh Posté le 19-09-2005 à 08:21:35
J'avais fait un truc du style a la fac (avec un robot pas une imprimante ) en C++ mais je n'arrive pas a retrouver mes cours
j'ai en revanche vu l'article suivantici
Comment piloter une sortie imprimante sur un PC
Zône réservée aux Programmeurs ou aux vilains curieux
Pour les autres, vous cassez pas la tête et utilisez les logiciels qui sont disponibles sur ce site.
Tout se passe au niveau des ports d'imprimante. On utilisera les trois registres qui lui sont réservés :
data : port de sortie des données sur 8 bits
etat : port d'entrée. l'état de l'imprimante..
cont : registre de contrôle
Voila une première procédure pour initialiser les variables liées aux adresses des ports imprimante :
en TurboPascal ou Delphi1:
procedure InitLpt(lpt:byte);
begin
if lpt=1 then begin data:=$0378; etat:=$0379; cont:=$037A; end;
if lpt=2 then begin data:=$0278; etat:=$0279; cont:=$027A; end;
if lpt=3 then begin data:=$03BC; etat:=$03BD; cont:=$03BE; end; { mono }
port[data]:=$00; { remise à zéro des huit sorties }
port[cont]:=$04; { les bits de selection inactifs }
end;
en basic (beuark, ça existe encore ?) :
10 lpt = 1 ; (ou 2 ou 3)
20 if lpt=1 then data=&h0378 : etat=&h0379 : cont=&h037A
30 if lpt=2 then data=&h0278 : etat=&h0279 : cont=&h027A
40 if lpt=3 then data=&h03BC : etat=&h03BD : cont=&h03BE
50 out data = &h00; mise à zéro des huit sorties
60 out cont = &h04; les bits de selection inactifs
Attention : le basic n'étant pas standard, vérifiez bien la syntaxe du tien.
1) Sorties
Voici un petit exemple plus explicite que bien des discours.
en TurboPascal et Delphi1:
procedure EcritureHard(Sortie : byte); {Sortie contient la valeur à sortir}
begin
Port[Data]:=Sortie; {seulement pour les sorties 8 bits lpt}
end;
en basic :
110 Sortie = &hxx ; &hxx contient la valeur à sortir
120 Out Data = Sortie
2) Entrées
Là, c'est un peu plus complexe puisque certains des bits du registre d'état sont inversés (c'est pas ma faute, c'est IBM qui l'a fait le PC !)
Cette procédure recupère les cinq bits d'entrée. Elle fonctionne sur tout type de PC. Puisqu'on branche des contacts sur les entrées, la lecture est inversée ( car par défaut les entrées sont polarisées au + 5V )
Function Lecture_Inv : byte;
{ bits intéressants : Nx11 1xxx à mettre en ordre, le bit 7 est inversé }
var octet, octet1 : byte;
begin
octet := port[etat]; { Nx11 1xxx }
octet := octet div 8; {decale octet de 3 à droite 000N x111 }
octet := octet xor $07; {inverse les 3 premiers bit 000N xNNN }
octet1 := octet mod 8; {stocke les 3 derniers bits dans octet1 }
octet := octet and $F0; {mise à 0 des 4 derniers bits 000N 0000 }
octet := octet div 2; {decale bit4 à droite 0000 N000 }
octet := octet + octet1; {reconstitue les 4 derniers bits 0000 NNNN }
if (port[Etat] and $40)<>0 then octet := octet + 16; {lecture bit 4}
Lecture_Inv := octet;
end;
Voici une autre fonction qui n'est acceptée que par les µP > 286. Elle permet de lire très rapidement les quatre premières entrées (0..3)
Function Lecture_Inv : byte; { restitue un quartet inversé (TTL) }
{ bits intéressants : Nx11 1xxx à mettre en ordre, le bit 7 est inversé }
begin
asm {seulement pour les 80286 et superieurs}
mov dx,etat
in al,dx { al = port[etat] Nx11 1xxx }
shr al,3 { decale al de 3 à droite 000N x111 }
mov ah,al { fait un double de al dans ah}
and al,$07 { mise à 0 des 4ème et 5ème bits de al 0000 0111 }
and ah,$10 { mise à 0 des 4 premiers bits de ah 000N 0000 }
shr ah,1 { decale ah de 1 à droite 0000 N000 }
or al,ah { assemble al et ah dans al 0000 N111 }
xor al,$07 { inversion 3 premiers bits xxxx NNNN }
mov @result,al { met al dans le retour fonction (lecture) }
end;
end;
3)Lecture et écriture d'un port entrée/sortie en Delphi32 (Delphi2 et +)
Parmis les nouveautés de Delphi32, la disparition du tableau Port[adresse]
var Entree, Sortie : SmallInt;
procedure Lecture;
begin
asm
mov dx,0379h // adresse $0379 dans DX
in al,dx // lecture du port dans AL
mov Entree,al // AL dans la variable
end;
end;
procedure Ecriture;
begin
asm
mov dx,0378h // adresse $0378 dans DX
mov ax,Sortie // ecriture de la variable dans AL
out dx,al // ecriture de AL dans le port
end;
end;
4)DLL
Pour les programmeurs sous Windows, j'ai créé des DLL qui sont disponibles avec le programme GrafPiou pour Windows. (bipas128.dll, bipas115.dll, Dialog.dll, FischerT.dll, Jeulin.dll et PIA1.dll). Sers-toi ou contacte moi.
Voilà, c'est fini pour moi et je rentre me coucher mais pour toi, AU BOULOT, ça traine, allez allez... :-))
Marsh Posté le 19-09-2005 à 08:09:42
Bonjours dans le cadre des PPE (projets pluritechniques encadrés) de mon lycée, j'aurai besoind d'aide pour déplacer la tete d'impression d'une imprimante sur une distance donnée grace à un ordinateur (sur une imprimante tournant à vide, c'est pour déplacer quelque chose grace à la tete )
J'avais poster dans la partie périphérique mais on ma conseiller de changer mon post d'endroit car il semble que mon problème releve plus de la programation
Merci de répondre en exposants toute les idées qui vous sembles réalisables.
++