📄 lcd1602.vhd
字号:
---------------------------------------------------------------------------------------------------
--*************************************************************************************************
-- CreateDate : 2007-08-19
-- ModifData : 2007-08-19
-- Description : LCD1602
-- Author : Explorer01
-- Version : V1.0
--*************************************************************************************************
---------------------------------------------------------------------------------------------------
-- VHDL library Declarations
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.std_logic_unsigned.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
-- The Entity Declarations
ENTITY LCD1602 IS
PORT
(
RESET : IN STD_LOGIC;
CLK : IN STD_LOGIC;
Fresh : IN STD_LOGIC;
-------------------------------------
-- OUT
LCD_RS : OUT STD_LOGIC;
LCD_RW : OUT STD_LOGIC;
LCD_E : OUT STD_LOGIC;
LCD_DATA: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
-------------------------------------
--
CHAR_ADD: OUT STD_LOGIC_VECTOR(5 DOWNTO 0);
DATA_IN : IN STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END LCD1602;
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
-- The Architecture of Entity Declarations
ARCHITECTURE Behavioral OF LCD1602 IS
------------------------------------------------
CONSTANT IDLE : STD_LOGIC_VECTOR(3 DOWNTO 0) := "0000";
CONSTANT CLEAR : STD_LOGIC_VECTOR(3 DOWNTO 0) := "0001";
CONSTANT RETURNCURSOR : STD_LOGIC_VECTOR(3 DOWNTO 0) := "0010";
CONSTANT SETMODE : STD_LOGIC_VECTOR(3 DOWNTO 0) := "0011";
CONSTANT SWITCHMODE : STD_LOGIC_VECTOR(3 DOWNTO 0) := "0100";
CONSTANT SHIFT : STD_LOGIC_VECTOR(3 DOWNTO 0) := "0101";
CONSTANT SETFUNCTION : STD_LOGIC_VECTOR(3 DOWNTO 0) := "0110";
CONSTANT SETCGRAM : STD_LOGIC_VECTOR(3 DOWNTO 0) := "0111";
CONSTANT SETDDRAM : STD_LOGIC_VECTOR(3 DOWNTO 0) := "1000";
CONSTANT READFLAG : STD_LOGIC_VECTOR(3 DOWNTO 0) := "1001";
CONSTANT WRITERAM : STD_LOGIC_VECTOR(3 DOWNTO 0) := "1010";
CONSTANT READRAM : STD_LOGIC_VECTOR(3 DOWNTO 0) := "1011";
SIGNAL State : STD_LOGIC_VECTOR(3 DOWNTO 0);
------------------------------------------------
CONSTANT cur_inc : STD_LOGIC :='1';
CONSTANT cur_dec : STD_LOGIC :='0';
CONSTANT cur_shift : STD_LOGIC :='1';
CONSTANT cur_noshift : STD_LOGIC :='0';
CONSTANT open_display : STD_LOGIC :='1';
CONSTANT open_cur : STD_LOGIC :='0';
CONSTANT blank_cur : STD_LOGIC :='0';
CONSTANT shift_display: STD_LOGIC :='1';
CONSTANT shift_cur : STD_LOGIC :='0';
CONSTANT right_shift : STD_LOGIC :='1';
CONSTANT left_shift : STD_LOGIC :='0';
CONSTANT datawidth8 : STD_LOGIC :='1';
CONSTANT datawidth4 : STD_LOGIC :='0';
CONSTANT twoline : STD_LOGIC :='1';
CONSTANT oneline : STD_LOGIC :='0';
CONSTANT font5x10 : STD_LOGIC :='1';
CONSTANT font5x7 : STD_LOGIC :='0';
------------------------------------------------
------------------------------------------------
SIGNAL ClkInt : STD_LOGIC;
SIGNAL Counter : INTEGER RANGE 0 TO 127;
SIGNAL Flag : STD_LOGIC;
SIGNAL div_counter : INTEGER RANGE 0 TO 15;
CONSTANT DIVSS : INTEGER := 15;
BEGIN
--==============================================
------------------------------------------------
-- Clock process
PROCESS( RESET, CLK, ClkInt )
BEGIN
IF ( RESET='0' ) THEN ClkInt <= '0';
ELSIF( CLK'EVENT AND CLK='1' ) THEN ClkInt <= NOT ClkInt;
END IF;
END PROCESS;
------------------------------------------------
--
PROCESS( RESET, CLK )
VARIABLE TEMP : STD_LOGIC;
BEGIN
IF ( RESET='0' ) THEN TEMP := '0';
ELSIF( CLK'EVENT AND CLK='0' ) THEN TEMP := NOT TEMP;
END IF;
LCD_E <= TEMP;
END PROCESS;
--==============================================
------------------------------------------------
--
LCD_RS <= '1' WHEN State = WRITERAM OR State = READRAM ELSE '0';
LCD_RW <= '0' WHEN State = CLEAR OR State = RETURNCURSOR OR State = SETMODE OR State = SWITCHMODE OR State = SHIFT OR State = SETFUNCTION OR State = SETCGRAM OR State = SETDDRAM OR State = WRITERAM ELSE '1';
LCD_DATA <= "00000001" WHEN State = CLEAR ELSE
"00000010" WHEN State = RETURNCURSOR ELSE
"000001"& cur_inc & cur_noshift WHEN State = SETMODE ELSE
"00001" & open_display &open_cur & blank_cur WHEN State = SWITCHMODE ELSE
"0001" & shift_cur &left_shift &"00" WHEN State = SHIFT ELSE
"001" & datawidth8 & twoline &font5x10 & "00" WHEN State = SETFUNCTION ELSE
"01000000" WHEN State = SETCGRAM ELSE
"10000000" WHEN State = SETDDRAM AND Counter = 0 ELSE
"11000000" WHEN State = SETDDRAM AND Counter /= 0 ELSE
DATA_IN WHEN State = WRITERAM ELSE
"ZZZZZZZZ";
CHAR_ADD <= CONV_STD_LOGIC_VECTOR( Counter, 6 ) WHEN State = WRITERAM AND Counter < 32 ELSE
--
"000000";
------------------------------------------------
--
PROCESS( RESET, ClkInt, Fresh )
BEGIN
IF( RESET='0' ) THEN
State <= IDLE;
Counter <= 0;
Flag <= '0';
ELSIF( ClkInt'EVENT AND ClkInt='1' ) THEN
CASE State IS
-----------------------------------
WHEN IDLE =>
IF( Flag='0' ) THEN
State <= SETFUNCTION;
Flag <= '1';
Counter <= 0;
div_counter<=0;
ELSE
IF( Fresh='1' ) THEN Flag <= '0';
ELSE
IF( div_counter<DIVSS ) THEN
div_counter <= div_counter + 1;
State <= IDLE;
ELSE
div_counter <= 0;
State <= SHIFT;
-- Flag <= '0';
END IF;
END IF;
END IF;
-----------------------------------
WHEN CLEAR => State <= SETMODE;
WHEN SETMODE => State <= WRITERAM;
WHEN RETURNCURSOR => State <= WRITERAM;
WHEN SWITCHMODE => State <= CLEAR;
WHEN SHIFT => State <= IDLE;
WHEN SETFUNCTION => State <= SWITCHMODE;
WHEN SETCGRAM => State <= IDLE;
WHEN SETDDRAM => State <= WRITERAM;
WHEN READFLAG => State <= IDLE;
-----------------------------------
WHEN WRITERAM =>
IF( Counter=15 ) THEN
State <= SETDDRAM;
Counter <= Counter + 1;
ELSIF( Counter/=15 AND Counter<32 ) THEN
State <= WRITERAM;
Counter <= Counter + 1;
ELSE
State <= SHIFT;
Counter <= 0;
END IF;
-----------------------------------
WHEN READRAM => State <= IDLE;
WHEN OTHERS => State <= IDLE;
END CASE;
END IF;
END PROCESS;
-------------------------------------------------
-------------------------------------------------
END Behavioral;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -