1)实验平台:正点原子新起点V2开发板
2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113
2)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-300792-1-1.html
3)对正点原子FPGA感兴趣的同学可以加群讨论:994244016
4)关注正点原子公众号,获取最新资料更新

第三十二章RTC实时时钟LCD显示实验

我们在“RTC实时时钟数码管显示实验”中成功的在数码管上显示了日期和时间。本章我们在“RTC实时时钟数码管显示实验”的基础上稍作修改,在LCD屏上显示日期和时间。
本章包括以下几个部分:

3131.1简介
31.2实验任务
31.3硬件设计
31.4程序设计
31.5下载验证

32.1简介
我们在“RTC实时时钟数码管显示实验”中对PCF8563实时时钟芯片作了详细的介绍,如果大家对这部分内容不是很熟悉的话,请参考“RTC实时时钟数码管显示实验”中的简介部分。
32.2实验任务
本节的实验任务是通过新起点开发板上的PCF8563实时时钟芯片,在RGB-LCD液晶屏上显示日期和时间。
32.3硬件设计
PCF8563部分的硬件设计原理在“RTC实时时钟数码管实验”中已作了详细的介绍,请参考“RTC实时时钟数码管实验”中的硬件设计部分。
32.4程序设计
根据实验任务,我们可以大致规划出系统的控制流程:首先通过I2C总线向PCF8563写入初始日期值(年月日)和时间值(时分秒),然后不断地读取日期和时间数据,并将读到的时间数据显示到LCD上。由此画出系统的功能框图如下图所示:

图 32.4.1 系统框图
由系统框图可知,FPGA顶层模块例化了以下三个模块、分别是IIC驱动模块(i2c_dri)、PCF8563控制模块(pcf8563_ctrl)以及LCD字符显示模块(lcd_disp_char)。
各模块端口及信号连接如下图所示:

图 32.4.2 顶层模块原理图
PCF8563控制模块通过调用IIC驱动模块来实现对PCF8563实时时钟数据的配置和读取;并将读到的值(年、月、日、时、分和秒)输出给LCD字符显示模块来显示。
顶层模块主要完成对其余模块的例化,其中I2C驱动模块(i2c_dri)程序与“EEPROM读写实验”章节中的IIC驱动模块(i2c_dri)程序完全相同,有关IIC驱动模块的详细介绍请大家参考“EEPROM读写实验”。pcf8563控制模块(pcf8563_ctrl)与“RTC实时时钟数码管显示实验”章节中的pcf8563控制模块完全相同,此处不再赘述。
LCD字符显示模块(lcd_disp_char)的代码由“RGB-LCD字符和图片显示”实验的代码修改而来,除lcd_disp_char顶层模块外,唯一不同的地方在LCD显示模块。
LCD显示模块的代码如下所示:

1   module lcd_display(
2       input                lcd_pclk ,
3       input                rst_n ,
4
5       //日历数据
6       input         [7:0]  sec,        //秒
7       input         [7:0]  min,        //分
8       input         [7:0]  hour,       //时
9       input         [7:0]  day,        //日
10      input         [7:0]  mon,        //月
11      input         [7:0]  year,       //年
12
13      //LCD数据接口
14      input        [10:0]  pixel_xpos, //像素点横坐标
15      input        [10:0]  pixel_ypos, //像素点纵坐标
16      output  reg  [15:0]  pixel_data  //像素点数据
17  );
18
19  //parameter define
20  localparam CHAR_POS_X_1  = 11'd1;  //第1行字符区域起始点横坐标
21  localparam CHAR_POS_Y_1  = 11'd1;  //第1行字符区域起始点纵坐标
22  localparam CHAR_POS_X_2  = 11'd17; //第2行字符区域起始点横坐标
23  localparam CHAR_POS_Y_2  = 11'd17; //第2行字符区域起始点纵坐标
24  localparam CHAR_WIDTH_1  = 11'd80; //第1行字符区域的宽度,第1行共10个字符(加空格)
25  localparam CHAR_WIDTH_2  = 11'd64; //第2行字符区域的宽度,第2行共8个字符(加空格)
26  localparam CHAR_HEIGHT   = 11'd16; //单个字符的高度
27  localparam WHITE  = 16'hffff;    //背景色,白色
28  localparam BLACK  = 16'h0000;    //字符颜色,黑色
29
30  //reg define
31  reg  [127:0]  char  [9:0] ;        //字符数组
32
33  //*****************************************************
34  //**                    main code
35  //*****************************************************
36
37  //字符数组初始值,用于存储字模数据(由取模软件生成,单个数字字体大小:16*8)
38  always @(posedge lcd_pclk ) begin
39      char[0] <= 128'h00000018244242424242424224180000 ;  // "0"
40      char[1] <= 128'h000000107010101010101010107C0000 ;  // "1"
41      char[2] <= 128'h0000003C4242420404081020427E0000 ;  // "2"
42      char[3] <= 128'h0000003C424204180402024244380000 ;  // "3"
43      char[4] <= 128'h000000040C14242444447E04041E0000 ;  // "4"
44      char[5] <= 128'h0000007E404040586402024244380000 ;  // "5"
45      char[6] <= 128'h0000001C244040586442424224180000 ;  // "6"
46      char[7] <= 128'h0000007E444408081010101010100000 ;  // "7"
47      char[8] <= 128'h0000003C4242422418244242423C0000 ;  // "8"
48      char[9] <= 128'h0000001824424242261A020224380000 ;  // "9"
49  end
50
51  //不同的区域绘制不同的像素数据
52  always @(posedge lcd_pclk or negedge rst_n ) begin
53      if (!rst_n)  begin
54          pixel_data <= BLACK;
55      end
56
57      //在第一行显示年的千位 固定值"2"
58      else if(     (pixel_xpos >= CHAR_POS_X_1)
59                && (pixel_xpos <  CHAR_POS_X_1 + CHAR_WIDTH_1/10*1)
60                && (pixel_ypos >= CHAR_POS_Y_1)
61                && (pixel_ypos <  CHAR_POS_Y_1 + CHAR_HEIGHT)  ) begin
62          if(char [2] [ (CHAR_HEIGHT+CHAR_POS_Y_1 - pixel_ypos)*8
63                        - (pixel_xpos-CHAR_POS_X_1) -1 ] )
64              pixel_data <= BLACK;         //显示字符为黑色
65          else
66              pixel_data <= WHITE;        //显示字符区域背景为白色
67      end

