Ajuda - Busca - Membros - Calendário
Versão Completa: Teclado Keytec 44

Google
FórumWEB > Desenvolvimento > Automação Comercial
eselvati
Tenho alguns problemas com o teclado keytec 44.

Tenho uns clientes q adquiriram um pacote, micro, impressora, teclado, tudo da sweda, e este teclado é o keytec 44, a sweda disponibiliza um exemplo no site, em delphi mas com codigo ASM, e o display funciona com os micros da sweda e com alguns de arquitetura intel, mas qdo coloca um outro micro, tipo uns AMD, as mensagens no display piram, sai tudo bagunçado, e até hj nao encontrei uma solucao pra este modelo de teclado.

Alguem conhece uma solução diferente do exemplo da sweda ?
pq acho q deve ser este código em ASM q deve ter alguma particularidade.



Ederson

especificações do teclado: http://www.keytec.com.br/Automação/Display_02.asp
Obs: Segue em anexo unit keytec.pas, onde eu implemento as funcoes deste teclado
Daniel Simões
Ola Esalvati,

insira um Sleep(5) dentro dos Loops para nao "encavalar" o envio de bytes ao teclado

Veja esses códigos do ACBrDISGertecTeclado.pas
CODE
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.pas
CODE
{-----------------------------------------------------------------------------
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
Daniel Simões
Voce usa esses teclados em Windows XP ?

Pergunto isso porque no Win XP/NT/2000 não é permitido o uso de intruções em assembler... nesse caso, dá pra usar um device driver que "abra" algumas portas na máquina a fim de conseguir o acesso...
lafamac
Uso somente em windows 98, vou tentar implementar os loops mencionados



Ederson
Esta é uma versão simplificada de nosso conteúdo principal. Para ver a versão completa com maiores informações, formatação e imagens, por favor clique aqui.
Invision Power Board © 2001-2009 Invision Power Services, Inc.