PLD与数字系统设计创新实验报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

《PLD与数字系统设计》创新实验报告实验内容:LCD1602自定义字符显示姓名:方夏章院系:23系学号:SA15023016第1页目录1:实验内容简述...................................................................................22:实验思路及代码...............................................................................22.1:汉字显示实验..........................................................................22.1.1相关指令...........................................................................32.1.2:字符取模........................................................................42.1.3:核心代码:....................................................................62.2:动态图形显示实验:..............................................................72.2.1四个动作取模:...............................................................72.2.2:计时及刷新....................................................................82.2.3核心代码..........................................................................93:实验结果:.......................................................................................93.1:汉字显示实验结果..................................................................93.2:动态图形实验结果:............................................................104:实验心得.........................................................................................115:附录.................................................................................................12第2页1:实验内容简述由于在做课程实验时,选择了B组的实验,也就是基于Spartan-3StarterBoard开发板的一组实验,在实验中,后三个实验都用到了LCD1602模块,但是用其显示的都是自带字库里面的字符,所以我萌发了这样一个实验想法,就是用LCD1602来显示我的自定义字符,也就有了这个实验,此实验不能说是一个创新实验,但是由于在课程实验中没有涉及到,所以对我而言确实是一个新的尝试。本实验共包括两个小实验,一个是汉字显示,另外一个是动态图形显示。汉字显示实验中,显示的是我的名字;动态图形显示中显示的是一个“奔跑的小人”。2:实验思路及代码2.1:汉字显示实验在课程实验中,我们接触了LCD1602的显示功能,但是其显示的都是自带字库里的内容,比如数字和字母,这些内容都存储于字符产生器(CGROM),如下图:第3页其中存储了192个常用字符的字模,但是我们可以从图中看到,从0x00到0x0f的16个位置是空着的,这是留给用户存放自定义字符的地方,也就是CGRAM,对于5X8的字符,可以存放8组。(这里一共有16个位置,但是只能存储8组,原因在于0x08-0x0f的内容和0x00-0x07是一样的)。也就是说,我们可以将自己定义的汉字存放到CGRAM里面。2.1.1相关指令对于LCD1602,相输出我们自定义的图形或字符,必须先将此内容写入CGRAM,然后根据写入的地址,读到DDRAM里,才会显示在液晶屏上。而不能直接显示。而将数据写入CGRAM又需要两步,首先设定要写入到CGRAM的地址,然后连续写入8组5位的数据(对应5X8的字符)。所以要显示自定义字符的总的流程如下:设定CGRAM地址写入数据到CGRAM设定DDRAM地址写入数据到DDRAM查阅LCD1602资料,将上述流程中所涉及的指令列出如下:设定CGRAM地址其中DB5~DB3三位代表的是CGRAM中字符的地址,000代表写入地址0x00,依次类推DB2~DB0代表写入的行数,也即从第几行开始写,因为一个字符有8行。所以若想写入一个完整的5x8字符到0x00中,则指令为01000000(0x40),此时RS=0,R/W=0.第4页写入数据到CGRAM或DDRAM写入数据到CGRAM和DDRAM的指令是一样的,其区别主要取决于上一步的设定,若设定的是CGRAM的地址,则写入数据到CGRAM,若设定的是DDRAM的地址,则写入数据到DDRAM。对于写入数据到CGRAM,因为5x8的字符需要写入8组,每组长度为5的数据,所以其数据位对应DB4~DB0,而DB7~DB5可为任意数据,一般设为000。对于写入数据到DDRAM,DB7~DB0对应CGROM(包括已写入数据的CGRAM)的8位地址。所以若DB7~DB0为00000000,则将CGRAM中的第一个位置的字符写入DDRAM(如果此位置已经写入自定义字符数据)。设定DDRAM地址设定DDRAM地址,即是选择液晶屏上想显示字符的位置,LCD1602共有两行,每行有16个位置。第一行对应的DB7~DB0为0x80到0x8f,第二行对应的是0xc0到0xcf(注意,这里不是从90开始,而是从c0开始)。2.1.2:字符取模字符取模,也就是将字符对应相应的方格里(比如5X8的字符就对应5x8的方格),然后将空白的方格值定为0,其他的定为1,这样就将字符的模取好了。因为1602的单个字(这里说的字是指一个5x8单元)实在太小,只有5x8,难以清楚的显示一个汉字,所以本实验采用了10x8的空间来显示一个字符(其实也就是将一个字拆成上下两部分,分别写入两个地址)。关于取模这一步,在网上找了一下,没找到我需要的格式,基本上都是16x16的格式,所以,为了一劳永逸,自己做了一个取模的工具。如下图:第5页LCD1602取模图片上述图片对于5x8,10x8,10x16都可以很好的取模,而且在每个5x8的单元之间都加粗以更加容易辨别。根据2.1.1中分析,虽然数据是5位,但要5位数据之前补3位0,所以按十六进制来取模的话,首先看没一行的第一格,若是空白,则为0,若不是空白,则为1,再将后四位用十六进制读出来即可。参考一个例子:第6页此为我姓名中的“夏”字,可从中读出每一行的数据分别为:0x1f,0x04,0x08,0x1f,0x11,0x1f,0x11,0x1f(第一个字),0x11,0x1f,0x04,0x0f,0x19,0x06,0x06,0x19(第二个字)。本实验中其他字符的数据就不一一列举。2.1.3:核心代码:除了上述四个指令之外,LCD想要显示,还必须要有清屏,功能设置,上电等待等操作。而在程序中,我为了将写数据到CGRAM和显示自定义字符区分开,将这两个部分写入了两个不同的always块里。核心代码如附录A第7页2.2:动态图形显示实验:在汉字显示实验中,已经尝试了显示自定义字符,所以在此实验里不再赘述相关内容。在此实验中,完成了一个“奔跑的小人”,由两个“字”组成一个小人图形,因为一共只有8个字留给我自定义,所以“小人”一共只有四个不同的动作,分别对应“准备起跑”“起跑”“跑步”“终点”。2.2.1四个动作取模:“准备起跑”和“起跑”动作的取模“准备起跑”0x0e,0x11,0x11,0x0e,0x04,0x04,0x0c,0x140x12,0x11,0x10,0x1c,0x12,0x12,0x14,0x00“起跑”0x0e,0x11,0x11,0x0e,0x04,0x0e,0x15,0x040x04,0x04,0x04,0x04,0x0a,0x0a,0x11,0x00第8页“奔跑”和“终点”取模“奔跑”0x0e,0x11,0x11,0x0e,0x04,0x0d,0x16,0x040x04,0x04,0x04,0x06,0x09,0x12,0x04,0x00“终点”0x0e,0x11,0x11,0x0e,0x05,0x0e,0x14,0x120x02,0x02,0x02,0x06,0x09,0x11,0x02,0x042.2.2:计时及刷新由于本实验希望得到结果是一个动态图形,在不同的时间小人需要以不同的动作出现在不同的位置,所以必须有一个计时参数,根据这个参数来确定小人的动作和位置,所以,在程序中,设计了一个num来计时,而且希望每半秒,图第9页片动一下,所以,需要由系统时钟分频得到一个2Hz的时钟clk2h,以此时钟来控制num的变化。由于一共只有四次变化,所以,设置num从00到11的变动,每个clk2h的上升沿的时候num变化一下。将上述取模得到的数据分别按顺序写入CGRAM的0x00到0x07(注意,0x00和0x04对应一个小人动作,0x01和0x05对应一个动作,以此类推,一个动作上下两部分对应的位置间隔4个)。另外,考虑到在图形变化时,原先液晶上显示字符的地方变的没有图形,所以每次num变动,就必须对LCD进行一次清屏。于是设置了一个clear_en信号作为清屏控制信号,将此信号的赋值写进分频器里。2.2.3核心代码此实验的核心代码与汉字显示实验类似,只是改变了自定义的字符,加入了计时和定期刷新。核心代码如附录B。3:实验结果:3.1:汉字显示实验结果第10页3.2:动态图形实验结果:虽然拍的图片是静态的,但是从图中还可以看到图形变化的残影,效果很好。第11页4:实验心得兴趣是最好的老师,这是这次实验带给我最大的感触,当将枯燥无味的编程写代码变成了有趣的事情之后,动力就随之而来。从刚开始接触1602的时候,我的心里就十分希望能让那个屏幕显示出我自己想让它显示的各种奇奇怪怪的图像。于是我就去学了,于是我就去做了。当屏幕上出现我的名字,当小人真的奔跑起来的时候,我的内心是极其开心的。感谢PLD这门课让我接触了如此有意思的东西,同时也我也知道,我这个实验远远算不上创新,只是对我个人而言的新事物而已,PLD之路,任重而道远。第12页5:附录附录A:`timescale1ns/1ps////////////////////////////////////////////////////////////////////////////////////Company://Engineer:////CreateDate:16:18:4311/18/2015//DesignName://ModuleName:lcd1602//ProjectName://TargetDevices://Toolversions://Description:////Dependencies:////Revision://Revision0.01-FileCreated//AdditionalComments://///////////////////////////////////

1 / 27
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功