Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Inicjalizacja LCD

Moderatorzy: Jacek Bogusz, Moderatorzy

Zordan
-
-
Posty: 1
Rejestracja: 20 wrz 2015, o 20:26

Inicjalizacja LCD

Postautor: Zordan » 20 wrz 2015, o 21:46

Witam,
korzystając z internetu oraz wzorując się na innych kodach chciałem napisać inicjalizację LCD, ale jednak coś nie działa prawidłowo jak mniemam.
W pisaniu posłużyłem się instrukcją dla 4-bitowego wyświetlacza.

Kod: Zaznacz cały

library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use IEEE.std_logic_unsigned.all; entity top is port( clk : in std_logic; rst : in std_logic; lcdBus : in std_logic_vector (5 downto 0); lcdOut : out std_logic_vector (3 downto 0); lcdE : in std_logic; -- ENABLE BF : out std_logic; -- Busy Flag e : out std_logic; rw : out std_logic; rs : out std_logic); end top; architecture Behavioral of top is TYPE Stan is (Start, Init, Ready); SIGNAL Stage : Stan; --SIGNAL clkCNT : integer := 0; SIGNAL clk_50Mhz : integer := 50; SIGNAL DOUT : std_logic_vector (5 downto 0); BEGIN process (clk) VARIABLE clkCNT : INTEGER := 0; BEGIN if (rising_edge(clk)) then case Stage is when Start => BF <= '1'; if (clkCNT < (90000 * clk_50Mhz)) then -- 90 ms (more than 45ms) + 4.1ms clkCNT := clkCNT + 1; Stage <= Start; else clkCNT := 0; rs <= '0'; rw <= '0'; lcdOut <= "0011"; -- Init, disp. off Stage <= Init; end if; when Init => BF <= '1'; clkCNT := clkCNT + 1; if (clkCNT < (20 * clk_50Mhz)) then -- 20 us rs <= '0'; rw <= '0'; lcdOut <= "0010"; -- func set e <= '1'; Stage <= Init; elsif (clkCNT < (80 * clk_50Mhz)) then -- > 53us rs <= '0'; rw <= '0'; lcdOut <= "0000"; e <= '0'; Stage <= Init; elsif (clkCNT < (90 * clk_50Mhz)) then -- 10us rs <= '0'; rw <= '0'; lcdOut <= "1000"; -- disp on/off (on and cursor) e <= '1'; Stage <= Init; elsif (clkCNT < ( 140 * clk_50Mhz)) then -- > 53us rs <= '0'; rw <= '0'; lcdOut <= "0000"; e <= '0'; Stage <= Init; elsif (clkCNT < ( 150 * clk_50Mhz)) then -- 10us rs <= '0'; rw <= '0'; lcdOut <= "0001"; -- disp. clear e <= '1'; Stage <= Init; elsif (clkCNT < ( 3200 * clk_50Mhz)) then -- > 3ms rs <= '0'; rw <= '0'; lcdOut <= "0000"; e <= '0'; Stage <= Init; elsif (clkCNT < ( 3210 * clk_50Mhz)) then -- > 10us rs <= '0'; rw <= '0'; lcdOut <= "0110"; -- entry mode e <= '1'; Stage <= Init; elsif (clkCNT < ( 3270 * clk_50Mhz)) then -- > 53us rs <= '0'; rw <= '0'; lcdOut <= "0000"; -- init end e <= '0'; Stage <= Init; elsif (clkCNT < ( 3300 * clk_50Mhz)) then -- > 30us rs <= '0'; rw <= '0'; lcdOut <= "1100"; -- disp. control e <= '0'; Stage <= Init; else BF <= '0'; clkCNT := 0; Stage <= Ready; end if; when Ready => if(lcdE = '1') then BF <= '1'; rs <= lcdBus(5); rw <= lcdBus(4); lcdOut <= lcdBus(3 downto 0); clkCnt := 0; --Stage <= SetAdd; else BF <= '0'; rs <= '0'; rw <= '0'; lcdOut <= "0000"; clkCnt := 0; Stage <= Ready; end if; end case; if (rst = '1') then -- reset lcd lcdOut <= "0000"; Stage <= Start; end if; end if; end process; end Behavioral;
Mógłby ktoś napisać co robię źle?

Wróć do „PLD/FPGA i inne zagadnienia techniki cyfrowej”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 3 gości