跪求一基于VHDL语言写的LCD12864显示程序,是用FPGA的1C6芯片,邮箱tvbqw@126.com,希望有好心人帮忙,急需

跪求一用基于VHDL语言或者VERILOG写的LCD12864.ST7920显示图形的程序,不要只是显示中文字的,最好能显示动画的,我会再加分。邮箱tvbqw@126.c... 跪求一用基于VHDL语言或者VERILOG写的LCD12864.ST7920显示图形的程序,不要只是显示中文字的,最好能显示动画的,我会再加分。邮箱tvbqw@126.com,希望有人帮忙下,谢谢 展开
 我来答
白毛乌鸦007
2011-03-22 · TA获得超过772个赞
知道小有建树答主
回答量:124
采纳率:0%
帮助的人:133万
展开全部
-------------12864液晶的显示-----------
----时钟:10MHZ

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity lcd12864 is
generic(
divide_500k:integer:=20;--20分频后:500KHZ:2us
cnt1_value:integer:=50
);
port(
clk,reset:in std_logic;
rs,rw,en:out std_logic;
data:out std_logic_vector(7 downto 0)
);
end entity;

architecture behavior of lcd12864 is
type word is array(0 to 3) of std_logic_vector(7 downto 0);--因为大家的习惯,数组中的左起第1个数为数组中的最低位对应的数,所以设置为array(0 to 3),而不是array(3 downto 0)。此处若不注意,容易出错。

type state is(
set_dlnf1,set_dlnf2,set_cursor,set_dcb,set_shift,
set_ddram,
write_name,
over
);

constant name:word:=("11010110","11010000","10111001","11111010");--中D6D0 国B9FA
--constant name:word:=("11010000","11101100","10111110","10101001");--徐D6D0 京B9FA
signal pr_state:state;
signal newclk:std_logic;
begin

process(clk) is
variable num:integer range 0 to divide_500k;
begin
if(clk'event and clk='1')then
num:=num+1;
if(num=divide_500k) then
num:=0;
end if;
if(num<divide_500k/2) then--设置占空比
newclk<='0';
else newclk<='1';
end if;
end if;
end process;

process(newclk,reset,pr_state) is
variable cnt1:integer range 0 to 100*cnt1_value:=0;
variable cnt2:integer range 0 to 100:=0;
begin
if(reset='0') then
pr_state<=set_dlnf1; --把状态set_dlnf1赋于pr_state
cnt1:=0;
cnt2:=0;
en<='0';
data<="ZZZZZZZZ";
elsif(newclk'event and newclk='1') then
case pr_state is
when set_dlnf1=>
cnt1:=cnt1+1;
if(cnt1<cnt1_value) then
en<='0';
rs<='0'; --命令
rw<='0'; --写
elsif(cnt1<2*cnt1_value) then
data<="00110000"; --选择8位数据基本指令集:0x30
elsif(cnt1<20*cnt1_value) then
en<='1';
elsif(cnt1=20*cnt1_value) then
en<='0';
cnt1:=0;
pr_state<=set_dlnf2;
end if;

when set_dlnf2=>
cnt1:=cnt1+1;
if(cnt1<cnt1_value) then
en<='0';
elsif(cnt1<2*cnt1_value) then
data<="00110000"; --选择8位数据基本指令集:0x30
elsif(cnt1<20*cnt1_value) then
en<='1';
elsif(cnt1=20*cnt1_value) then
en<='0';
cnt1:=0;
pr_state<=set_cursor;
end if;
when set_cursor=>
cnt1:=cnt1+1;
if(cnt1<cnt1_value) then
en<='0';
elsif(cnt1<2*cnt1_value) then
data<="00001100"; --整体显示设置:光标OFF 反光0FF:0x0c
elsif(cnt1<20*cnt1_value) then
en<='1';
elsif(cnt1=20*cnt1_value) then
en<='0';
cnt1:=0;
pr_state<=set_dcb;
end if;
when set_dcb=>
cnt1:=cnt1+1;
if(cnt1<cnt1_value) then
en<='0';
elsif(cnt1<2*cnt1_value) then
data<="00000001"; --清除显示,并且认定地址指针为00h:0x01
elsif(cnt1<20*cnt1_value) then
en<='1';
elsif(cnt1=20*cnt1_value) then
en<='0';
cnt1:=0;
pr_state<=set_shift;
end if;
when set_shift=>
cnt1:=cnt1+1;
if(cnt1<cnt1_value) then
en<='0';
elsif(cnt1<2*cnt1_value) then
data<="00000110"; --指定游标的移动方向及指定显示的移位:0x06
elsif(cnt1<20*cnt1_value) then
en<='1';
elsif(cnt1=20*cnt1_value) then
en<='0';
cnt1:=0;
pr_state<=set_ddram;
end if;
when set_ddram=>
cnt1:=cnt1+1;
if(cnt1<cnt1_value) then
en<='0';
elsif(cnt1<2*cnt1_value) then
data<="10000011"; --从第一行的第一个字开始显示:0x80
--从第一行的第四个字开始显示:0x80+3
elsif(cnt1<20*cnt1_value) then
en<='1';
elsif(cnt1=20*cnt1_value) then
en<='0';
cnt1:=0;
pr_state<=write_name;
end if;
when write_name=>
cnt1:=cnt1+1;
if cnt1<1*cnt1_value then
en<='0';
rs<='1'; ------------选择数据
rw<='0';
elsif cnt1<2*cnt1_value then
data<=name(cnt2); ------------送数据
elsif cnt1<20*cnt1_value then
en<='1'; -----在上升沿时,数据才能写入液晶,所以要先送数据,再让使能端变高
elsif cnt1=20*cnt1_value then
en<='0'; -----通过液晶的时序图知:使能端先低,送数据,使能端升高,再变低。
cnt1:=0;
cnt2:=cnt2+1;
if cnt2=4 then----倘若使能端的触发方式错误,此处也许要大于4的数才有显示
pr_state<=over;
cnt2:=0;
end if;
end if;
when over=>
null;
when others=>
en<='Z';
rs<='Z';
rw<='Z';
data<=(others=>'Z');
cnt1:=0;
cnt2:=0;
end case;
end if;
end process;
end architecture;

这个液晶程序,花了十来天的时间,今天总算与它有了了结。程序中,之所以只在第一行的第四列起,显示了“中国”两个字,主要是简单,便于网友理解。
追问
谢谢你了,我在某个博文中看过这个程序,能过编译,但是下载不了开发板显示,有更好的程序么?
追答
这个程序我试过,管用的,第二篇也是管用的
是不是你的时钟频率不一样呢?
chuyantao
2011-03-21 · 超过13用户采纳过TA的回答
知道答主
回答量:47
采纳率:0%
帮助的人:0
展开全部
verilog写的行不行?用的哪个芯片无所谓,改一下设置和管脚就可以了
追问
芯片是无所谓,VERILOG的我也有一个倒程,能在开发板上显示,但我自己写的VHDL就是写不好,下载到开发板上显示不了,求一VHDL的,谢谢你了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jj好好爱着77
2012-12-24
知道答主
回答量:25
采纳率:0%
帮助的人:3.8万
展开全部
你好,你有显示图形的程序吗、我需要。635555265@qq.com
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式