当前位置:首页 > 技术学院 > FPGA之旅
[导读]这是FPGA之旅设计的第九例啦!!!本例将介绍如何使用FPGA驱动OLED屏幕,并在接下来的几例中,配合其它模块,进行一些有趣的综合实验。由于使用的OLED屏是IIC接口的,对IIC接口不是很清楚的,可以参考第五例的设计,同时使用第五例写好的IIC模块,驱动OLED屏。Let's do it!

一. 简介

这是FPGA之旅设计的第九例啦!!!本例将介绍如何使用FPGA驱动OLED屏幕,并在接下来的几例中,配合其它模块,进行一些有趣的综合实验。由于使用的OLED屏是IIC接口的,对IIC接口不是很清楚的,可以参考第五例的设计,同时使用第五例写好的IIC模块,驱动OLED屏。Let's do it!

二. 0.96寸OLED屏介绍

这里就只介绍最常用的0.96寸屏,其它的一样。OLED共支持8080并口、SPI和IIC三种接口,同样也只介绍IIC接口的用法。0.96寸OLED屏幕的分辨率为128×64,内部有一块GRAM用来存储显示的数据。

1

OLED的存储区域


这块存储区域分为8个page,每个page下面共有128bit,如下图所示

这就难免会有些疑问了,128×8,不应该是128×64嘛?8个page,为什么是64行呢?数据写入的呢?

每一个page包括8行,所以说8个page共有64行。IIC每次发送数据的时候,是发送一个byte的,也就是8bit,这8bit数据会存储到某一列的八行中,例如图中SEG0区域,是第一列的头八行。这样GRAM的存储区域就弄懂了。


2

OLED的数据存储模式

当我们向OLED的GRAM发送显示数据的过程中,OLED内部共有三种处理模式。

模式一: 当我们指定了一个page和某一列的时候,每写一个数据,列会自动加一,当写到page的最后一列的时候,列数,会自动跳转到第零列,需要手动的切换page。


模式二与模式一不同的时候,当写达到page的最后一列的时候,列数跳转到第零列的同时,page数也会加一。


模式三: 与前两个模式不同,模式三,是一列一列的写,每写完一个数据,page数加一,当加到最后一个page的时候,列数加一,page跳转到第一个page。


在实际的使用中,具体使用那一种模式,可以根据自己的子模软件或者项目来,怎么方便怎么来!

