集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 4390|回复: 4

Xilinx Spartan 3E Starter Kit平台控制1602液晶程序

[复制链接]
老怪甲 该用户已被删除
老怪甲 发表于 2010-5-19 14:05:03 | 显示全部楼层 |阅读模式
本帖最后由 fpgaw 于 2011-1-14 09:37 编辑

Xilinx Spartan 3E Starter Kit平台控制1602液晶程序

PS:Xilinx Spartan 3E Starter Kit平台上LCD1602与板载Intel Flash Memory公用四根数据线,读写命令和数据时分别写高四位和低四位,具体请查阅数据手册

源码:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity LCD1602 is
Port (
        CLK : in std_logic;
       Reset : in std_logic;  
     LCD_RS : out std_logic;
     LCD_RW : out std_logic;
     LCD_EN : out std_logic;
        data : out std_logic_vector(3 downto 0));
end LCD1602;
architecture Behavioral of LCD1602 is
type iState is (
             Write_instr,   --写命令字
         Write_DataUP4_1,   --写LCD一线高4位
       Write_DataDown4_1,   --写LCD一线低4位
        Set_DDRamAddUp,   --设置DDRam地址高4位  
      Set_DDRamAddDown,   --设置DDRam地址低4位
        Write_DataUP4_2,    --写LCD二线高4位
       Write_DataDown4_2    --写LCD二线低4位
    );
  
signal State:iState;
type Ram is array(0 to 15) of std_logic_vector(7 downto 0);
constant  MyRamUp:Ram:=(x"46",x"68",x"69",x"73",x"20",x"49",x"73",x"20",x"4d",x"79",x"20",x"46",x"69",x"72",x"73",x"74");
              --This Is My First
constant MyRamDown:Ram:=(x"20",x"20",x"46",x"50",x"47",x"41",x"20",x"50",x"72",x"6f",x"67",x"72",x"61",x"6d",x"20",x"20");
              --FPGA Program
signal LCD_Clk : std_logic :='0';
signal datacnt : integer range 0 to 15:=0;
begin
LCD_RW <= &#39;0&#39;;
LCD_EN <= LCD_Clk;
process(CLK)                     --20000分频,满足时序要求
variable n1:integer range 0 to 19999;
begin
if rising_edge(CLK) then
  if n1<19999 then
    n1:=n1+1;
  else
    n1:=0;
    LCD_Clk<=not LCD_Clk;
  end if;
end if;
end process;
process(LCD_Clk,state,reset)
begin
if Reset=&#39;0&#39; then
   state<=Write_instr;
   LCD_RS <= &#39;0&#39;;
elsif rising_edge(LCD_Clk) then
   case state is

  when Write_instr=>       --写命令字到LCD控制器
   LCD_RS<=&#39;0&#39;;            
   if(datacnt=0)then
    data<="0011";        --0011
    datacnt<=datacnt+1;
   elsif(datacnt=1)then
    data<="0011";        --0011
    datacnt<=datacnt+1;
   elsif(datacnt=2)then
    data<="0011";        --0011
    datacnt<=datacnt+1;
   elsif(datacnt=3)then
    data<="0010";        --0010
    datacnt<=datacnt+1;
   elsif(datacnt=4)then      --0x28 :  0010 1000 =>功能设置
    data<="0010";
    datacnt<=datacnt+1;
   elsif(datacnt=5)then
    data<="1000";
    datacnt<=datacnt+1;
   elsif(datacnt=6)then      --0x06 :  0000 0110 =>模式设定
    data<="0000";
    datacnt<=datacnt+1;
   elsif(datacnt=7)then
    data<="0110";
    datacnt<=datacnt+1;
   elsif(datacnt=8)then     --0x0c :  0000 1100 =>显示设定
    data<="0000";
    datacnt<=datacnt+1;
   elsif(datacnt=9)then
    data<="1100";
    datacnt<=datacnt+1;  
   elsif(datacnt=10)then    --0x10 : 1000 0000 =>00H 设定读写地址位
    data<="1000";
    datacnt<=datacnt+1;
   else
    data<="0000";
    datacnt<=0;
   state<=Write_DataUP4_1;
   end if;

  when Write_DataUP4_1=>
   LCD_RS<=&#39;1&#39;;   
   data <= MyRamUp(datacnt)(7 downto 4);
   state <= Write_DataDown4_1;
   
  when Write_DataDown4_1=>
   if datacnt=15 then
    data <= MyRamUp(datacnt)(3 downto 0);
    datacnt<=0;
    state <=Set_DDRamAddUp;
   else
    data <= MyRamUp(datacnt)(3 downto 0);
    datacnt<=datacnt+1;
    state <=Write_DataUP4_1;
   end if;
   
  when Set_DDRamAddUp=> --0xc0 : 1100 0000=>40H 设定读写地址位
    LCD_RS<=&#39;0&#39;;
    data<="1100";
    state<=Set_DDRamAddDown;
   
  when Set_DDRamAddDown=>
    data<="0000";
    state<=Write_DataUP4_2;
   
  when Write_DataUP4_2=>
    LCD_RS<=&#39;1&#39;;   
    data <= MyRamDown(datacnt)(7 downto 4);
    state <= Write_DataDown4_2;
   
  when Write_DataDown4_2=>
    if datacnt=15 then
     data <= MyRamDown(datacnt)(3 downto 0);
     datacnt<=0;
     state <=Write_DataUP4_1;
    else
     data <= MyRamDown(datacnt)(3 downto 0);
     datacnt<=datacnt+1;
     state <=Write_DataUP4_2;
    end if;
   
  when others=>
    state<=Write_instr;
   
  end case;
  end if;
end process;
end Behavioral;
管脚约束:

NET "clk" LOC = "C9" | IOSTANDARD = LVTTL;

NET "LCD_RS"  LOC = "L18" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 2;
NET "LCD_RW"  LOC = "L17" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 2;
NET "LCD_EN"  LOC = "M18" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 2;
NET "data<0>" LOC = "R15" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 2;
NET "data<1>" LOC = "R16" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 2;
NET "data<2>" LOC = "17" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 2;
NET "data<3>" LOC = "M15" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 2;

NET "Reset" LOC = "L13" | IOSTANDARD = LVTTL | PULLUP ;
Xilinx Spartan 3E Starter Kit平台数据手册

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
g280045620 发表于 2010-6-22 20:47:23 | 显示全部楼层
signal LCD_Clk : std_logic :=&#39;0&#39;;
版主!这句中的&#39是什么意思啊!没见过了!能解释一下吗?
pengwr 发表于 2011-5-28 11:28:58 | 显示全部楼层
这个编译会报错,我是把&#39;0&#39改成常数0或1
haoge 发表于 2011-8-9 09:49:14 | 显示全部楼层
谢谢楼主分享!!!!!
fpga_feixiang 发表于 2022-1-14 14:18:52 | 显示全部楼层
6666666666666666
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|集成电路技术分享 ( 京ICP备20003123号-1 )

GMT+8, 2024-6-18 05:58 , Processed in 0.077715 second(s), 25 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表