Diferente da linguagem C, a qual a maioria de nós estamos ambientados, no delphi o programa é dividido em vários códigos.
Aqui segue a parte do layout do progama, botões, labels etc... (Unit1.dfm):
;------------------------------------Unit1.dfm----------------------------------------
object Form1: TForm1
Left = 189
Top = 119
Width = 352
Height = 317
Caption = 'Controle - Motor de Passo'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Left = 24
Top = 24
Width = 71
Height = 22
Caption = 'Motor 1'
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -19
Font.Name = 'Arial'
Font.Style = [fsBold]
ParentFont = False
end
object Label2: TLabel
Left = 216
Top = 24
Width = 71
Height = 22
Caption = 'Motor 2'
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -19
Font.Name = 'Arial'
Font.Style = [fsBold]
ParentFont = False
end
object Label3: TLabel
Left = 8
Top = 120
Width = 71
Height = 18
Caption = 'Sentido 1:'
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -15
Font.Name = 'Arial'
Font.Style = [fsBold]
ParentFont = False
end
object Label4: TLabel
Left = 200
Top = 120
Width = 71
Height = 18
Caption = 'Sentido 2:'
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -15
Font.Name = 'Arial'
Font.Style = [fsBold]
ParentFont = False
end
object LaVelocidade2: TLabel
Left = 200
Top = 208
Width = 94
Height = 18
Caption = 'Velocidade 2:'
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -15
Font.Name = 'Arial'
Font.Style = [fsBold]
ParentFont = False
end
object LaVelocidade1: TLabel
Left = 8
Top = 208
Width = 94
Height = 18
Caption = 'Velocidade 1:'
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -15
Font.Name = 'Arial'
Font.Style = [fsBold]
ParentFont = False
end
object Button1: TButton
Left = 16
Top = 64
Width = 89
Height = 33
Caption = 'DESLIGADO'
TabOrder = 0
OnClick = Button1Click
end
object Button2: TButton
Left = 208
Top = 64
Width = 89
Height = 33
Caption = 'DESLIGADO'
TabOrder = 1
OnClick = Button2Click
end
object Sentido1: TButton
Left = 208
Top = 160
Width = 89
Height = 33
Caption = 'HOR'#193'RIO'
TabOrder = 2
OnClick = Sentido1Click
end
object Sentido: TButton
Left = 16
Top = 160
Width = 89
Height = 33
Caption = 'HOR'#193'RIO'
TabOrder = 3
OnClick = SentidoClick
end
object ScrollBar1: TScrollBar
Left = 16
Top = 240
Width = 89
Height = 17
Max = 225
Min = 1
PageSize = 0
Position = 1
TabOrder = 4
OnScroll = ScrollBar1Scroll
end
object ScrollBar2: TScrollBar
Left = 208
Top = 240
Width = 89
Height = 17
Max = 225
PageSize = 0
TabOrder = 5
OnScroll = ScrollBar2Scroll
end
end
Agora o arquivo principal com o algorítimo (unit1.pas e unit2.pas):
;------------------------------------Unit1.pas---------------------------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
Button2: TButton;
Sentido1: TButton;
Sentido: TButton;
Label3: TLabel;
Label4: TLabel;
ScrollBar1: TScrollBar;
ScrollBar2: TScrollBar;
LaVelocidade2: TLabel;
LaVelocidade1: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure SentidoClick(Sender: TObject);
procedure Sentido1Click(Sender: TObject);
procedure ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;
var ScrollPos: Integer);
procedure ScrollBar2Scroll(Sender: TObject; ScrollCode: TScrollCode;
var ScrollPos: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
if Button1.Caption='LIGADO' then
begin
Button1.Caption:='DESLIGADO';
end
else
button1.Caption:='LIGADO';
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if Button2.Caption='LIGADO' then
Button2.Caption:='DESLIGADO'
else
button2.Caption:='LIGADO';
end;
procedure TForm1.SentidoClick(Sender: TObject);
begin
if Sentido.Caption='HORÁRIO' then
Sentido.Caption:='ANTI-HORÁRIO'
else
Sentido.Caption:='HORÁRIO';
end;
procedure TForm1.Sentido1Click(Sender: TObject);
begin
if Sentido1.Caption='HORÁRIO' then
Sentido1.Caption:='ANTI-HORÁRIO'
else
Sentido1.Caption:='HORÁRIO';
end;
procedure TForm1.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;
var ScrollPos: Integer);
var
velocidade : Integer;
begin
velocidade := scrollbar1.position;
lavelocidade1.Caption :='Velocidade 1: ' + inttostr(velocidade) + 'ms';
end;
procedure TForm1.ScrollBar2Scroll(Sender: TObject; ScrollCode: TScrollCode;
var ScrollPos: Integer);
var
velocidade1 : Integer;
begin
velocidade1 := scrollbar2.position;
lavelocidade2.Caption :='Velocidade 2: ' + inttostr(velocidade1) + 'ms';
end;
end.
;-----------------------------Unit2.pas--------------------------------------------
unit Unit2;
interface
uses
Classes,unit1,SysUtils, Variants, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
loop = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
procedure Atualiza;
procedure Atualiza1;
end;
implementation
procedure outportb(EndPorta: Integer; Valor:BYTE); stdcall; external 'inpout32.DLL' name 'Out32';
function inportb(EndPorta: Integer): BYTE stdcall; external 'inpout32.DLL' name 'Inp32';
var
contador: integer;
passos2: integer;
procedure loop.Atualiza;
begin
with Form1 do
begin
label5.caption:='Giros = ' + inttostr(contador);
end;
end ;
procedure loop.Atualiza1;
begin
with Form1 do
begin
label6.caption:='Giros = ' + inttostr(passos2);
end;
end ;
procedure loop.Execute;
begin
with Form1 do
begin
while (button1.caption='LIGADO') AND (button2.Caption='DESLIGADO') do
begin
if sentido.Caption='HORÁRIO' then
begin // SENTIDO HORARIO MOTOR DE PASSO
outportb($378,$04);
sleep(scrollbar1.Position);
outportb($378,$08);
sleep(scrollbar1.Position);
outportb($378,$10);
sleep(scrollbar1.Position);
outportb($378,$20);
sleep(scrollbar1.Position);
passos:= passos + 1;
end
else
begin // SENTIDO ANTI HORARIO MOTOR DE PASSO
outportb($378,$20);
sleep(scrollbar1.Position);
outportb($378,$10);
sleep(scrollbar1.Position);
outportb($378,$08);
sleep(scrollbar1.Position);
outportb($378,$04);
sleep(scrollbar1.Position);
passos:= passos - 1;
end;
contador := passos;
synchronize(atualiza);
if(button1.caption='DESLIGADO') OR (button2.Caption='LIGADO')then
begin
exit;
end;
end;
while (button1.caption='LIGADO') AND (button2.Caption='LIGADO') do
begin
if sentido1.Caption='HORÁRIO' then
begin
byt:= $10;
x:=1;
end
else
begin
byt:= $20; x:=-1;
end;
if sentido.Caption='HORÁRIO' then
begin // SENTIDO HORARIO MOTOR DE PASSO
outportb($378,$01 + byt);
sleep(scrollbar1.Position);
outportb($378,$02 + byt);
sleep(scrollbar1.Position);
outportb($378,$04 + byt);
sleep(scrollbar1.Position);
outportb($378,$08 + byt);
sleep(scrollbar1.Position);
passos:= passos + 1;
passos1:= passos1 + 4*x;
end
else
begin // SENTIDO ANTI HORARIO MOTOR DE PASSO
outportb($378,$08 + byt);
sleep(scrollbar1.Position);
outportb($378,$04 + byt);
sleep(scrollbar1.Position);
outportb($378,$02 + byt);
sleep(scrollbar1.Position);
outportb($378,$01 + byt);
sleep(scrollbar1.Position);
passos:= passos - 1;
passos1:= passos1 + 4*x;
end;
contador := passos;
passos2:= passos1;
synchronize(atualiza);
synchronize(atualiza1);
if(button1.caption<>'LIGADO') OR (button2.Caption<>'LIGADO')then
exit;
end;
while (button1.caption='DESLIGADO') AND (button2.Caption='LIGADO') do
begin
if sentido1.Caption='HORÁRIO' then
begin // SENTIDO HORARIO MOTOR DC
outportb($378,$10);
sleep(scrollbar2.Position);
passos1:= passos1 + 1;
end
else
begin // SENTIDO ANTI HORARIO MOTOR DC
outportb($378,$20);
sleep(scrollbar2.Position);
passos1:= passos1 - 1;
end;
if(button1.caption='DESLIGADO') OR (button2.Caption='DESLIGADO')then
begin
sleep(scrollbar1.Position*4);
outportb($378,0);
exit;
end;
passos2:= passos1;
synchronize(atualiza1);
if(button1.caption<>'DESLIGADO') OR (button2.Caption<>'LIGADO')then
exit;
end;
end;
end;
end.
;--------------------------------FIM---------------------------------------------
Sou inesperiente em delphi, e com o pouco que sabia criei esse algorítimo. Estou aberto a ajuda para possíveis melhorias nesse algorítimo, entretanto, dessa forma roda 100%. valeu!
OBS: OS CÓDIGOS NÃO ESTÃO COMENTADOS. QUALQUER DÚVIDA ENTRAR EM CONTATO
e.sampaioo@hotmail.com
Arquivos para download:
http://rapidshare.com/files/163558447/Programa_Projeto_ARHTE_DEFINITIVO.rar.html