Ola Esalvati,
insira um Sleep(5) dentro dos Loops para nao "encavalar" o envio de bytes ao teclado
Veja esses códigos do
ACBrDISGertecTeclado.pasCODE
const
PortAtOut = 96;
PortAtIn = 100;
TxKeyboard( 231 ); // Liga display
For A := 1 to Length( Texto ) do
TxKeyboard( ord(Texto[A]) ); // Envia um Byte por vez...
TxKeyboard( 232 ); // DesLiga display
procedure TACBrDISGertecTeclado.TxKeyboard(B: Byte);
begin
{ Aguarda se a porta AT nao está livre }
while (InPort( PortAtIn ) and 02) <> 0 do
sleep(1);
OutPort( PortAtOut, B);
sleep( fsIntervaloEnvioBytes );
end;
ACBrUtil.pasCODE
{-----------------------------------------------------------------------------
Lê 1 byte de uma porta de Hardware
Nota: - Essa funçao funciona normalmente em Win9x,
- XP /NT /2000, deve-se usar um device driver que permita acesso direto
a porta do Hardware a ser acessado (consulte o fabricante do Hardware)
- Linux: é necessário ser ROOT para acessar /dev/port
(use: su ou chmod u+s SeuPrograma )
---------------------------------------------------------------------------- }
{$WARNINGS OFF}
function InPort(PortAddr:word): byte;
{$IFDEF LINUX}
var Buffer : Pointer;
FDevice : String;
N : Integer;
FHandle : Integer;
{$ENDIF}
begin
{$IFDEF MSWINDOWS}
asm
mov dx,PortAddr
in al,dx
end;
{$ELSE}
FDevice := '/dev/port';
Buffer := @Result;
FHandle := FileOpen(FDevice, fmOpenRead);
if FHandle <= 0 then
raise Exception.Create('Erro abrindo: '+FDevice+#10+#10+
'Você deve ter direito de Leitura nesse diretório.');
try
N := FileSeek( FHandle, PortAddr, 0 );
if N <= 0 then
raise Exception.Create('Erro ao acessar a porta: '+IntToStr(PortAddr));
N := FileRead(FHandle, Buffer^, 1);
if N <= 0 then
raise Exception.Create('Erro ao ler a porta: '+IntToStr(PortAddr));
finally
FileClose( FHandle );
end;
sleep(5);
{$ENDIF}
end;
{$WARNINGS ON}
{-----------------------------------------------------------------------------
Envia 1 byte para uma porta de Hardware
Nota: - Essa funçao funciona normalmente em Win9x,
- XP /NT /2000, deve-se usar um device driver que permita acesso direto
a porta do Hardware a ser acessado (consulte o fabricante do Hardware)
- Linux: é necessário ser ROOT para acessar /dev/port
(use: su ou chmod u+s SeuPrograma )
---------------------------------------------------------------------------- }
procedure OutPort(PortAddr: word; Databyte: byte);
{$IFDEF LINUX}
var Buffer : Pointer;
FDevice : String;
N : Integer;
FHandle : Integer;
{$ENDIF}
begin
{$IFDEF MSWINDOWS}
asm
mov al, Databyte
mov dx,PortAddr
out dx,al
end;
{$ELSE}
Buffer := @Databyte;
FDevice := '/dev/port';
FHandle := FileOpen(FDevice, fmOpenWrite);
if FHandle <= 0 then
raise Exception.Create('Erro abrindo: '+FDevice+#10+#10+
'Você deve ter direito de Escrita nesse diretório.');
try
N := FileSeek( FHandle, PortAddr, 0 );
if N <= 0 then
raise Exception.Create('Erro ao acessar a porta: '+IntToStr(PortAddr));
N := FileWrite(Fhandle, Buffer^, 1);
if N <= 0 then
raise Exception.Create('Erro ao escrever na porta: '+IntToStr(PortAddr));
finally
FileClose( FHandle );
end;
sleep(5);
{$ENDIF}
end;
Esqueci de mencionar que as funçoes InPort e OutPort acima são compatíveis com Windows e Linux