0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FPGA在OLED上显示DHT11数据

我快闭嘴 来源:FPGA之旅 作者:FPGA之旅 2022-09-09 10:33 次阅读

一. 简介

这是FPGA之旅设计的第十三例啦,本例是一个综合性的例程,基于OLED屏幕显示,和DHT11温湿度采集,将DHT11采集到的温湿度显示到OLED屏幕上。

在开始本例之前,先补充一下,在上例中,代码中有个位置有错误,就是DHT11是先发送湿度然后发送温度,代码中给弄反了,已修改。

显示效果如下

36a7db88-2f68-11ed-ba43-dac502259ad0.jpg

二. 字体的显示

字体的制作,以及如何将生成的字符数据添加到FPGA中,在上一例已经说明了,以及如何显示16*8的大小的字符,也就是不需要换行字符。本例中着重介绍如何显示16*16大小的字符,即在写入字符的过程中,需要有换行的操作,即切换page。本例的汉字大小为16*16,英文和数字为8*16大小的,即两种字体大小,这也是在显示过程中需要注意的点。

1

字符数据输出

这部分,还是和上例中一样,不同的是额外添加了一个font_row参数,因为本例中使用的字符都是需要换行的,所以需要添加这个参数。

always@(*)begin case(showfont_index) 'd0: showfont_data_reg <= {8'h78,8'h00,8'hB0 + show_y + font_row}; 'd1: showfont_data_reg <= {8'h78,8'h00,8'h00 + show_x[3:0]}; 'd2: showfont_data_reg <= {8'h78,8'h00,8'h10 + show_x[7:4]}; default: showfont_data_reg <= {8'h78,8'h40,fontdata}; //fontdata endcaseend

如何使用这个参数进行换行呢?

我们知道8*16大小的字符,一共用16个数据,每行占八个数据。所以这里需要先发送八个数据后,然后进行换行,将font_row参数加一,以及将showfont_index置0即可。在取字符的时候,需要注意,我们是根据showfont_index的值来取的,而换行后,这个参数置0了,这个时候,需要将font_row也用上,也就是还要加上8*font_row,这样就可以接着上次的位置继续取字符数据了。

当font_size字符大小为0,即8*16时,showfont_index为10的时候,就需要进行换行了,3个设置显示地址数据 加 8个正好是10(11)。