了解了上面两个部分后,基本就可以编写驱动程序啦,不要问为什么,(#^.^#),初始化OLED就是配置一些列命令的过程,而这些寄存器和配置的值一般都是copy现成的。然后了解一下关键的一两个命令就可以啦。想要深入的了解OLED的功能的话,可以阅读对应的芯片手册哦!在后面的例程中也会介绍部分功能强大的命令。


三. OLED关键命令介绍

  • 0xAE/0xAF: 对应着开启OLED显示和关闭OLED显示

  • 0x20-0x22: 对应着上面的三种OLED数据存储模式,默认为0x22,模式一

  • 0x00-0x0F: 设置列地址的低四位,默认为0x00

  • 0x10-0x1F: 置列地址的高四位,默认为0x10

  • 0xB0-0xB7: 设置page,第四位表示page

暂时差不多只需要了解上面的这些寄存器。


四. IIC驱动OLED数据格式

驱动OLED分为写数据和写命令(读暂时不考虑)。写命令就是配置的过程,写数据就是写入GRAM中进行显示的过程。

IIC数据格式  :OLED地址 + 命令 / 数据 +  值。

OLED地址就是IIC协议中的从机地址,我这里是0x78。

命令/数据中0x00表示接下来的值代表命令,0x40表示接下的值表示数据,存入GRMA。

具体的命令或者数据

也就是说每一次IIC需要传输24bit,3个字节的数据,和第五例的IIC模块完美对应,那事情就好办啦!


五. OLED初始化

直接copy某例程提供的配置参数,共需要配置26个命令,第一个是上面介绍的0xAE命令,关闭OLED显示。最后一个也是介绍的0xAF命令,开启OLED显示,没有配置模式,直接使用的默认的模式一,配置完成后,可以看到OLED屏被点亮,内容是杂乱的

always@(*)begin case(Init_index) 'd0:    Init_data_reg <= {8'h78,8'h00,8'hAE}; //OLED地址 + 命令  +  值。** 'd1:    Init_data_reg <= {8'h78,8'h00,8'h00}; 'd2:    Init_data_reg <= {8'h78,8'h00,8'h10}; 'd3:    Init_data_reg <= {8'h78,8'h00,8'h40}; 'd4:    Init_data_reg <= {8'h78,8'h00,8'hB0}; 'd5:    Init_data_reg <= {8'h78,8'h00,8'h81}; 'd6:    Init_data_reg <= {8'h78,8'h00,8'hFF}; 'd7:    Init_data_reg <= {8'h78,8'h00,8'hA1}; 'd8:    Init_data_reg <= {8'h78,8'h00,8'hA6}; 'd9:    Init_data_reg <= {8'h78,8'h00,8'hA8}; 'd10:    Init_data_reg <= {8'h78,8'h00,8'h3F}; 'd11:    Init_data_reg <= {8'h78,8'h00,8'hC8}; 'd12:    Init_data_reg <= {8'h78,8'h00,8'hD3}; 'd13:    Init_data_reg <= {8'h78,8'h00,8'h00}; 'd14:    Init_data_reg <= {8'h78,8'h00,8'hD5}; 'd15:    Init_data_reg <= {8'h78,8'h00,8'h80}; 'd16:    Init_data_reg <= {8'h78,8'h00,8'hD8}; 'd17:    Init_data_reg <= {8'h78,8'h00,8'h05}; 'd18:    Init_data_reg <= {8'h78,8'h00,8'hD9}; 'd19:    Init_data_reg <= {8'h78,8'h00,8'hF1}; 'd20:    Init_data_reg <= {8'h78,8'h00,8'hDA}; 'd21:    Init_data_reg <= {8'h78,8'h00,8'h12}; 'd22:    Init_data_reg <= {8'h78,8'h00,8'hDB}; 'd23:    Init_data_reg <= {8'h78,8'h00,8'h30}; 'd24:    Init_data_reg <= {8'h78,8'h00,8'h8D}; 'd25:    Init_data_reg <= {8'h78,8'h00,8'h14}; 'd26:    Init_data_reg <= {8'h78,8'h00,8'hAF}; default: Init_data_reg <= {8'h78,8'h00,8'hAE}; endcaseend


六. 向GRAM中写入数据

初始化后,就可以显示内容啦,仅仅只需要配置page和起始列三个命令,然后写入数据即可,配置页和列地址,只有在模式一有效,也就是上电默认的模式。

这样就可以显示数据啦,亲测可用哦!

'd0:show_data_reg <= {8'h78,8'h00,8'hb0 + show_pag}; //配置页'd1:show_data_reg <= {8'h78,8'h00,8'h00 +start_x[3:0]}; //配置列的低四位'd2:show_data_reg <= {8'h78,8'h00,8'h10 + start_x[6:4]}; //配置列的高四位,128列只需要配置高三位即可。'd3:show_data_reg <= {8'h78,8'h40, data}; //向配置的地址中,写入显示的数据

其实驱动OLED也没有那么复杂嘛。


七. 上板验证

先来编写个简单的模块,用来初始化OLED。下载程序后,我的OLED是亮起来了,你的呢!

