⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd1602.vhd

📁 有關於EP2C的一些程序(EX:I2C,FLASH,IRDA,MUSIC,LED,LIGHT,SRAM,UART,PS2,SPI )
💻 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 + -