📄 step_motor_degree_forward_reverse_lcd.vhd
字号:
--**********************************************************
--* Stepping Motor Degree Display In LCD (FORWARD,REVERSE) *
--* Filename : STEP_MOTOR_DEGREE_FORWARD_REVERSE_LCD.VHD *
--**********************************************************
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use work.STEP_MOTOR_DEGREE_FORWARD_REVERSE_LCD_PACK.all;
entity STEP_MOTOR_DEGREE_FORWARD_REVERSE_LCD is
Port ( CLK : in std_logic;
RESET : in std_logic;
DIRECTION : in std_logic;
LCM_RW : out std_logic;
LCM_EN : out std_logic;
LCM_RS : out std_logic;
TRIGGER : out std_logic_vector(3 downto 0);
LCM_DATA : out std_logic_vector(7 downto 0));
end STEP_MOTOR_DEGREE_FORWARD_REVERSE_LCD;
architecture Behavioral of STEP_MOTOR_DEGREE_FORWARD_REVERSE_LCD is
signal INIT_CLK : std_logic;
signal SHIFT_CLK : std_logic;
signal LCM_COUNT : std_logic_vector(5 downto 0);
signal PATTERN : std_logic_vector(3 downto 0);
signal DEGREE : std_logic_vector(15 downto 0);
signal SUM_BCD : std_logic_vector(15 downto 0);
signal DIVIDER : std_logic_vector(25 downto 1);
--*************************
--* Time Base Generator *
--*************************
begin
process (CLK,RESET)
begin
if RESET = '0' then
DIVIDER <= "0000000000000000000000000";
elsif CLK'event and CLK = '1' then
DIVIDER <= DIVIDER + 1;
end if;
end process;
INIT_CLK <= DIVIDER(15);
SHIFT_CLK <= DIVIDER(25);
LCM_EN <= INIT_CLK ;
--***************************************
--* LCD Display And Direction Control *
--***************************************
process (RESET,INIT_CLK)
begin
if RESET = '0' then
LCM_COUNT <= "000000";
LCM_RS <= '0';
LCM_RW <= '0';
LCM_DATA <= "00000001";
elsif INIT_CLK'event and INIT_CLK = '1' then
if LCM_COUNT < "100110" then
LCM_COUNT <= LCM_COUNT + 1;
else
LCM_COUNT <= "010110";
end if;
case LCM_COUNT is
when "000000" =>
LCM_RS <= '0';
LCM_RW <= '0';
LCM_DATA <= "00111100"; -- 8 BIT, 2 Lines, 5 * 7 Dot
when "000001" =>
LCM_DATA <= "00111100"; -- 8 BIT, 2 Lines, 5 * 7 Dot
when "000010" =>
LCM_DATA <= "00000001"; -- Clear LCD Display
when "000011" =>
LCM_DATA <= "00000110"; -- Cursor Shift Right, AC + 1
when "000100" =>
LCM_DATA <= "00001100"; -- Display on, Cursor off
when "000101" =>
LCM_RS <= '0'; -- Set Cursor
LCM_DATA <= "10000000";
when "000110" =>
LCM_RS <= '1';
LCM_DATA <= "01010011"; -- S
when "000111" =>
LCM_DATA <= "01110100"; -- t
when "001000" =>
LCM_DATA <= "01100101"; -- e
when "001001" =>
LCM_DATA <= "01110000"; -- p
when "001010" =>
LCM_DATA <= "01110000"; -- p
when "001011" =>
LCM_DATA <= "01101001"; -- i
when "001100" =>
LCM_DATA <= "01101110"; -- n
when "001101" =>
LCM_DATA <= "01100111"; -- g
when "001110" =>
LCM_DATA <= "00100000"; --
when "001111" =>
LCM_DATA <= "01001101"; -- M
when "010000" =>
LCM_DATA <= "01101111"; -- o
when "010001" =>
LCM_DATA <= "01110100"; -- t
when "010010" =>
LCM_DATA <= "01101111"; -- o
when "010011" =>
LCM_DATA <= "01110010"; -- r
when "010100" =>
LCM_DATA <= "00100000"; --
when "010101" =>
LCM_DATA <= "00111010"; -- :
when "010110" =>
LCM_RS <= '0';
LCM_DATA <= "11000000"; -- Set Cursor
when "010111" =>
LCM_RS <= '1';
LCM_DATA <= "00100000"; --
when "011000" =>
LCM_DATA <= "01000100"; -- D
when "011001" =>
LCM_DATA <= "01100101"; -- e
when "011010" =>
LCM_DATA <= "01100111"; -- g
when "011011" =>
LCM_DATA <= "01110010"; -- r
when "011100" =>
LCM_DATA <= "01100101"; -- e
when "011101" =>
LCM_DATA <= "01100101"; -- e
when "011110" =>
LCM_DATA <= "00100000"; --
when "011111" =>
LCM_DATA <= "00111010"; -- :
when "100000" =>
LCM_DATA <= "00100000"; --
when "100001" =>
LCM_DATA <= "00100000"; --
when "100010" =>
LCM_DATA <= "0011" & DEGREE(15 downto 12);
when "100011" =>
LCM_DATA <= "0011" & DEGREE(11 downto 8);
when "100100" =>
LCM_DATA <= "0011" & DEGREE(7 downto 4);
when "100101" =>
LCM_DATA <= "00101110"; -- .
when others =>
LCM_DATA <= "0011" & DEGREE(3 downto 0);
end case;
end if;
end process;
--***********************************
--* Stepping Mortor Control *
--***********************************
process (SHIFT_CLK,RESET)
begin
if RESET = '0' then
PATTERN <= "1000";
DEGREE <= "0000000000000000";
elsif SHIFT_CLK'event and SHIFT_CLK = '1' then
if DIRECTION = '0' then
PATTERN <= PATTERN(0) & PATTERN(3 downto 1);
if DEGREE = "0011010110000010" then
DEGREE <= "0000000000000000";
else
DEGREE <= SUM_BCD;
end if;
else
PATTERN <= PATTERN(2 downto 0) & PATTERN(3);
if DEGREE = "0000000000000000" then
DEGREE <= "0011010110000010";
else
DEGREE <= SUM_BCD;
end if;
end if;
end if;
end process;
TRIGGER <= PATTERN;
--*****************************
--* Calculation Degree *
--*****************************
ADD_SUB : BCD_ADD_SUB_4DIG port map (DIRECTION,DEGREE,"0000000000011000",SUM_BCD);
end Behavioral;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -