FPGA课程设计报告---基于CPLD的1602字符液晶显示系统设计.doc_第1页
FPGA课程设计报告---基于CPLD的1602字符液晶显示系统设计.doc_第2页
FPGA课程设计报告---基于CPLD的1602字符液晶显示系统设计.doc_第3页
FPGA课程设计报告---基于CPLD的1602字符液晶显示系统设计.doc_第4页
FPGA课程设计报告---基于CPLD的1602字符液晶显示系统设计.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

fpga课程设计报告 题 目:基于cpld的1602字符液晶显示系统设计 院 系: 信息与电气工程学院 班 级: 电子信息工程 学 号: 学生姓名: 指导教师: 成 绩: 2011年7月 基于cpld的1602字符液晶显示系统设计1. 设计题目: 基于cpld的1602字符液晶显示系统设计2 设计要求技术指标: 要求用1602液晶显示字符; 显示内容:学号+英文姓名; 显示方式:流动显示,开关控制字符流动速度及方向;具有暂停和清 屏的功能;3 设计平台: quartusii 6.0软件 mars-1270 cpld 1602液晶4 设计思路与设计步骤: 1.1602液晶指令介绍: 要想控制1602液晶显示字符,首先需要弄清楚1602有那些可控管脚, 有哪些控制命令,如何控制其显示,如何控制其移动及如何控制其移动速度及方向等,下面首先介绍一下我所要用的指令及管脚等。 (1)接口说明:(2)基本操作时序:a.读状态:输入:rs=l,rw=h,e=h, 输出:db0-db7=状态字b.写指令:输入:rs=l,rw=l,e=下降沿脉冲,dbo-db7=指令码, 输出:无c.读数据:输入:rs=h,rw=h,e=h,输出:db0-db7=数据d.写数据:输入:rs=h,rw=l,e=下降沿脉冲,dbo-db7=数据, 输出:无 (3)指令集及其设置说明:a. 清屏指令: 功能: 清除液晶显示器即将ddram 的内容全部填入空白的ascii码20h; 光标归位,即将光标撤回液晶显示屏的左上方; 将地址计数器(ac)的值设为0。b. 进入设置模式指令: 功能:设定每次定入1位数据后光标的移位方向,并且设定每次写入的一个 字符是否移动。参数设定的情况如下所示: 位名设置 i/d 0=写入新数据后光标左移 1=写入新数据后光标右移 s 0=写入新数据后显示屏不移 1=写入新数据后显示屏整体右移1字符c. 显示开关控制指令: 功能:控制显示器开/关、光标显示/关闭以及光标是否闪烁。参数设定的情 况如下: 位名设置 d 0=显示功能关 1=显示功能开 c 0=无光标 1=有光标 b 0=光标闪烁 1=光标不闪烁d. 设定显示屏或光标移动方向指令: 功能:使光标移位或使整个显示屏幕移位。参数设定的情况如下: s/c r/l 设定情况 0 0 光标左移1格,且ac值减1 0 1 光标右移1格,且ac值加1 1 0 显示器上字符全部左移一格,但光标不动 1 1 显示器上字符全部右移一格,但光标不动e. 功能设定指令: 功能:设定数据总线位数、显示的行数及字型。参数设定的情况如下: 位名设置 dl 0=数据总线为4位 1=数据总线为8位 n 0=显示1行 1=显示2行 f 0=57点阵/每字符 1=510点阵/每字符f. 设定cgram地址指令: 功能:设定下一个要存入数据的cgram的地址。 db5db4db3 为字符号,也就是你将来要显示该字符时要用到的字符 地址。(000111)(能定义八个字符) db2db1db0为行号。(000111)(八行)g. 设定ddram地址指令;功能:设定下一个要存入数据的ddram的地址。h. 数据写入ddram或cgram指令: 功能: 将字符码写入ddram,以使液晶显示屏显示出相对应的字符; 将使用者自己设计的图形存入cgram。 db7db6db5可为任何数据,一般取“000”。 db4db3db2db1db0对应于每行5点的字模数据。2. 设计流程: 弄懂1602中各种管脚及其控制方法以及各种指令的指令码后,就可以进 行程序的编写了,首先整理一下编写流程: 初始化 设置状态 状态转换 3.设计源程序: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity lcd_1602 is port ( clk : in std_logic; reset:in std_logic; lcdrs : out std_logic;-读或写指令|数据控制端 lcdrw : out std_logic;-读|写控制端 lcden : buffer std_logic; -使能端 data : out std_logic_vector(7 downto 0); key1: in std_logic; -拨码开关控制移动与不动; key2: in std_logic); end lcd_1602; architecture behavioral of lcd_1602 is type state is(set_qingping,set_nobusy,set_cursor,set_switch,set_ddram,write_data,set_ddram1,write_data1,set_ddram2,write_data2,set_ddram3,write_data3,set_ddram4,write_data4,set_ddram5,write_data5, set_ddram6,write_data6, set_ddram7,write_data7,set_ddram8,write_data8,set_ddram9,write_data9, set_ddram10,write_data10,set_ddram11,write_data11,set_ddram12,write_data12,set_ddram13,write_data13,set_ddram14,write_data14,set_ddram15,write_data15,set_ddram17,write_data17,set_ddram16,write_data16,set_ddram18, write_data18,set_ddram19,write_data19,set_ddram20,write_data20, set_ddram21,write_data21,set_ddram22,write_data22,set_ddram23,write_data23,set_cgram,write_cgram,set_ddram24,write_data24,set_ddram25,write_data25,shift_cur,shift_display); -定义各种状态type ram2 is array(0 to 7) of std_logic_vector(7 downto 0);constant cgram:ram2:=(00011111),(00000100),(00000100), (00011111),(00000100),(00000100),(00000100),(00011111); -把“王”字字模写入数组;signal current_state:state;signal clkcnt: std_logic_vector(18 downto 0);constant divcnt:std_logic_vector(18 downto 0):=1111001110001000000;signal clkdiv: std_logic;signal tc_clkcnt: std_logic; signal clk_int: std_logic;signal clkdiv2: std_logic;signal clkdiv3: std_logic;signal clkdiv6: std_logic; begin lcdrw = 0 ; -读写控制端设为写有效 process(clk,reset) begin if(reset=0)then clkcnt=0000000000000000000; elsif(clkevent and clk=1)then if(clkcnt=divcnt)then clkcnt=0000000000000000000; elseclkcnt=clkcnt+1; -对系统时钟进行分频使其工作周期为12.5ms end if; end if;end process;tc_clkcnt=1 when clkcnt=divcnt else 0; -tc_clkcnt为12.5msprocess(tc_clkcnt,reset)begin if(reset=0)thenclkdiv=0; elsif(tc_clkcntevent and tc_clkcnt=1)thenclkdiv=not clkdiv; -进一步分频使clkdiv=2*12.5ms; end if;end process;process(clkdiv,reset)begin if(reset=0)thenclk_int=0; elsif(clkdivevent and clkdiv=1)thenclk_int= not clk_int; -再进一步分频使clk_int=4*12.5ms end if;end process;process(clk_int,reset)begin if(reset=0)thenclkdiv2=0; -再进一步分频使clkdiv2=8*12.5ms elsif(clk_intevent and clk_int=1)thenclkdiv2= not clkdiv2; end if;end process;process(clkdiv2,reset) begin if(reset=0)thenclkdiv3=0; -再进一步分频使clkdiv3=16*12.5ms elsif(clkdiv2event and clkdiv2=1)then clkdiv3= not clkdiv3; end if;end process;process(clkdiv3,reset)begin if(reset=0)thenclkdiv6=0; -还是进一步分频使clkdiv6=32*12.5ms elsif(clkdiv3event and clkdiv3=1)thenclkdiv6= not clkdiv6; end if;end process;process(clkdiv3,reset)begin if(reset=0)thenlcden=0; elsif(clkdiv3event and clkdiv3=0)thenlcden= not lcden; -设置使能信号频率 end if;end process; 附注:进行多次分频的目地是为了使字符显示速度及移动速度等合适,便于观察。control:process(clk,reset,current_state)variable cnt1: std_logic_vector(3 downto 0); -控制各种状态及其转换 beginif reset=0thencurrent_state 1);lcdrs=0;elsif rising_edge(clkdiv6)then -使用clkdiv6是为了和lcden吻合,达到使能目地 current_state = current_state ; lcdrs -测试空闲状态 data=00111000;-38h current_state data=00000110; -进入模式设置状态写入新数据后光标右移 current_state data=00001100; -显示开关控制状态;显示功能开 current_state data=00000001; -清屏指令 current_state data=10000000; -设置要显示数据的位置:第1行第1列80h current_state lcdrs=1; data=00110001;-设置要显示的数据1 current_state lcdrs=0; - 设置要显示数据的位置:第1行第2列81h data=10000001; current_state lcdrs=1; -设置要显示的数据2 data=00110010; current_state lcdrs=0; - 设置要显示数据的位置:第1行第3列82h data=10000010;-82h current_state lcdrs=1; -设置要显示的数据8 data=00111000; current_state lcdrs=0;- 设置要显示数据的位置:第2行第4列83h data=10000011; current_state lcdrs=1; -设置要显示的数据8 data=00111000; current_state lcdrs=0; - 设置要显示数据的位置:第1行第5列84h data=10000100;-82h current_state lcdrs=1; -设置要显示的数据4 data=00110100; current_state lcdrs=0; data=10000101; - 设置要显示数据的位置:第1行第6列85h current_state lcdrs=1; data=00110000; -设置要显示的数据0 current_state lcdrs=0; data=10000110;- 设置要显示数据的位置:第1行第7列86h current_state lcdrs=1; -设置要显示的数据1 data=00110001; current_state lcdrs=0; data=10000111;- 设置要显示数据的位置:第1行第8列87h current_state lcdrs=1; -设置要显示的数据5 data=00110101; current_state lcdrs=0; data=10001000;- 设置要显示数据的位置:第1行第9列88h current_state lcdrs=1; data=00101101; -设置要显示的数据- current_state lcdrs=0; data=10001001;- 设置要显示数据的位置:第1行第10列89h current_state lcdrs=1; data=01011010; -设置要显示的数据z current_state lcdrs=0; data=10001010;- 设置要显示数据的位置:第1行第11列90h current_state lcdrs=1; data=01000111; -设置要显示的数据g current_state lcdrs=0; data=10001011;- 设置要显示数据的位置:第1行第12列91h current_state lcdrs=1; data=01001100; -设置要显示的数据l current_state lcdrs=0; data=11000000;- 设置要显示数据的位置:第2行第1列c0h current_state lcdrs=1; -设置要显示的数据1 data=00110001; current_state lcdrs=0; data=11000001;- 设置要显示数据的位置:第2行第2列c1h current_state lcdrs=1; -设置要显示的数据2 data=00110010; current_state lcdrs=0; data=11000010;- 设置要显示数据的位置:第2行第3列c2h current_state lcdrs=1; -设置要显示的数据8 data=00111000; current_state lcdrs=0; data=11000011;- 设置要显示数据的位置:第2行第4列c3h current_state lcdrs=1; data=00111000;-设置要显示的数据8 current_state lcdrs=0; data=11000100;- 设置要显示数据的位置:第2行第5列c4h current_state lcdrs=1; -设置要显示的数据4 data=00110100; current_state lcdrs=0; data=11000101;- 设置要显示数据的位置:第2行第6列c5h current_state lcdrs=1; -设置要显示的数据0 data=00110000; current_state lcdrs=0; data=11000110;- 设置要显示数据的位置:第2行第7列c6h current_state lcdrs=1; -设置要显示的数据2 data=00110010; current_state lcdrs=0; data=11000111;- 设置要显示数据的位置:第2行第8列c7h current_state lcdrs=1; -设置要显示的数据8 data=00111000; current_state lcdrs=0; data=11001000;- 设置要显示数据的位置:第2行第9列c8h current_state lcdrs=1; -设置要显示的数据- data=00101101; current_state lcdrs=0; data=11001001;- 设置要显示数据的位置:第2行第10列c9h current_state lcdrs=1; -设置要显示的数据x data=01011000; current_state lcdrs=0; data=11001010;- 设置要显示数据的位置:第2行第11列cah current_state lcdrs=1; -设置要显示的数据h data=01001000; current_state lcdrs=0; data=11001011;- 设置要显示数据的位置:第2行第12列cbh current_state lcdda=1; -设置要显示的数据y data=01011001; current_state lcdda=0; data=01000000; -设定cgram地址指令; current_state lcdda=1; cnt1:=cnt1+1; -向cgram中写入“王”字; data=cgram(conv_integer(cnt1); if cnt1 = 1000 then current_state lcdda=0; -设定王字的显示位置 第1行第13列 92h data=10001100; current_state lcdda=1; -设置要显示的王字 data=00000000; current_state lcdda=0; -设定王字的显示位置 第2行第13列 cch data=11001100; current_state lcdda=1; -设置要显示的王字 data=00000000; if key1=1 then current_state=shift_cur; elsif key2=1 then current_state lcdda=0; data=00010100; current_state lcdda=0; datanull; end case; end if; end process; end behavioral;4. 设计结果: 显示12884015-zgl王 12884028-xhy 王5. 自定义汉字显示:步骤如下:1. 先将自定义字符或汉字写入cgram,如下图定义a的字模一样所示:如果想自定义一个十,则八行的字符串

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论