[Troche OT] Wyświetlacz znakowy LCD i XP

0

Przepraszam, że trochę nie na temat... Moje Delphinowe wypociny muszą "wypluć" coś na zewnątrz w sytuacji, kiedy brak monitora podpiętego do komputera. I mam kilka pytań.

  1. Czy jak program jest napisany pod określoną rozdzielczość, a system (Windows XP) uruchomi się bez monitora (mam nadzieję, że uruchomi się...) czy wtedy zachowana jest ostatnio ustawiona rozdzielczość ekranu? Mój programik ma być uruchamiany razem z systemem.

  2. Chciałbym, aby podstawowe komunikaty były podawane na prosty znakowy LCD - typu 2x24 znaki czy jak mu tam ;) I tu pytanie trochę do elektroników - czy spotkaliście jakiegoś gotowe "kity", któe można podpiąć do portu LPT, i co ważne - żeby dało się to programować z Windows XP? Lutować potrafię, ale sam takiego ustrojstwa nie wyczaruje...

  3. Zakładając, że zdobędę gdzieś taki LCD do LPT, to czy Windows XP pozwoli bez strasznych magicznych tricków wysyłać dane wprost z programu napisanego w Delphi do tego portu? Znalazłem kilka komponentów, ale pod Win98/ME.

Pozdrowienia,
Jacek

0

http://www.google.pl/search?q=HD44780&ie=UTF-8&oe=UTF-8&hl=pl&btnG=Szukaj+z+Google&lr=lang_pl

sam sobie takiego zmontowałem (2x16 - na więcej mnie nie było stać... a teraz 3x24 są na allegro za 25 zł)

0

OK, dzięki. Ponieważ elektronik ze mnie żaden, powiedz mi czy to są kompletne zestawy - wprost do podpiecia do LPT? Czego używasz do programowania? Oczywiście chodzi mi o Delphi i WinXP.

Jacek

0

OK, dzięki. Ponieważ elektronik ze mnie żaden, powiedz mi czy to są kompletne zestawy - wprost do podpiecia do LPT?

HD44780 same w sobie mają wbudowaną obsługę portu równoległego, wystarczy tyle że podepniesz taki wyświetlacz pod port LPT. Czyli potrzebne będą - lutownica, kabel (10cio żyłowy polecam) i wtyczka..
Schematy znajdziesz na googlach - nic trudnego.

Czego używasz do programowania? Oczywiście chodzi mi o Delphi i WinXP.

Z samego delphi nie programowałem mojego lcd. Korzystałem z Smarie LCD - taki sobie oraz Crystal Control - duże możliwości. Ale z tego co czytałem samo programowanie wyświetlacza także nie powinno sprawić problemu - ot zwykłe wysyłanie znaków na port. Zobacz http://www.linuxfocus.org/Polish/September2002/article258.shtml - mimo że przykłady w C, to z pojęciem o co chodzi nie będziesz miał problemu.

0