由于代码较长,此处省略部分代码。

245     //在第二行显示秒的个位
246     else if(     (pixel_xpos >= CHAR_POS_X_2 + CHAR_WIDTH_2/8*7)
247               && (pixel_xpos <  CHAR_POS_X_2 + CHAR_WIDTH_2)
248               && (pixel_ypos >= CHAR_POS_Y_2)
249               && (pixel_ypos <  CHAR_POS_Y_2 + CHAR_HEIGHT)  ) begin
250         if(char [sec[3:0]] [ (CHAR_HEIGHT+CHAR_POS_Y_2 - pixel_ypos)*8
251                              - (pixel_xpos-(CHAR_POS_X_2 + CHAR_WIDTH_2/8*7)) -1 ])
252             pixel_data <= BLACK;
253         else
254             pixel_data <= WHITE;
255     end
256
257     else begin
258         pixel_data <= WHITE;    //屏幕背景为白色
259     end
260 end
261
262 endmodule

我们的显示内容首先分成两行,第一行显示年月日,第二行显示时分秒。程序中第19至28行代码定义了一些参数,前4个参数定义每一行字符显示的参考点,结合具体参数值我们知道:第一行是(1,1),第二行是(17,17),接着后面两个参数分别定义了每一行各自显示的宽度(长度),分别是80和64,最后两个参数定义了字符的颜色和背景色,字符颜色为黑色,背景色为白色。
代码第31行定义了一个元素个数为10,每个元素的位宽为128位的数组(char),这10个元素分别对应阿拉伯数字0~9的字模数据,每一个字模(数字)所占的像素大小是长16个像素,宽8个像素,共16*8=128位像素数据。这里将一个数字的字模数据存放在了数组的一个元素中,因此数组元素的位宽是128位。
在代码的第38到49行分别为数组中的每一个元素进行赋值,将从字模软件中得到的字模数据(0~9)赋值给数组中的每一个元素,其中一个数字的字模数据共需要128个像素点,对应,每一个元素的128位。这里以数字0产生的字模数据为例,示意图如下图所示:

图 32.4.3 数字“0”产生字模示意图
由上图可知,实际上我们把X方向和Y方向的的所有数据都放在了一行上,使用时可以把它看成一个二维数组,大小为16*8bit,即16行,每一行有8位数据。
代码第57到67行是一个具体的字符显示的逻辑。首先判断当前像素坐标的位置,如代码第58到61行,如果处在字符显示的区域则开始根据字符数组值来显示像素。显示时,数组参数pixel_xpos,pixel_ypos分别从小到大取不同的值时,代入数组,此时我们实际上就是在从左到右,从上到下扫描一个字符像素平面,pixel_xpos变化对于行扫描,pixel_ypos则对于列扫描。
对于62行的代码 “ (CHAR_HEIGHT+CHAR_POS_Y_1 - pixel_ypos)*8”,我们不难理解“*8”的由来,因为在查找数组元素的时候,pixel_ypos的每次变化代表换到下一行扫描,一行跨过8个数据,所有乘以8。这里总结一下:字符数组一行的128个数据从高位到低位,每8位代表另一行,分别对应点阵中该行从左向右的每一个像素点。
62行到63行是对数组的每个元素分别赋值,具体是数组元素为1的点赋值为黑色,否则为白色。
往下,每一个字符显示逻辑的分析和上面类似,请大家自行分析。
程序中第37至49行代码初始化字符数组的值,即数字“0”~“9”的字模数据,由取模软件生成,先将软件设置成字符模式,取模软件的设置如下:

图 32.4.4 字符软件设置
这里将点阵设置为16,即一个数字的字符用一行来表示。
生成字模的界面如下:

图 32.4.5 生成字模的软件设置
程序中第51行至260行代码根据输入的日期、时间和字符区域的坐标显示在LCD上,字符颜色为黑色,背景色为白色。
32.5下载验证
首先将FPC排线一端与RGB-LCD模块上的J1接口连接,另一端与新起点开发板上的RGB-LCD接口连接。然后将下载器一端连电脑,另一端与开发板上的JTAG端口连接,最后连接电源线,并打开电源开关。接下来下载程序,程序下载完成后观察RGB-LCD液晶屏上显示出日期和时间,并且时间在不断的计时,如下图所示,说明RTC实时时钟实验验证成功。

图 32.5.1 实验结果

【正点原子FPGA连载】第三十二章RTC实时时钟LCD显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1相关推荐

  1. 【正点原子FPGA连载】 第二十四章 RTC实时时钟LCD显示实验-摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0

    1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...

  2. zynqsd的读写数据_【正点原子FPGA连载】 第十二章SD卡读写TXT文本实验-摘自【正点原子】领航者 ZYNQ 之嵌入式开发指南 (amobbs.com 阿莫电子论坛)...

    本帖最后由 正点原子 于 2020-10-24 10:25 编辑 QQ群头像.png (1.78 KB) 2020-10-24 10:25 上传5)关注正点原子公众号,获取最新资料 100846rel ...

  3. 【正点原子FPGA连载】 第三十四章双目OV5640摄像头RGB-LCD显示实验 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...

  4. 【正点原子FPGA连载】 第三十五章双目OV5640摄像头HDMI显示实验 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...

  5. 简述sd卡2.0协议_【正点原子FPGA连载】第十二章SD卡读写TXT文本实验-领航者 ZYNQ 之嵌入式开发指南...

    1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...

  6. 【正点原子FPGA连载】第十九章IP核之双端口RAM实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  7. 【正点原子FPGA连载】第十四章SD卡读写TXT文本实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...

  8. 【正点原子STM32连载】 第二十五章 TFTLCD(MCU屏)实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  9. 【正点原子STM32连载】 第二十五章 TFT-LCD(MCU屏)实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

    1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套实验源码+手册+视 ...

最新文章

  1. pandas使用dropna函数计算返回dataframe中不包含缺失值的行索引列表list(index of rows without missing values in dataframe)
  2. 怎样学好python-我们应该如何学好Python?
  3. c++ 协程_理解Python协程(Coroutine)
  4. MVC5 + EF6 入门完整教程
  5. JAVA File方法各类文件复制操作
  6. Java实现消息发送
  7. KVM虚拟机共享存储动态迁移与冷迁移
  8. 微信公众号python人工智能回复_python实现微信机器人: 登录微信、消息接收、自动回复功能...
  9. python 八大排序_八大排序算法的 Python 实现
  10. python将学生信息保存到文件中_Python statsmodels OLS:如何将学习的模型保存到文件中...
  11. MyEclipse修改Servlet模板
  12. 使用FlashFTP上传文件到指定服务器
  13. erstudio连接mysql_ERStudio下载|数据库建模工具(ER/Studio Data Architect)下载 v17.0.2 官方32/64位版 - 比克尔下载...
  14. 微软云 Azure 云服务器 Web应用服务云计算解决方案
  15. 工业B2B电商平台整合延伸工业供应链上下游,打造产业链闭环
  16. 关于windows10系统连接隐藏网络时,显示无法连接问题的解决方式
  17. 数字图像处理(冈萨雷斯版)-第一章
  18. 董卫凤:不服输是成功最好的催化剂
  19. 房贷计算器html代码,html房贷计算器输出两个框怎么弄
  20. zookeeper 数据节点的增删改查

热门文章

  1. 计算机组成原理 - 存储器
  2. cfiledialog对话框大小_利用MFC的CFileDialog生成Windows2000文件对话框 (转)
  3. mysql数据库名忘了_忘了mysql数据库密码,该怎么办???
  4. Shiro 报UnavailableSecurityManagerException
  5. ffplay自定义播放器封装C#接口
  6. 【摘】学佛必读的十大经典佛经
  7. 【网安神器篇】——Crunch字典生成工具
  8. shell脚本--判断
  9. 关于可重定位目标文件的格式与其符号表的概述
  10. <秒懂男女关系秘密的第一本书>