如何使用FPGA驱动OLED屏幕_第1页
如何使用FPGA驱动OLED屏幕_第2页
如何使用FPGA驱动OLED屏幕_第3页
如何使用FPGA驱动OLED屏幕_第4页
如何使用FPGA驱动OLED屏幕_第5页
已阅读5页,还剩3页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

如何使用FPGA驱动OLED屏幕一.简介

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

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

1OLED的存储区域

这块存储区域分为8个page,每个page下面共有128bit,如下图所示这就难免会有些疑问了,128×8,不应该是128×64嘛?8个page,为什么是64行呢?数据写入的呢?每一个page包括8行,所以说8个page共有64行。IIC每次发送数据的时候,是发送一个byte的,也就是8bit,这8bit数据会存储到某一列的八行中,例如图中SEG0区域,是第一列的头八行。这样GRAM的存储区域就弄懂了。

2OLED的数据存储模式当我们向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:设置列地址的低四位,默认为0x000x10-0x1F:设置列地址的高四位,默认为0x100xB0-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顶层模块moduleOLED_Top(

input

sys_clk,

input

rst_n,

//OLEDIIC

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;assigninit_req=(state==OLED_INIT)?1'b1:1'b0;always@(posedgesys_clkornegedgerst_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_InitOLED_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_DriverIIC_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

(IICWrite

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论