Bardzo dziękuję. Lada moment dotrze do mnie LCD i będę testował. Już widzę pierwszy problem - natury technicznej, złącze to 20-pinowa listwa, a nigdzie nie namierzyłem gniazda do takiej :(

Pozdrowienia,
Jacek

0

heyy :P

tak mnie zainteresował temat tych wyświetlaczy, że pogłębiłem się w temacie i sam sobie zamówiłem wyświetlacz LCD.

http://www.cebit.pl/ - fajny sklep - dobre LCD od 11 zł.
hmm na google jest kilka rzeczy o programowaniu LCD pod Delphi,
wystarczy wpisać "HD44780 delphi"
http://www.google.pl/search?hl=pl&ie=UTF-8&oe=UTF-8&q=HD44780+delphi&lr=lang_pl

0

znalazłem jeden z kodów do delphi, do odczytu % użycia CPU i pokazania na LCD:

unit fmTest;

interface


uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, adCpuUsage, ExtCtrls, Spin;

type
  TTestForm = class(TForm)
    Timer: TTimer;
    Timer1: TTimer;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    SpinEdit1: TSpinEdit;
    Label1: TLabel;
    procedure TimerTimer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure CzasNaZnak(Sender: TObject);
    procedure set278(Sender: TObject);
    procedure set378(Sender: TObject);
    procedure buf_change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  TestForm: TTestForm;
  buffer: string;
  akt,LPT,bufl: integer;


implementation

{$R *.DFM}

uses shellapi;

procedure prt(portn: word; val: byte);
begin
  asm
    mov al,val
    mov dx,portn
    out dx,al
  end;
end;


procedure write_LPT(a: byte; sterowanie:boolean);
begin
  if sterowanie=TRUE then      {RS=strobe=LSB}
  begin
    prt(LPT+$02,$08);  { RS=1, E=0 }
    prt(LPT+$02,$09);   { RS=0, E=0 }
    prt(LPT+$00,a);    {dana}
    prt(LPT+$02,$01);  { RS=0, E=1 }
    prt(LPT+$02,$09);  { RS=0, E=0 }

  end else
  begin
    prt(LPT+$02,$09);  { RS=0, E=0 }
    prt(LPT+$02,$08);   { RS=1, E=0 }
    prt(LPT+$00,a);    {dana}
    prt(LPT+$02,$00);  { RS=1, E=1 }
    prt(LPT+$02,$08);  { RS=1, E=0 }
  end;
end;

procedure lcd_init;
begin
  sleep(10);
  write_LPT(32+16+8,TRUE);
  sleep(10);
  write_LPT(16+4,TRUE);
  sleep(10);
  write_LPT(8+4,TRUE);
  sleep(10);
  write_LPT(4+2,TRUE);
  sleep(10);
  write_LPT(1,TRUE);
  sleep(10);
end;

procedure lcd_clear;
begin
  write_LPT(1,TRUE);
end;

procedure lcd_home;
begin
  write_LPT(2,TRUE);
end;

procedure lcd_shift;
begin
  write_LPT(16+8+4+1,TRUE);
end;

procedure lcd_string(s:string);
var i:byte;
begin
  for i:=1 to length(s) do write_LPT(ord(s[i]),FALSE);
end;

procedure lcd_define(d0,d1,d2,d3,d4,d5,d6,d7:byte);
begin
  sleep(10);
  write_LPT(d0,FALSE);
  sleep(10);
  write_LPT(d1,FALSE);
  sleep(10);
  write_LPT(d2,FALSE);
  sleep(10);
  write_LPT(d3,FALSE);
  sleep(10);
  write_LPT(d4,FALSE);
  sleep(10);
  write_LPT(d5,FALSE);
  sleep(10);
  write_LPT(d6,FALSE);
  sleep(10);
  write_LPT(d7,FALSE);
  sleep(10);
end;



procedure TTestForm.TimerTimer(Sender: TObject);
var i: Integer;
    j: Double;
    s:string;
begin
    CollectCPUData;

    j:=GetCPUUsage(0)*100;
    s:=Format('%1.0f%%  ',[j]);
    TestForm.Caption:='CPU Usage = '+s;
    Application.Title:='CPU Usage = '+s;
    for i:=1 to 4 do buffer[i]:=s[i];
    for i:=bufl+6 downto 6 do buffer[i]:=buffer[i-1];
    buffer[5]:=chr(trunc(j/13)+8);
    lcd_home;
    sleep(10);
    akt:=1;
end;

procedure TTestForm.FormCreate(Sender: TObject);
var i: Integer;
begin
    akt:=0;
    LPT:=$378;
    lcd_init;
    sleep(1000);
    write_LPT(64,TRUE);
    sleep(10);
    bufl:=SpinEdit1.Value;
    lcd_define(0 ,0 ,0 ,0 ,0 ,0 ,0 ,31);
    lcd_define(0 ,0 ,0 ,0 ,0 ,0 ,31,31);
    lcd_define(0 ,0 ,0 ,0 ,0 ,31,31,31);
    lcd_define(0 ,0 ,0 ,0 ,31,31,31,31);
    lcd_define(0 ,0 ,0 ,31,31,31,31,31);
    lcd_define(0 ,0 ,31,31,31,31,31,31);
    lcd_define(0 ,31,31,31,31,31,31,31);
    lcd_define(31,31,31,31,31,31,31,31);
    buffer:='                                                             ';

end;

procedure TTestForm.CzasNaZnak(Sender: TObject);
begin
  if (akt<bufl+6) then
  begin
    write_LPT(ord(buffer[akt]),FALSE);
    akt:=akt+1;
  end;
end;

procedure TTestForm.set278(Sender: TObject);
begin
  LPT:=$278;
end;

procedure TTestForm.set378(Sender: TObject);
begin
  LPT:=$378;
end;

procedure TTestForm.buf_change(Sender: TObject);
begin
  bufl:=SpinEdit1.Value;
end;

end.

tylko przy wykonaniu wstawki asemblerowej, pojawia się błąd w XP "Privileged Instruction", przy:

  asm
    mov al,val
    mov dx,portn
    out dx,al
  end;

można to jakoś ominąć ?
pozdro

0

trzeba samemu polaczyc kanaly :-) mi to zajmuje po 2,5 godziny :/ 25+36