//OLED顶层模块module OLED_Top( input      sys_clk, input      rst_n, //OLED IIC output    OLED_SCL, inout      OLED_SDA);localparam  OLED_INIT = 'd0;      //初始化localparam  OLED_IDLE = 'd1; //空闲reg[4:0]  state , next_state;wire      init_finish;wire[23:0]  Init_data;wire       init_req;wire      IICWriteDone;assign init_req = (state == OLED_INIT) ? 1'b1 : 1'b0;always@(posedge sys_clk or negedge rst_n)begin if(rst_n == 1'b0) state <= OLED_INIT; else state <= next_state;endalways@(*)begin case(state) OLED_INIT: if(init_finish == 1'b1) next_state <= OLED_IDLE; else next_state <= OLED_INIT; OLED_IDLE: next_state <= OLED_IDLE; default: next_state <= OLED_INIT; endcaseendOLED_Init OLED_Init(  .sys_clk        (sys_clk), .rst_n        (rst_n),  .init_req      (init_req), //初始化请求 .write_done      (IICWriteDone), //一组初始化数据完成信号  .init_finish    (init_finish), //初始化完成输出  .Init_data      (Init_data)//初始化的数据);IIC_Driver IIC_DriverHP_OLED( .sys_clk        (sys_clk), /*系统时钟*/ .rst_n        (rst_n), /*系统复位*/  .IICSCL        (OLED_SCL), /*IIC 时钟输出*/ .IICSDA        (OLED_SDA), /*IIC 数据线*/   .IICSlave      ({Init_data[15:8],Init_data[23:16]}), /*从机 8bit的寄存器地址 + 8bit的从机地址*/  .IICWriteReq    (init_req), /*IIC写寄存器请求*/ .IICWriteDone    (IICWriteDone), /*IIC写寄存器完成*/ .IICWriteData    (Init_data[7:0]), /*IIC发送数据  8bit的数据*/  .IICReadReq      (1'b0), /*IIC读寄存器请求*/ .IICReadDone      (), /*IIC读寄存器完成*/ .IICReadData        () /*IIC读取数据*/);endmodule

FPGA驱动OLED就结束啦!


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在数字化浪潮席卷全球的今天,FPGA技术正成为驱动创新的核心引擎。2025年8月21日,深圳将迎来一场聚焦FPGA技术与产业应用的盛会——2025安路科技FPGA技术沙龙。本次沙龙以“定制未来 共建生态”为主题,汇聚行业...

关键字: FPGA 核心板 开发板

在现代电子系统中,现场可编程门阵列(FPGA)凭借其开发时间短、成本效益高以及灵活的现场重配置与升级等诸多优点,被广泛应用于各种产品领域。从通信设备到工业控制,从汽车电子到航空航天,FPGA 的身影无处不在。为了充分发挥...

关键字: 可编程门阵列 FPGA 数字电源

2025年8月4日 – 提供超丰富半导体和电子元器件™的业界知名新品引入 (NPI) 代理商贸泽电子 (Mouser Electronics) 即日起开售Altera®的Agilex™ 3 FPGA C系列开发套件。此开...

关键字: FPGA 边缘计算 嵌入式应用

内窥镜泛指经自然腔道或人工孔道进入体内,并对体内器官或结构进行直接观察和对疾病进行诊断的医疗设备,一般由光学镜头、冷光源、光导纤维、图像传感器以及机械装置等构成。文章介绍了一款基于两片图像传感器和FPGA组成的微型3D内...

关键字: 微创 3D内窥镜 OV6946 FPGA

运用单片机和FPGA芯片作为主控制器件 , 单片机接收从PC机上传过来的显示内容和显示控制命令 , 通过命令解释和数据转换 , 生成LED显示屏所需要的数据信号和同步的控制信号— 数据、时钟、行同步和面同步 。FPGA芯...

关键字: 单片机 FPGA LED显示屏

在异构计算系统中,ARM与FPGA的协同工作已成为高性能计算的关键架构。本文基于FSPI(Fast Serial Peripheral Interface)四线模式,在150MHz时钟频率下实现10.5MB/s的可靠数据...

关键字: ARM FPGA FSPI

在全球FPGA市场被Xilinx(AMD)与Intel垄断的格局下,国产FPGA厂商高云半导体通过构建自主IP核生态与智能时序约束引擎,走出差异化高端化路径。本文深入解析高云半导体FPGA工具链的两大核心技术——全栈IP...

关键字: FPGA 高云半导体

2025年6月12日,由安路科技主办的2025 FPGA技术沙龙在南京正式召开,深圳市米尔电子有限公司(简称:米尔电子)作为国产FPGA的代表企业出席此次活动。米尔电子发表演讲,并展出米尔基于安路飞龙派的核心板和解决方案...

关键字: FPGA 核心板 开发板

高 I/O、低功耗及先进的安全功能,适用于成本敏感型边缘应用

关键字: FPGA I/O 机器视觉

本文讨论如何为特定应用选择合适的温度传感器。我们将介绍不同类型的温度传感器及其优缺点。最后,我们将探讨远程和本地检测技术的最新进展如何推动科技进步,从而创造出更多更先进的温度传感器。

关键字: 温度传感器 CPU FPGA
关闭