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. ??
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...
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; |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.