0

jak podłączyć wyświetlacz LCD do portu LPT.
Co jest potrzebne dokładnym opisem.

Informacje o wyświetlczu na: http://www.cebit.pl LCD 1x24

pozdro

0

Umęczę Was ;) Sprzęt działa... ale nie z Delphi :( Te dodatkowe programiki wszystko obsługują, natomiast jedyny kod - z tego forum - nie działa. Probowałem podglądać inne - ale niestety wszystko jest w C, poza tym nie działa :) Czy ktoś może mnie poratować?

Jacek

0

Prawie przyrzekam, że to ostatni raz ;-) Ale poradziłem sobie! [hurrra] ;-) no i chce się podzielić ;-)
Ponieważ sam długo szukałem, ale w końcu znalazłem, więc podzielę się tym, co wiem.

Skorzystałem z freeware'owego zlportio [jest np. na stronce Torry's Delphi...]. Oczywiście pod NT (XP/2K) trzeba doinstalować obsługę portu [google i port95nt3.exe]. Dla leniwych:

http://www.radio.kielce.com.pl/jh/soft/zlportio.zip 12kB
http://www.radio.kielce.com.pl/jh/soft/port95nt3.exe 1.2MB

Podstawowe elementy kodu:

const
Data = $378; // domyślny adres portu
Status = Data + 1;
Control = Data + 2;

Posłużyłem się dwoma procedurami:

procedure LCD_WriteCommand(a: Byte);
// Wysylanie komend sterujacych
begin
zlioportwrite(Data, 0, a);
Sleep(5);
zlioportwrite(Control, 0, $02);
Sleep(5);
zlioportwrite(Control, 0, $03);
Sleep(5);
end;

procedure LCD_WriteData(a: Byte);
// Wysylanie danych
begin
zlioportwrite(Control, 0, $06);
Sleep(5);
zlioportwrite(Data, 0, a);
Sleep(5);
zlioportwrite(Control, 0, $07);
Sleep(5);
end;

Procedura inicjalizacji może wyglądać np. tak
procedure LCD_Init;
begin
LCD_WriteCommand($38);
Sleep(20);
LCD_WriteCommand($06);
Sleep(20);
LCD_WriteCommand($0C);
Sleep(20);
LCD_WriteCommand($01);
Sleep(20);
end;

Czasem LCD może "nie załapać" startu, więc $38 można posłać dwa, trzy razy.

Potem jest już z górki ;-)
LCD_WriteCommand($01) to czyszczenie ekranu
LCD_WriteCommand($02) to powrót kursora na początek

a wysłanie tekstu:

procedure LCD_StringSend(S: String);
var
i: Byte;
begin
for i := 1 to Length(S) do LCD_WriteData(Ord(S[i]));
end;

Wiem, że to banalne, ale trzeba trochę poszukać. Pozostałe komendy sterujące są w pdf HD44780 (np tu: http://www.radio.kielce.com.pl/jh/soft/hd44780.pdf - 316kB. Mam nadzieję, że komuś się to przyda ;-)

Jacek

0

P.P.P. .. nie odpowiadaj na stare posty... - ten jest sprzed dwóch miesięcy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1