oled初始化程序
FPGA驱动OLED动态显示(Verilog代码)——OLED初始化
FPGA驱动OLED动态显⽰(Verilog代码)——OLED初始化/*--------------------------------------------------------------*\Filename : initial_control.vAuthor : CwangDescription :Revision History : 2017-10-16Revision 1.0Email : wangcp@Company : Micro nano instituteCopyright(c) 2017,Micro nano institute,All right resered\*---------------------------------------------------------------*/module initial_control(clk_1m,rst_n,initial_start,spi_write_done,spi_write_start,spi_data,initial_done,res_oled //OLED的RES脚⽤来复位,低电平复位);input clk_1m;input rst_n;input initial_start;input spi_write_done;output spi_write_start;output [9:0] spi_data;output initial_done;output reg res_oled;//--------------------------------------//复位OLEDparameter RES100MS = 20'd100000;reg [19:0] count;reg res_done;always @(posedge clk_1m or negedge rst_n)beginif(!rst_n)begincount <= 20'd0;res_oled <= 1'b0;res_done <= 1'b0;endelseif(count == RES100MS)beginres_oled <= 1'b1;res_done <= 1'b1;count <= RES100MS;endelsebegincount <= count + 1'b1;res_oled <= 1'b0;res_done <= 1'b0;endend//--------------------------------------reg [7:0] i;reg start;reg [9:0] data;reg isdone;//--------------------------------------------------------always@(posedge clk_1m or negedge rst_n)beginif(!rst_n)begini <= 8'd0;start <= 1'b0;isdone <= 1'b0;data <= {2'b11,8'd0};endelsebeginif(initial_start && res_done)begincase(i)//------------------------------------------------------------------------------------- 8'd0:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'hae}; start <= 1'b1;end8'd1:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'h00}; start <= 1'b1;end 8'd2:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'h10}; start <= 1'b1;end8'd3:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'h40}; start <= 1'b1;end8'd4:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'h81}; start <= 1'b1;end8'd5:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'hCF}; start <= 1'b1;end8'd6:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'hA1}; start <= 1'b1;end8'd7:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'hC8}; start <= 1'b1;end8'd8:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'hA6}; start <= 1'b1;end8'd9:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'hA8}; start <= 1'b1;end8'd10:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'h3F}; start <= 1'b1;end8'd11:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'hD3}; start <= 1'b1;end8'd12:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'h00}; start <= 1'b1;end8'd13:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'hD5}; start <= 1'b1;end8'd14:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'h80}; start <= 1'b1;end8'd15:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'hD9}; start <= 1'b1;end8'd16:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'hF1}; start <= 1'b1;end8'd17:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'hDA}; start <= 1'b1;end 8'd18:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'h12}; start <= 1'b1;end8'd19:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'hDB}; start <= 1'b1;end 8'd20:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'h40}; start <= 1'b1;end8'd21:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'h20}; start <= 1'b1;end8'd22:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'h02}; start <= 1'b1;end8'd23:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'h8D}; start <= 1'b1;end8'd24:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'h14}; start <= 1'b1;end8'd25:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'hA4}; start <= 1'b1;end8'd26:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'hA6}; start <= 1'b1;end8'd27:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'hAF}; start <= 1'b1;end//--------------------------------------------------------------------------------8'd28:begindata <= {2'b11,8'd0}; isdone <= 1'b1; i <= i + 1'b1;end8'd29:beginisdone <= 1'b0; i <= 8'd0;endendcaseendendendassign spi_data = data;assign spi_write_start = start;assign initial_done = isdone;endmodule注释:1、以上初始化数据是针对驱动芯⽚SSD1306,128*64的OLED;2、应该先复位OLED;3、初始化之后应该将⽚选CS置⾼,如8'd28:data <= {2'b11,8'd0};。
OLED模块使用说明
7.6 系统显示设计控制系统显示常用的显示器件有数码管、LCD、OLED等。
OLED即有机发光二极管(Organic Light Emitting Diode),其同时具备自发光,不需背光源、对比度高、制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。
本节主要介绍OLED的工作原理、底层驱动代码编写以及如何通过取模软件显示任何自己想要显示的文字或者图片。
7.6.1 OLED显示原理如图4所示为0.96寸OLED显示模块,其分辨率为128*64,采用4线SPI接口方式,模块的接口定义如表1所示。
图4 0.96寸OLED显示模块种并行接口方式、3线或4线SPI接口方式、IIC接口方式。
这里介绍OLED模块4线SPI 通信方式,只需4根通信线就能实现对OLED模块的显示控制,这4根线为:D0、D1、DC、CS。
如图5所示为4线SPI写操作时序图,在4线SPI模式下,每个数据长度均为8位,也即为1个字节。
每次发送该字节数据前,如果该字节数据为指令号,则将DC管脚拉低;如果该字节数据为普通数据,则将DC管脚置高。
在SCLK上升沿,数据从SDIN移入SSD1306,并且高位在前。
SSD1306的显存总共为128*64bit大小,SSD1306将这些显存分为8页,其对应关系如表2所示。
可见OLED水平像素分为128段,即SEG0~SEG127;垂直像素平分为8页,也即垂直方向每8个像素点为1页。
从而可见,在确定显示的位置后,通过往显存中写入一个字节数据,则相应的SEG将按照数据进行显示,位数据为1时,相应像素点被点亮,位数据为0时,相应的像素点熄灭。
图5 4线SPI写操作时序图令较多,具体的可以参考相关手册,这里介绍如表3所示几个比较常用的指令。
命令,随后发送的一个字节为要设置的对比度的值。
这个值设置得越大屏幕就越亮。
第二个命令为 0XAE/0XAF。
0XAE 为关闭显示命令; 0XAF 为开启显示命令。
2.42寸OLED显示屏1309驱动编程指南 程序 说明书
2015-02-26
0.2xVDD V 0.3 mA
图 4. 从 CPU 写到 SSD1306(Writing Data from CPU to SSD1306)
6.2 串行接口:时序要求(AC 参数):
写数据到 SSD1306 的时序要求:
表 4.
项目
符号
测试条件
极限值
单位
MIN
TYPE MAX
4线 SPI串口时钟周期
●128*64 点阵单色图片; ●可选用 16*16 点阵或其他点阵的图片来自编汉字,按照 16*16 点阵汉字来计算可显示 8 字/行*4 行。按照 12*12 点阵汉字来计算可显示 10 字/行*4 行。 2.5 指令功能强:可组合成各种输入、显示、移位方式以满足不同的要求; 2.6 接口方式: 3 线 SPI 串行接口、4 线 SPI 串行接口、并口、I2C 接口。 2.7 工作温度宽:-20℃ - 70℃; 2.8 储存温度宽:-30℃-80℃; 2.9 底色可选:蓝色、白色、黄色、绿色。
11
000001 6 位电压值数据,0~63 共 64 级
101110 1
100011
设置内部电阻微调,可以理解为微调对比度 值,此两个指令需紧接着使用。上面一条指 令 0x81 是不改的,下面一条指令可设置范 围为:0x00~0xFF,数值越大对比度越浓, 越小越淡 静态图标的开关设置: 0xAE: 关, 0xAF: 开。 此指令在进入及退出睡眠模式时起作用 省电模式,此非一条指令,是由“(10)显示 全部点阵”、 (19)静态图标显示:开/关等 指令合成一个“省电功能”。详细看 IC 规 格书 “POWER SAVE”部分 空操作
Tscyc
引脚:SCK
stm32oled初始化代码
stm32oled初始化代码以下是STM32OLED屏幕初始化代码的示例(假设使用I2C通信):```c#include <Wire.h>#include <Adafruit_GFX.h>#include <Adafruit_SSD1306.h>#define OLED_RESET 4#define SCREEN_WIDTH 128#define SCREEN_HEIGHT 64Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);void setup() {Wire.begin();display.begin(SSD1306_SWITCHCAPVCC, 0x3C);display.clearDisplay();display.setTextColor(WHITE);display.setCursor(0,0);display.setTextSize(2);display.println("Hello World!");display.display();}void loop() {// Do nothing in the loop}```该代码使用Adafruit_GFX和Adafruit_SSD1306库来与屏幕通信。
我们将Wire对象传递给Adafruit_SSD1306的构造函数,以在I2C通信中传输数据。
在设置函数中,我们使用begin()函数初始化屏幕,并使用SSD1306_SWITCHCAPVCC来设置其工作电压。
接下来,我们清除屏幕并将光标移动到左上角,在打印“Hello World!”时使用setTextColor()和setTextSize()设置文本属性。
最后,我们使用display()函数来显示整个缓冲区中的内容。
在主循环中,我们没有做任何事情,因为显示内容已经显示,并且不需要刷新或更新。
维信诺25664oled屏应用笔记
维信诺25664oled屏应用笔记屏的初始化可以参考<维信诺25664IC_Init.c>,特别注意初始化程序在使用Set Re-map & Dual COM Line Mode (A0h)命令时,后跟(0x14)(0x11)设置对应的是屏正视图放置时左上方为起始行和起始列,半字节倒序。
下图所示为GDDRAM布局图,从图中可知,该屏的行(com)布线是反向的,即以厂家给出的(0x14)设置驱动时从屏正视图看去,行COM0在最上方,SEG3~0在最左方,屏幕以水平地址增量模式写入横向取模,字节正序的汉字字模时,字体相对屏正视图正向显示,且行和列的地址指针也相对正向增加;反之以(0x06)设置时行COM0在屏正视图最下方,SEG3~0在屏正视图最右方,如与(0x14)设置时一样以相同的方式取相同的字模,字体相对屏正视图反向显示,且行和列的地址指针也反向增加。
(以数据线和驱动芯片朝下为正视图方向)从上面这段阐述可以得到一个经验,即如何在datasheet中没有明确表述时确定显示屏行和列的分布方式呢?其实一般从厂商给出的初始化代码中对驱动芯片的设置就能看出来了。
从上图中可知,每个行地址(COM)对应一行,每个列地址(Column address)对应四个像素列(SEG),写入时先用set column address确定起始列和终止列,再用set row address确定起始行和终止行。
由于驱动芯片的分辨率大于屏分辨率,所以从厂商初始代码可知,屏的实际行地址范围和列地址范围分别为(0x00,0x3F)、(0x1C,0x5B),转换为十进制数即分别为(0~63)、(28~91)。
同ssd1305一样,上述两条命令在给出写入地址的同时,也将相应的行指针和列指针调整到给出的起始地址位置。
在写入时,当地址设置好后,就可对相应区域写入数据了,每字节数据的高半和低半四位二进制数分别对应一个像素点,每个像素点可通过此四位二进制数实现十六级灰度,根据上述每个列地址对应四个像素列,每个像素需要四位二进制数来点亮,那么,也就是说,每写入两个字节的数据,列地址指针自动加一。
OLED显示屏 SH1106的初始化数据
/***********************OLED128*64_SH1106初始化*****************************/void Initial_OLED12864_SH1106() //OLED初始化{delay_50ms(2); //延时100msWrite_IIC_Command(0xAE); //Display OFF/ON//显示关/开(OLED关闭显示:AEH,OLED开启显示:AFH)Write_IIC_Command(0x02); //Set Column Address 4 lower bits 设置列地址低4位(00H--0FH)(0 0 0 0 A3 A2 A1 A0)Write_IIC_Command(0x10); //Set Column Address 4 higher bits 设置列地址高4位(10H--17H)(0 0 0 1 A7 A6 A5 A4)Write_IIC_Command(0xB0); //Set Page Address//设置页面地址(1页:B0H,2页:B1H,3页:B2H,4页:B3H,5页:B4H,6页:B5H,7页:B6H)Write_IIC_Command(0x40); //Set Display Start Line 设置显示开始行Write_IIC_Command(0xA1); //Set Segment Re-map (ADC) 设置段重新映射(ADC)(正向:A0H, 反向A1H)Write_IIC_Command(0xA7); //Set Normal/ Reverse Display//设置正常/反白显示(正常显示:A6H,反白显示:A7H)Write_IIC_Command(0xA8); //Multiplex Ration Mode Set //多路分配模式设置Write_IIC_Command(0x3F); //Multiplex Ratio Data Set//多路复用率数据设置(1:00H, 2:02H,3:03H,······63:3EH,64:3FH)Write_IIC_Command(0xA4); //Set Entire Display OFF/ON//设置全屏显示关/开(正常显示:A4H,全屏显示:A5H)Write_IIC_Command(0xD3); //Display Offset Mode Set 显示偏移模式设置Write_IIC_Command(0x00); //Display Offset Data Set//显示偏移数据设置(COM0:00H, COM1:02H, COM2:03H, ······COM62:3EH, COM63:3FH)Write_IIC_Command(0xD5); //Divide Ratio/Oscillator Frequency Mode Set 分频比/振荡器频率模式设置Write_IIC_Command(0x50); // Divide Ratio/Oscillator Frequency Data Set//分频比/振荡器频率数据设置(80H:+15%, 50H:0%)//(详细介绍参见:中景园1.3寸OLED显示屏_驱动芯片手册.pdf Command15 驱动芯片:SH1106)Write_IIC_Command(0xAD); //DC-DC Control Mode Set 直流-直流转换器电源控制方式设置(打开)Write_IIC_Command(0x8B); //DC-DC ON/OFF Mode Set//直流-直流转换器电源开/关模式设置(直流-直流转换器电源禁用:8AH,显示时直流-直流转换器电源将会打开:8BH)Write_IIC_Command(0xC8); //Set Common Output Scan Direction//设置公用输出扫描方向(从COM0向COM[N-1]扫描:C0H,从COM[N-1]向COM0扫描:C8H)Write_IIC_Command(0xD9); //Pre-charge Period Mode Set 预充电周期模式设置Write_IIC_Command(0x22); //Dis-charge /Pre-charge Period Data Set//无充电/预充电周期数据设置//(详细介绍参见:中景园1.3寸OLED显示屏_驱动芯片手册.pdf Command16 驱动芯片:SH1106)Write_IIC_Command(0xDA); //Common Pads Hardware Configuration Mode Set 常见的引脚硬件配置模式设置Write_IIC_Command(0x12); //Sequential/Alternative Mode Set//顺序/替代模式设置(顺序:02H,替代:12H)//(详细介绍参见:中景园1.3寸OLED显示屏_驱动芯片手册.pdf Command17 驱动芯片:SH1106)Write_IIC_Command(0x81); //The Contrast Control Mode Set 对比度控制模式设置Write_IIC_Command(0x79); //Contrast Data Register Set//对比数据寄存器设置(ISEG Small:00H, Large:FFH, 不使用此功能:80H)Write_IIC_Command(0xDB); //VCOM Deselect Level Mode Set VCOM取消级别模式设置Write_IIC_Command(0x35); //VCOM Deselect Level Data Set//VCOM取消级数据设置(VCOM=0.430*VREF:00H,VCOM=0.770*VREF:35H,VCOM=1*VREF:40H)//(详细介绍参见:中景园1.3寸OLED显示屏_驱动芯片手册.pdf Command18 驱动芯片:SH1106)Write_IIC_Command(0x32); //Set Pump voltage value//设置泵电压值Vpp(30H:6.4V, 31H:7.4V, 32H:8.0V33H:9.0V)delay_1ms(1); //延时1msWrite_IIC_Command(0xAF); //Display OFF/ON//显示关/开(OLED关闭显示:AEH,OLED开启显示:AFH)delay_50ms(2); //延时100ms}。
OLED屏的驱动及使用
OLED屏的驱动与使用文/杜洋【OLED时代来了】一提到OLED,我想无人不知。
智能手机的迅猛发展,使得屏幕显示技术不断推陈出新。
虽然最新报出三星将产量更新颖的QLED屏幕,但在没有上市之前智能手机屏幕从显示原理上仍只有LCD和OLED两种。
在三星和LG两家公司的高端手机上都采用了OLED屏幕,其他手机生产商还是采用传统的LCD屏幕。
其两者最大的区别就是:LCD屏幕是由灯管或LED做背光照明,再通过LCD屏通过或阻断光线达到显示目的。
OLED是有机发光二极管,它和我们常用的LED 是近亲。
OLED不需要背光灯,其上面每一个像素点都能独立发光。
综合来看OLED显示技术功耗更低、效果更有优势。
我曾用过一款手机,采用的是SUPER OLED屏幕,无论从色彩还是可视角度都非常出众。
不过现在仅有几家大公司才能生产OLED屏幕,产量不足,价格昂贵。
OLED屏供应手机市场都不足够,作为一名电子爱好者更不敢奢求有一天能亲手把玩它了。
记得3年前,我在北京工作的时候,就曾在电子市场看到久闻未见的OLED屏幕。
之所以让我一眼就识别出来,是因那柜台里每一块屏幕都只是一片薄薄的玻璃,发着光的文字和图案在上面不停切换,周围没有背光灯,没有电路板,只有一片玻璃。
旁人也许并无感想,但对我这个电子发烧友来说,这种震撼不亚于第一次看到没有“大包”的液晶电视。
站在柜台前看了半天,老板见势走过来。
我指着那片1元硬币大小的屏幕问多少钱,老板一本正经地说:“这款小的便宜,你要多少?”我说只要1个。
他有些不太高兴的说:“一个呀,280元”。
听闻此言,二话没说,转身就跑。
只是一块单色的小屏幕,如果是LCD液晶屏顶多80元,就因为是OLED就多出200元。
可是又忍不住对它的神奇所吸引,好想能早点把玩。
时间是把无情刀,能杀人,也能杀价。
如今的OLED技术已经广泛被使用,产量高了,价格自然就降低了。
从前上百元的OLED屏幕,现在只要几十元。
还有各种尺寸大小、颜色和分辨率。
液晶初始化程序
/*******************************************
函数名称:write_cmd
功能:向液晶中写控制命令
参数:cmd--控制命令
返回值:无
********************************************/
void write_cmd(uchar cmd)
void Clear_GDRAM(void)
{
uchar i,j,k;
write_cmd(0x34); //打开扩展指令集,关闭绘图显示
i = 0x80;
for(j = 0;j < 32;j++)
{
write_cmd(i++); //写入垂直坐标Y,垂直坐标共有32个(0—31);
write_cmd(0x80); //写入水平坐标X,水平坐标共有8个(0-7),每次只能写一半,所以要循环16次。
LCD_EN=0;
}
/*******************************************
函数名称:write_data
功能:向液晶中写显示数据
参数:dat--显示数据
返回值:无
********************************************/
void write_data(uchar dat)
应用程序初始化失败无法初始化应用程序应用程序正常初始化lcd初始化程序应用程序初始化安装程序无法初始化程序初始化失败cf应用程序初始化运用程序初始化失败lcd1602初始化程序
#include<reg52.h>
#define uchar unsigned char
晶联讯电子OLED显示模块JLX12864OLED-096X-PC-IIC带字库IC的编程说明书
JLX12864OLED-096X-PC-IIC带字库IC的编程说明书目 录序号 内 容 标 题 页码1 概述 22 字型样张: 33 外形尺寸及接口引脚功能 4~54 工作电路框图 55 指令 6~86 字库的调用方法 9~177 硬件设计及例程: 18~尾页1.概述JLX12864OLED-096X-PC-IIC型OLED显示模块既可以当成普通的图像型液晶显示模块使用(即显示普通图像型的单色图片功能),又含有JLX-GB2312字库IC,可以从字库IC中读出内置的字库的点阵数据写入到LCD驱动IC中,以达到显示汉字的目的。
此字库IC存储内容如下表所述:2.字型样张:3.外形尺寸及接口引脚功能3.1外形图:图1.外形尺寸3.2模块的接口引脚功能引 线 号 符 号 名 称功 能1 ROM_IN 字库IC 接口 SI串行数据输入 详见字库 IC:JLX-GB2312 说明 书: ROM_IN 对应字库 IC 接口 SI, ROM_OUT 对应 SO, ROM_SCK 对应 SCLK, ROM_CS 对应 CS#2 ROM_OUT 字库IC 接口 SO 串行数据输出3 ROM_SCK 字库IC 接口 SCLK 串行时钟输入4 ROM_CS 字库IC 接口 CS# 片选输入5 VSS 接地 0V6 VDD 电源电路 2.7V—5.0V7 SCK I/0 串行时钟 8SDAI/0串行数据表1:模块串行接口引脚功能4.基本原理4.1OLED 屏(LCD)在LCD 上排列着128×64 点阵,128个列信号与驱动IC 相连,64个行信号也与驱动IC 相连,IC 邦定在LCD 玻璃上(这种加工工艺叫COG).电路框图图2.JLX12864OLED-096X-PC-IIC5.指令:5.1 字库IC(JLX-GB2312)指令表Read Data Bytes(一般读取):Read Data Bytes at Higher speed(快速读取):5.2 LCD驱动IC指令表详见“JLX12864OLED-096X-PN-IIC”的中文说明书6.4附录6.4.1 GB2312 1区(376字符)6.4.2 8×16点国标扩展字符7. 硬件设计及例程:7.1用户所编的显示程序,开始必须进行初始化,否则模块无法正常显示,过程请参考程序7.1.1硬件接口:下图为串行方式的硬件接口:7.2程序:// OLED演示程序// OLED模块型号:JLX12864OLED-096X-PC-IIC,IIC接口!// 资料(源程序、驱动手册、使用说明书等)销售统一发#include <reg52.H>//======================================================sbit lcd_scl =P1^1; //接口定义:lcd_sclk就是LCD的SCLK //SCLK接到“D0”脚 sbit lcd_sda =P1^0; //接口定义:lcd_sda就是LCD的SDA //SDIN接到“D1”脚sbit Rom_OUT=P1^4; /*字库IC接口定义:Rom_OUT就是字库IC的SO*/sbit Rom_IN=P1^5; /*字库IC接口定义:Rom_IN就是字库IC的SI*/sbit Rom_SCK=P1^3; /*字库IC接口定义:Rom_SCK就是字库IC的SCK*/sbit Rom_CS=P1^2; /*字库IC接口定义Rom_CS就是字库IC的CS#*/sbit key=P2^0; //定义一个按键:P2.0口与GND之间接一个按键//=======================================================#define uchar unsigned char#define uint unsigned int#define ulong unsigned longuchar code jiong1[]={/*-- 文字: 囧 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xFE,0x82,0x42,0xA2,0x9E,0x8A,0x82,0x86,0x8A,0xB2,0x62,0x02,0xFE,0x00,0x00, 0x00,0x7F,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x7F,0x00,0x00}; uchar code lei1[]={/*-- 文字: 畾 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x80,0x80,0x80,0xBF,0xA5,0xA5,0xA5,0x3F,0xA5,0xA5,0xA5,0xBF,0x80,0x80,0x80,0x00, 0x7F,0x24,0x24,0x3F,0x24,0x24,0x7F,0x00,0x7F,0x24,0x24,0x3F,0x24,0x24,0x7F,0x00}; //延时void delay(int i){int j,k;for(j=0;j<i;j++)for(k=0;k<110;k++);}//短延时void delay_us(int i){int j,k;for(j=0;j<i;j++)for(k=0;k<1;k++);}//等待按键:P2.0口与GND之间接一个按键void waitkey(){repeat: if(key==1) goto repeat;else delay(3000);}void start_flag(){lcd_scl=1;delay_us(1);lcd_sda=1;delay_us(1);lcd_sda=0;delay_us(1);lcd_scl=0;delay_us(1);}void stop_flag(){lcd_scl=0;delay_us(1);lcd_sda=0;lcd_sda=1;delay_us(1);lcd_scl=1;delay_us(1);}//传8位指令或数据到OLED显示模块 void transfer(uchar data1){unsigned char j;for(j=0;j<8;j++){lcd_scl=0;if(data1&0x80) lcd_sda=1; elselcd_sda=0;lcd_scl=1;lcd_scl=0;data1<<=1;// delay_us(1);}lcd_sda=0;lcd_scl=0;lcd_scl=1;}//写指令到OLED显示模块void transfer_command(uchar com) {start_flag();transfer(0x78);transfer(0x00);transfer(com);stop_flag();}//写数据到OLED显示模块void transfer_data(uchar dat){start_flag();transfer(0x78);transfer(0x40);transfer(dat);stop_flag();}//OLED显示模块初始化void initial_lcd(){transfer_command(0xae); //关显示transfer_command(0xd5); //晶振频率transfer_command(0x80);transfer_command(0xa8); //duty设置transfer_command(0x3f); //duty=1/64transfer_command(0xd3); //显示偏移transfer_command(0x00);transfer_command(0x40); //起始行transfer_command(0x8d); //升压允许transfer_command(0x14);transfer_command(0x20); //page address modetransfer_command(0x02);transfer_command(0xc8); //行扫描顺序:从上到下transfer_command(0xa1); //列扫描顺序:从左到右transfer_command(0xda); //sequential configurationtransfer_command(0x12);transfer_command(0x81); //微调对比度,本指令的0x81不要改动,改下面的值transfer_command(0xcf); //微调对比度的值,可设置范围0x00~0xfftransfer_command(0xd9); //Set Pre-Charge Periodtransfer_command(0xf1);transfer_command(0xdb); //Set VCOMH Deselect Leveltransfer_command(0x40);transfer_command(0xaf); //开显示}void lcd_address(uchar page,uchar column){column=column-1; //我们平常所说的第1列,在LCD驱动IC里是第0列。
单片机oled显示程序设计流程
单片机oled显示程序设计流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!1. 硬件连接:将 OLED 显示屏与单片机连接。
通常,OLED 显示屏使用 SPI 或 I2C 接口与单片机进行通信。
OLED显示模块(原理讲解、STM32实例操作)
OLED显⽰模块(原理讲解、STM32实例操作)⼀、OLED的基础介绍OLED的定义和优势OLED,即有机发光⼆极管(Organic Light-Emitting Diode),⼜称为有机电激光显⽰(Organic Electroluminesence Display, OELD)。
OLED由于同时具备⾃发光,不需背光源、对⽐度⾼、厚度薄、视⾓⼴、反应速度快、可⽤于挠曲性⾯板、使⽤温度范围⼴、构造及制程较简单等优异之特性,被认为是下⼀代的平⾯显⽰器新兴应⽤技术。
OLED显⽰技术具有⾃发光的特性,采⽤⾮常薄的有机材料涂层和玻璃基板,当有电流通过时,这些有机材料就会发光,⽽且OLED显⽰屏幕可视⾓度⼤,并且能够节省电能。
⼆、ALINETEK的0.96⼨OLED模块1.模块有单⾊和双⾊两种可选,单⾊为纯蓝⾊,⽽双⾊则为黄蓝双⾊。
单⾊模块每个像素点只有亮与不亮两种情况,没有颜⾊区分;2.尺⼨⼩,显⽰尺⼨为0.96⼨,⽽模块尺⼨为 27mm(长)*26mm(宽)*4mm(⾼);3.⾼分辨率,该模块的分辨率为128*64;4.多种接⼝⽅式,该模块提供了总共4种接⼝。
包括:6800、8080两种并⾏接⼝⽅式、 4线的串⾏SPI接⼝⽅式、IIC接⼝⽅式;5.不需要⾼压,直接接3.3V就可以⼯作了。
带字库,可显⽰标准的国标简体(GB2312)汉字、8*16 点 ASCII 粗体字库、7*8点 ASCII 字库、5*7 点 ASCII 字库。
6.这⾥要提醒⼤家的是,有的模块不和5.0V接⼝兼容,所以请⼤家在使⽤的时候⼀定要⼩⼼,别直接接到5V的系统上去,否则可能烧坏模块。
以上4种模式通过模块的BS0~2设置,BS0~2的设置与模块接⼝模式的关系如表所⽰:OLED模块接⼝⽅式设置表(表中:“1”代表接VCC,⽽“0”代表接GND。
)三、OLED模块实物图与原理图模块采⽤8*2的2.54排针与外部连接,总共有16个管脚,在16条线中,我们只⽤了15条,有⼀个是悬空的,除掉电源和地线占了2条,还剩下13条信号线。
arduino oled 屏幕 函数
arduino oled 屏幕函数(原创版)目录1.Arduino OLED 屏幕简介2.Arduino OLED 屏幕的功能3.Arduino OLED 屏幕的函数4.如何使用 Arduino OLED 屏幕函数5.总结正文【1.Arduino OLED 屏幕简介】Arduino OLED 屏幕是一种基于 Arduino 的开发板,它可以方便地用于显示各种信息。
OLED(Organic Light Emitting Diode,有机发光二极管)屏幕具有高对比度、低功耗和快速响应等特点,使其成为显示设备的理想选择。
【2.Arduino OLED 屏幕的功能】Arduino OLED 屏幕具有以下功能:- 显示文本和图形- 显示动画和视频- 用作简易触摸屏- 连接外部设备,如传感器和显示器【3.Arduino OLED 屏幕的函数】Arduino OLED 屏幕提供了一系列函数,用于控制屏幕的显示。
以下是一些常用的函数:- init():初始化 OLED 屏幕- drawString():在屏幕上显示文本- draw():在屏幕上绘制图形- clearDisplay():清空屏幕显示- setCursor():设置光标位置- setColor():设置显示颜色【4.如何使用 Arduino OLED 屏幕函数】要在 Arduino 项目中使用 OLED 屏幕函数,首先需要安装 Arduino OLED 库。
然后,按照以下步骤进行操作:1.定义 OLED 屏幕的大小和位置2.调用 init() 函数初始化屏幕3.使用 drawString() 和 draw() 函数显示文本和图形4.使用 clearDisplay() 和 setCursor() 函数清空屏幕和设置光标位置5.使用 setColor() 函数设置显示颜色【5.总结】Arduino OLED 屏幕为开发者提供了一个便捷的显示设备,通过各种函数可以实现丰富的显示效果。
oled初始化程序
}
void Set_Column_Address(unsigned char a, unsigned char b)
{
Write_Command(0x21); // Set Column Address
Write_Command(a); // Default => 0x00 (Column Start Address)
// 0x8E (0x00) => Select External VCC Supply
// 0x8F (0x01) => Select Internal DC/DC Voltage Converter
}
void Set_Display_On_Off(unsigned char d)
{
Write_Command(0xAE|d); // Set Display On/Off
Write_Command(0X00); // => (Dummy Write for First Parameter)
Write_Command(a); // Default => 0x80 (Contrast Control for Bank 0)
Write_Command(b); // Default => 0x80 (Brightness for Area Color Banks)
Write_Command(d); // Default => 0x80
}
void Set_Area_Brightness(unsigned char d)
{
Write_Command(0x82); // Set Brightness for Area Color Banks
OLED显示实验
OLED显示实验1.实验目的(1)掌握LM3S8962中的OLED的使用方法(2)掌握CCS开发环境平台2.实验内容(1)ARM的初始化配置(2)OLED的初始化(3)用SSI在OLED显示屏上输出字符串"Hello World!"3.硬件连接图1OLED硬件原理图OLED显示器的硬件连接如图1所示。
15V电源供电电路给OLED偏置,FAN5331 和几个外部元件一起完成高压转换。
PA7 用来控制控制器上电顺序。
OLED工作时,15V电源不能为其他器件供电。
PA2、PA5管脚配置成SSI模式,用来向OLED控制器发送数据,不能从OLED控制器读数据,因为仅需一条数据线。
PA3管脚用来输出OLED的片选信号。
PA6管脚作为OLED数据/指令控制管脚。
串行接口的时序图如图2所示。
图2 OLED中串行接口的时序图其中,t cycle:时钟周期时间、t AS:地址准备时间、t AH:地址保持时间、t CSS:片选准备时间、t CSH:片选保持时间、t DSW:写数据准备时间、t DHW:写数据保持时间、t CLKL:时钟低电平时间、t CLKH:时钟高电平时间、t R:上升时间、t F:下降时间。
在CS n为低时,微控制器被使能,在每个SCLK信号的上升沿,SDIN的数据将按照D7、D6、……、D0的顺序被移入8位的移位寄存器。
每8个时钟周期采样1次,若D/Cn被拉高,移位寄存器中的字节数据被写入GDDRAM,若D/Cn被拉低,移位寄存器中的字节数据被写入指令寄存器。
4.软件流程开始系统初始化OLED显示屏初始化调用函数RIT128x96x4StringDraw()无限循环图3 主程序流程图RIT128x96x4StringDraw()函数入口检查指定位置及灰度值是否超出边界值从指定位置处开辟一块窗口字符串中仍有字符?读取当前的字符转换字符格式使对应于位图阵列用6列8行的窗口显示字符RIT128x96x4StringDraw()函数返回YN图4 字符串显示函数流程图5.实验步骤(1)运行CCS ,添加驱动库"driverlib",打开路径"D:\LM3S8962\My Documents\boards\ek-lm3s8962",选择在OLED 上显示字符串"Hello World!"的工程"hello",单击完成添加到开发界面。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
// 0xA6 (0x00) => Normal Display
// 0xA7 (0x01) => Inverse Display On
}
void Set_Multiplex_Ratio(unsigned char d)
{
Write_Command(0xA8); // Set Multiplex Ratio
{
Write_Command(0x20); // Set Memory Addressing Mode
Write_Command(d); // Default => 0x02
// 0x00 => Horizontal Addressing Mode
// 0x01 => Vertical Addressing Mode
// D[3:0] => Display Clock Divider
// D[7:4] => Oscillator Frequency
}
void Set_Area_Color(unsigned char d)
{
Write_Command(0xD8); // Set Area Color Mode On/Off & Low Power Display Mode
// 0xC8 (0x08) => Scan from COM63 to 0
}
void Set_Display_Offset(unsigned char d)
{
Write_Command(0xD3); // Set Display Offset
Write_Command(d); // Default => 0x00
Write_Command(0xAC); // Set Display On in Dim Mode
}
void Set_Master_Config(unsigned char d)
{
Write_Command(0xAD); // Set Master Configuration
Write_Command(0x8E|d); // Default => 0x8E
// 0xA1 (0x01) => Column Address 0 Mapped to SEG131
}
void Set_Entire_Display(unsigned char d)
{
Write_Command(0xA4|d); // Set Entire Display On / Off
// Default => 0xA4
}
void Set_Read_Modify_Write(unsigned char d)
// 0x02 => Page Addressing Mode
}
void Set_Column_Address(unsigned char a, uns0x21); // Set Column Address
Write_Command(a); // Default => 0x00 (Column Start Address)
Write_Command(0X00); // => (Dummy Write for First Parameter)
Write_Command(a); // Default => 0x80 (Contrast Control for Bank 0)
Write_Command(b); // Default => 0x80 (Brightness for Area Color Banks)
}
void Set_Display_Clock(unsigned char d)
{
Write_Command(0xD5); // Set Display Clock Divide Ratio / Oscillator Frequency
Write_Command(d); // Default => 0x70
// 0xA4 (0x00) => Normal Display
// 0xA5 (0x01) => Entire Display On
}
void Set_Inverse_Display(unsigned char d)
{
Write_Command(0xA6|d); // Set Inverse Display On/Off
// Disable COM Left/Right Re-Map
}
void Set_VCOMH(unsigned char d)
{
Write_Command(0xDB); // Set VCOMH Deselect Level
Write_Command(d); // Default => 0x34 (0.77*VCC)
// Patterns
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void Write_Command(unsigned char Command) //OLED_IP WRITE COMMAND
Write_Command(0x40|d); // Set Display Start Line
// Default => 0x40 (0x00)
}
void Set_Contrast_Control(unsigned char d)
{
Write_Command(0x81); // Set Contrast Control for Bank 0
}
void Set_Common_Config(unsigned char d)
{
Write_Command(0xDA); // Set COM Pins Hardware Configuration
Write_Command(0x02|d); // Default => 0x12 (0x10)
// Alternative COM Pin Configuration
Write_Command(d); // Default => 0x3F (1/64 Duty)
}
void Set_Dim_Mode(unsigned char a, unsigned char b)
{
Write_Command(0xAB); // Set Dim Mode Configuration
{
IOWR(OLED_BASE,0,Command);
}
void Write_Data(unsigned char data) //OLED_IP WRITE DATA
{
IOWR(OLED_BASE,1, data);
}
void uDelay(unsigned char l)
{
while(l--)
usleep(1);
}
void Set_Segment_Remap(unsigned char d)
{
Write_Command(0xA0|d); // Set Segment Re-Map
// Default => 0xA0
// 0xA0 (0x00) => Column Address 0 Mapped to SEG0
Write_Command(d); // Default => 0x00 (Monochrome Mode & Normal Power Display Mode)
}
void Set_Precharge_Period(unsigned char d)
{
Write_Command(0xD9); // Set Pre-Charge Period
// Default => 0xB0 (0x00)
}
void Set_Common_Remap(unsigned char d)
{
Write_Command(0xC0|d); // Set COM Output Scan Direction
// Default => 0xC0
// 0xC0 (0x00) => Scan from COM0 to 63
// Default => 0x00
Write_Command(0x10+d/16); // Set Higher Column Start Address for Page Addressing Mode
// Default => 0x10
}
void Set_Addressing_Mode(unsigned char d)
// 0x8E (0x00) => Select External VCC Supply
// 0x8F (0x01) => Select Internal DC/DC Voltage Converter
}
void Set_Display_On_Off(unsigned char d)
{
Write_Command(0xAE|d); // Set Display On/Off
// Instruction Setting
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void Set_Start_Column(unsigned char d)
{
Write_Command(0x00+d%16); // Set Lower Column Start Address for Page Addressing Mode