always@(posedge sys_clk or negedge rst_n)begin if(rst_n == 1'b0)  font_row <= 1'b0;  else if(onefont_finish == 1'b1) //一个字符显示完  font_row <= 1'b0; else if(font_size == 'd0 && showfont_index == 'd10 && write_done == 1'b1)  font_row <= 1'b1; else if(font_size == 'd1 && showfont_index == 'd18 && write_done == 1'b1)  font_row <= 1'b1; else  font_row <= font_row;endalways@(posedge sys_clk or negedge rst_n)begin if(rst_n == 1'b0)  showfont_index <= 'd0; else if(onefont_finish == 1'b1)  showfont_index <= 'd0; else if(font_size == 'd0 && showfont_index == 'd10 && write_done == 1'b1)  showfont_index <= 'd0; else if(font_size == 'd1 && showfont_index == 'd18 && write_done == 1'b1)  showfont_index <= 'd0; else if(write_done == 1'b1 && ShowFont_req == 1'b1)  showfont_index <= showfont_index + 1'b1; else  showfont_index <= showfont_index;end

取数据

data <= data0[index + 'd8 * font_row];

2

多个字符显示

这里只需要看这两行代码。每次一个字符显示完成后,font_index就加一,当显示完14个字符的时候,将ShowFont_finish拉高即可。比较容易。

assign onefont_finish = ((showfont_index == ('d10 + 'd8 * font_size)) && (font_row == 1'b1) && write_done == 1'b1) ? 1'b1 : 1'b0;assign ShowFont_finish = (onefont_finish == 1'b1 && font_index == 'd14) ? 1'b1 : 1'b0;

三. 整体介绍

本例中,OLED显示一共分为如下5个状态。在初始化完成后,屏幕显示的是杂乱无章的数据,所以在初始化完成后,要进行一次刷新,将OLED中的数据全部写0。然后进行显示固定不变的支符,例如像温度湿度这样的字符。然后进入空闲态,直到DHT11采集到数据后,就进入到数据显示状态,数据显示完成后,又回到空闲态。这是整个的一个流程。

localparam OLED_INIT   = 'd0;   //初始化localparam OLED_Refresh  = 'd1;   //刷新,将oled全部写0localparam OLED_ShowFont = 'd2;    //显示字符localparam OLED_IDLE   = 'd3;    //空闲localparam OLED_ShowData = 'd4;    //显示数据

总框图如下,可以看到在top模块,除了一些模块,还有一些其他的内容,这部分是专门针对DHT11的。测试过程中,发现每次采集数据的时间间隔不能太小,否则数据一直不变,查看手册后,得知两次采集的数据间隔不能小于1s,否则会有问题。

36cab9d2-2f68-11ed-ba43-dac502259ad0.png

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1592

    文章

    21207

    浏览量

    592144
  • OLED
    +关注

    关注

    116

    文章

    5944

    浏览量

    221032
  • DHT11
    +关注

    关注

    19

    文章

    264

    浏览量

    57110
收藏 人收藏

    评论

    相关推荐

    STM32外接DHT11温湿度传感器并通过OLED进行数据显示的设计电路与程序

    本篇介绍了如何在STM32上外接温湿度DHT11实现温湿度数据的读取,并通过OLED进行数据显示
    的头像 发表于 06-07 09:09 1.1w次阅读
    STM32外接<b class='flag-5'>DHT11</b>温湿度传感器并通过<b class='flag-5'>OLED</b>进行<b class='flag-5'>数据</b><b class='flag-5'>显示</b>的设计电路与程序

    Proteus教程:DHT11读取和显示

    Proteus教程:DHT11读取和显示
    的头像 发表于 06-14 11:37 1883次阅读
    Proteus教程:<b class='flag-5'>DHT11</b>读取和<b class='flag-5'>显示</b>

    【猫头鹰开发板试用体验】+【1122】DHT11实验

    1.DHT11配置2.从DHT11读一个字节3.读DHT11数据4.DHT11检查5.主函数 6.显示
    发表于 10-02 20:16

    如何把dht11温度数据显示16824液晶显示

    求大神指导!如何把dht11温度数据显示16824液晶显示?引脚接法和库函数什么的也请发下
    发表于 04-07 11:51

    【GD32330C-START开发板试用体验】DHT11温湿度测量

    循环读取DHT11数据, 并显示OLED, 当前温度为26.6度, 湿度74%4.对着
    发表于 09-24 15:01

    【STM32F103试用体验】OLED显示DHT11温湿度测量实验

    , 先显示基本信息至OLED屏, 然后每1秒通过DHT11获取温湿度数据, 并实时OLED
    发表于 09-25 10:11

    请问有单片机采集DHT11信号显示OLED的C语言程序吗?

    求单片机采集DHT11信号显示OLED的C语言程序
    发表于 06-02 21:57

    怎么mini板用ucosII调用DHT11测温湿度?

    有人做过mini板用ucosII调用DHT11测温湿度LCD显示
    发表于 03-16 00:59

    DHT11温湿度模块如何将测量的数据显示oled显示屏上面?

    DHT11温湿度模块如何将测量的数据显示oled显示屏上面?
    发表于 11-26 06:50

    如何利用DHT11测温模块把数值显示OLED显示

    思路基于stm32芯片 利用DHT11测温模块把数值显示OLED显示硬件硬件部分可以点我这
    发表于 01-10 07:57

    DHT11模块资料

    DHT11模块资料,关于如何使用dht11温湿度传感器的方法以及相关例程。
    发表于 03-16 15:31 83次下载

    DHT11(51数码管显示

    DHT11温湿度传感器(51数码管显示)测试程序。
    发表于 05-06 11:47 74次下载

    DHT11程序

    DHT11学习
    发表于 12-28 11:07 35次下载

    为什么加入dht11的例程读取不到dht11数据应该如何解决

     最近遇到了一个十分坑爹的问题,就是在调试我的毕业设计时候。在加入dht11的例程时,怎么都读取不到dht11数据
    发表于 07-02 17:42 24次下载
    为什么加入<b class='flag-5'>dht11</b>的例程读取不到<b class='flag-5'>dht11</b>的<b class='flag-5'>数据</b>应该如何解决

    基于STC15F104W下的温湿度显示DHT11)(OLED

    设计名称:基于DHT11的温湿度计显示:采用OLED12864显示温度和湿度测量,采用DHT11模块Hygrothermograph.c#i
    发表于 11-20 12:36 34次下载
    基于STC15F104W下的温湿度<b class='flag-5'>显示</b>(<b class='flag-5'>DHT11</b>)(<b class='flag-5'>OLED</b>)