Forum: FPGA, VHDL & Co. LC Display Initialisierung (VHDL)


von Klmn O. (destroyer)


Lesenswert?

Hallo erstmal,

ich muss eine "bibliothek" in vhdl schreiben, womit man LC Display 
ansteuern kann.

Mein LCD hat einen KS0070B controller.

Bei der Initialisierung muss man paar mal hintereinander bestimmte 
bitfolgen senden und zwischen durch warten....

das problem ist, dass ich keine ahnung habe wie ich die verzögerungen 
realisieren soll.... (hab mit addierer versucht, jedoch war das nicht so 
toll).

Irgendwie muss ich versuchen den ablauf so zu steuern, dass alles 
sequentiell abgearbeitet wird, mit verzögerungen.

hat jemand idee wie man sowas machen könnt. ??

von Jens B. (sio2)


Lesenswert?

picoblaze nutzen ;)

Verzögerung=> zaehler

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Klmn Oprst schrieb:
> Hallo erstmal,
Tach auch...

> hat jemand idee wie man sowas machen könnt. ??
Die Stichworte, die du brauchst heißen State-Machine (Zustandsautomat) 
und Counter (Zähler). Sieh dich hier im VHDL-Forum mal um, da war vor 
etwa 2 Monaten mal ein Code für ein LCD da...

von Klmn O. (destroyer)


Lesenswert?

Danke... nach dem ich das thema eröffnet habe , hatte ich auch die 
idee...

Kann man das irgendwie optimieren ?
1
--Die feste zeiten hier beziehen sich auf CPLD quarz oszi
2
LIBRARY ieee ;
3
USE ieee.std_logic_1164.all;
4
use IEEE.STD_LOGIC_ARITH.ALL;
5
use IEEE.STD_LOGIC_UNSIGNED.ALL;
6
7
ENTITY test IS
8
  PORT(
9
    clk, reset :  in std_logic;
10
    init_fertig : out std_logic;
11
    init_out : out std_logic_vector(9 downto 0));
12
END test;
13
14
ARCHITECTURE struct of test is
15
16
--der flag wird auf 1 gesetzt wenn die zeit verstrichen wurde
17
signal delay_flag : std_logic;
18
--hier wird je nach anforderung die benötigte zeit vorgegeben
19
signal delay_time : std_logic_vector(10 downto 0):="00000000000";
20
--für delay...
21
signal count : std_logic_vector(10 downto 0):=(others=>'0');
22
23
--braucht man nicht unbedingt, ist für ausgang an LCD
24
signal sig_init_out : std_logic_vector(9 downto 0):="0000110000";
25
26
signal init_suc : std_logic:='0';
27
28
BEGIN
29
  init_out <= sig_init_out;
30
  init_fertig <= init_suc;
31
  
32
  process (clk,reset, init_suc)
33
  begin
34
    if (reset='0') then
35
      count <= (others=>'0');
36
    else
37
      if (clk'event and clk='1' and init_suc='0') then
38
          if (count = delay_time) then
39
            count <= (others=>'0');
40
            delay_flag <= '1';
41
          else
42
            count <= unsigned(count) + 1;
43
            delay_flag <= '0';
44
          end if;
45
      end if;
46
    end if;
47
  end process;
48
49
  process (delay_flag, reset)
50
    variable delay_nr : std_logic_vector(3 downto 0):=(others=>'0');
51
  begin
52
    if (reset='0') then
53
      init_suc <= '0';
54
      delay_nr := (others=>'0');
55
      sig_init_out <= "0000110000";
56
      delay_time <= "00000000000";
57
    else
58
      if (delay_flag = '1') then
59
        case delay_nr is
60
          when "0000" =>   sig_init_out <= "0000110000";
61
                  delay_time <= "10000000001"; --4.1ms
62
          when "0001" =>   sig_init_out <= "0000110000";
63
                  delay_time <= "00000011001"; --100us
64
          when "0010" =>   sig_init_out <= "0000110000";
65
                  delay_time <= "00000011001"; --100us hier muss man nicht warten, sicherheit
66
          when "0011" =>   sig_init_out <= "0000111000";-- 8bit 2 liens, 5x7 per dot
67
                  delay_time <= "00000001010"; --42us
68
          when "0100" =>   sig_init_out <= "0000001000";-- display off
69
                  delay_time <= "00000001010"; --42us
70
          when "0101" =>   sig_init_out <= "0000001000";-- display clear
71
                  delay_time <= "00110011010"; --1.64ms
72
          when "0110" =>   sig_init_out <= "0000000110";-- entry mode set, increase, display not shifted
73
                  delay_time <= "00000001010"; --42us
74
          --hier init fertig, aber ich schalte mal display an :-)
75
          when "0111" =>   sig_init_out <= "0000001111";-- display on, curser on, blink on
76
                  delay_time <= "00000001010"; --42us  
77
          when "1000" =>  init_suc <= '1';  
78
          when others => null;
79
        end case;
80
        delay_nr := unsigned(delay_nr)+1;
81
      end if;
82
    end if;
83
  end process;
84
  
85
end struct;

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Beitrag "[VHDL] 16x2 LCD Textcontroller / HD44780"
Sicherlich an der ein oder anderen Stelle Optimierungsbedürftig, dafür 
einfach anzupassen für verschiedene Display Typen...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.