FPGA之旅设计99例之第九例-----驱动0.96寸OLED屏

news/2024/10/20 13:33:57/

一. 简介

这是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用来存储显示的数据。

(一).OLED的存储区域

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

在这里插入图片描述

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

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

(二).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@(*)
begincase(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};endcase
end

六. 向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 IICoutput		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)
beginif(rst_n == 1'b0)state <= OLED_INIT;elsestate <= next_state;
end
always@(*)
begincase(state)OLED_INIT:if(init_finish == 1'b1)next_state <= OLED_IDLE;elsenext_state <= OLED_INIT;OLED_IDLE:next_state <= OLED_IDLE;default: next_state <= OLED_INIT;endcase
end
OLED_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就结束啦!

gzh回复 FPGA之旅设计99例之第九例 获取工程文件


http://www.ppmy.cn/news/665371.html

相关文章

Arduino--Mixly-数位计及1602屏亮度显示

Mixly-数位计及1602屏亮度显示 硬件&#xff1a;Arduino、LED灯、数位计、1602屏 软件&#xff1a;Mixly IDE 原理&#xff1a; 1.使用数位计实现旋钮调灯亮度功能。 2.使用1602屏实现实时显示灯的当前亮度功能。 #include <LiquidCrystal_SoftI2C.h> #include <Sof…

ESP HMI 智能屏方案介绍

​ 随着智能化设备的普及&#xff0c;现代化的人机交互&#xff08;HMI&#xff09;取代了传统的按钮和开关&#xff0c;允许用户通过轻触屏幕或语音来控制其他设备。乐鑫充分发挥 ESP32 系列芯片在人机交互领域的能力&#xff0c;面向各垂直市场&#xff0c;推出单芯片 HMI 智…

机器学习13: 使用 TensorFlow 进行二元分类(Binary Classification)编程实践

在【机器学习6】和【机器学习9】中&#xff0c;我们使用 TensorFlow 进行了“线性回归模型”和“组合特征”编程实践。本质上&#xff0c;其中采用的都是回归模型&#xff0c;也就是说&#xff0c;我们创建了产生浮点预测的模型&#xff0c;比如“这个社区的房子要花 N 千美元。…

拧螺丝需求:递归算法的极致应用

前言 在一个平平无奇的下午&#xff0c;接到一个需求&#xff0c;需要给公司的中台系统做一个json报文重组的功能。 因为公司的某些业务需要外部数据的支持&#xff0c;所以会采购一些其它公司的数据&#xff0c;而且为了保证业务的连续性&#xff0c;同一种数据会采购多方的数…

游戏平台 在线无限畅玩 支持 手机电脑 多端模式 官服 BT 满V GM版本

http://h5.zyttx.com 游戏平台 在线无限畅玩 支持 手机电脑 多端模式 官服 BT 满V GM版本 http://1.gmsyb.com 官服 BT 满V GM版本手游招CPS代理 50%分成 日结 自动开代理后台 群956018737只需要分享给玩家立即享受收益 h5游戏放CPS合作&#xff0c;寻平台公众号联运合作&#…

一个游戏大量合服代表什么_网游合服对于这个网游意味着什么?

展开全部 合服意味着这两个服务区人数不多啊62616964757a686964616fe58685e5aeb931333365643662&#xff0c;这个应该谁多知道啊&#xff01;当一个老区开了太久了玩家流失严重&#xff0c;让继续在老区玩的玩家体验很差&#xff0c;所以选择合区来增加一个区的玩家数量&#x…

【H5网游服务端】决战魔域H5一键即玩服务端+授权GM后台+外网教程

下载链接&#xff1a;https://pan.baidu.com/s/1ds_xFq1Rd1_xC4515BRGXw 提取码&#xff1a;soho 【决战魔域H5】一键即玩服务端授权GM后台外网教程

手机网游研究之一

不知道是MS推出了新技术对我的引导还是自己一直认为自己要有所人生的突破的源由,想开发一 套ERP系统,以后没有钱了好坐在家里卖(~_~),想开发一些基于条形码系列的软件,因为最近两年都是在修 改与条码枪与PLC有关的自动化控制方向的软件系统,但感觉这方便技术已经比较成熟且新…