51驱动SSD1306OLED显示屏(详细教程)

2022.7.3更新:分享一下文件自取

链接:https://pan.baidu.com/s/1oEu-XXo5MCHzxKD0NWpjbA 
提取码:4a42


以下为原文:

前几天买了个0.96寸的OLED显示屏,商家说支持I2C和SPI通信,就想着应该比较简单,于是兴冲冲准备大干一场。然而发现好像并没有想象中那么简单,还是有很多要点需要了解,下面细说。

首先拿到SSD1306后,接上GND,VCC,SCL,SDA四条线后,屏幕是不会自动亮起的,需要CPU写入数据驱动它显示。查阅SSD1306的手册,我们可以发现与其通信的方式。在这里我们使用的是I2C通信方式:

  1. 起始信号
  2. 写入芯片地址,一般为0x78或者0x7a
  3. 应答信号
  4. 写入控制命令(D/C#)选择数据模式(0x40)/控制模式(0x00)
  5. 应答信号
  6. 写入数据/控制字(一个字节)
  7. 应答信号
  8. 结束信号

 由于一开始我们需要初始化SSD1306,因此我们需要先写入一些控制字来命令SSD1306的工作模式。鉴于指令集网上的中文手册中已有许多资料,这里不再赘述,只简单介绍一些用到的指令。

OLED_WR_Byte(0xAE,OLED_CMD);//开启OLED屏显示

 以上是开启OLED屏关闭的命令,0xAE是控制字,OLED_CMD是写入命令。以下同理,便不再赘述

OLED_WR_Byte(0x00,OLED_CMD);//设置列起始地址的高位
OLED_WR_Byte(0x10,OLED_CMD);//设置列起始地址的低位
OLED_WR_Byte(0xB0,OLED_CMD);//设置目标显示位置页的起始地址

 这三行代码用来控制显示的位置。这里就必须提一下SSD1306的内存地址模式,因为不同的模式下写入相同的数据输出的图像不同。SSD1306中有三种不同的内存地址模式:页地址模式,水平地址模式,垂直地址模式。

这里我们使用的是页地址模式,其结构如下所示:

可以看到,这是128*64的显示屏,其中横向分为128段(列),竖向分为8页,每页有8行。选择页地址模式后,数据的填充如下所示:

在用户定义的地址写入数据后,列地址会自动加1,写完最后一列后,列地址指针会重置为列开始地址,而页地址不会变。至此,我们就很好理解上述的三行命令,其中0x00和0x10设置了列起始地址为0,而0xb0则设置了页起始地址为0。

OLED_WR_Byte(0x81,OLED_CMD); //设置显示的对比度(00H~FFH)
OLED_WR_Byte(0xFF,OLED_CMD);//对比度为256
OLED_WR_Byte(0xA1,OLED_CMD);/设置Segment重映射
OLED_WR_Byte(0xA6,OLED_CMD);//设置正常显示
OLED_WR_Byte(0xA8,OLED_CMD);//设置复用率(16~63)
OLED_WR_Byte(0x3F,OLED_CMD);//设置复用率为63
OLED_WR_Byte(0xC8,OLED_CMD);//设置COM输出扫描方向
OLED_WR_Byte(0xD3,OLED_CMD);//设置显示偏移
OLED_WR_Byte(0x00,OLED_CMD);//偏移量为0
OLED_WR_Byte(0xD5,OLED_CMD);//设置时钟分频率(1~16),振荡器频率
OLED_WR_Byte(0x80,OLED_CMD);//0~3位为时钟分频率(1),4~7位为振荡器频率(1000)
OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off
OLED_WR_Byte(0x05,OLED_CMD);//
OLED_WR_Byte(0xD9,OLED_CMD);//设置重充电周期
OLED_WR_Byte(0xF1,OLED_CMD);//
OLED_WR_Byte(0xDA,OLED_CMD);//设置COM引脚硬件配置
OLED_WR_Byte(0x12,OLED_CMD);//
OLED_WR_Byte(0xDB,OLED_CMD);//设置Vcomh取消选择水平
OLED_WR_Byte(0x30,OLED_CMD);//
OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable
OLED_WR_Byte(0x14,OLED_CMD);//
OLED_WR_Byte(0xAF,OLED_CMD);//打开OLED显示

以上我们就把OLED初始化完成了。接下来我们可以开始写显示函数了。

	void OLED_Set_Pos(unsigned char x, unsigned char y) 
{ 	OLED_WR_Byte(0xb0+y,OLED_CMD);//设置目标显示位置页起始地址
	OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);//设置列起始地址高位
	OLED_WR_Byte((x&0x0f),OLED_CMD);//设置列起始地址低位 
}   //起始列为x

这里我们先写一个设置坐标的函数,方便后面调用。

1.显示一个字符的函数如下:

void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size)
{      	   //8x16规格
	unsigned char c=0,i=0;	
	c=chr-' ';//得到偏移后的值
		      //' '为ASCII码第32个			
	if(x>Max_Column-1)
        {
        x=0;y=y+2;//如果x大于最大列,则置0,y+2?
        }
	if(Char_Size ==16)
        {
		OLED_Set_Pos(x,y);//起始列为x,起始页为y	
		for(i=0;i<8;i++)
		    {
            OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);//第c*16行前半行的数据
            }
		OLED_Set_Pos(x,y+1);//换下一页
		for(i=0;i<8;i++)
		    {
            OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);//后半行数据
            }
		}
	else {	
			OLED_Set_Pos(x,y);
			for(i=0;i<6;i++)
			OLED_WR_Byte(F6x8[c][i],OLED_DATA);
		}
}

由于规格为8*16,因此我们需要16个16进制数来表示一个字符,表的一部分如下:

 其中最后一个十进制数为所在数组中的第几行,即字符减去偏移量32后的十进制序号。

上图为SSD1306页地址模式下单个字符的写入模式。

 2.显示一个汉字的函数如下:

void OLED_ShowCHinese(u8 x,u8 y,u8 no)
{   //16*16   			    
	u8 t,adder=0;
	OLED_Set_Pos(x,y);	
    for(t=0;t<16;t++)
		{
				OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);//字模数组
				adder+=1;
     }	
		OLED_Set_Pos(x,y+1);	
    for(t=0;t<16;t++)
			{	
				OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
				adder+=1;
      }					
}

可以看到,显示汉字与显示字符的方式大同小异,只是汉字为16*16的规格。

 利用取模工具生成汉字的字模,再利用以上函数,就可以显示汉字。

3.如果要显示BMP图片,也需要用取模工具取模,再利用函数即可实现。

void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
{ 	
 unsigned int j=0;
 unsigned char x,y;
  
  if(y1%8==0) y=y1/8;      
  else y=y1/8+1;
	for(y=y0;y<y1;y++)
	{
		OLED_Set_Pos(x0,y);
    for(x=x0;x<x1;x++)
	    {      
	    	OLED_WR_Byte(BMP[j++],OLED_DATA);	    	
	    }
	}
} 
//128*64

以上基本就可以实现SSD1306的显示功能,当然,有很多汉字和图片需要自己用取模工具(例如PCtoLCD2002)去取模。

以上就是SSD1306的显示功能的实现过程,不足之处,还望担待。

### 回答1: Arduino SSD1306 OLED显示屏是一种基于Arduino开发板的显示屏,采用SSD1306驱动芯片,具有高亮度、低功耗、高对比度等特点。它可以用于显示各种信息,如文本、图像、图标等,适用于各种Arduino项目。 ### 回答2: Arduino SSD1306 OLED显示屏是一块高分辨率的单色显示屏,非常适合DIY电子爱好者在自己的项目中使用。与传统的LCD显示屏不同,OLED显示屏具有更快的响应速度、更低的功耗和更高的对比度,同时消耗的电力也更少,在相同的亮度下更加节能,因此在需要使用电池供电的项目中得到广泛应用。Arduino SSD1306 OLED显示屏OLED屏幕、驱动IC、电容、电阻和其他一些辅助器件组成,通过I2C总线与Arduino板通信。 为了控制这块显示屏,我们需要一个专门编写的程序。在这个程序中,我们可以定义需要显示的内容,包括文本、图形、图标和图像。可以通过设置显示屏坐标和颜色来创建自定义的显示内容。可以使用不同的字体、大小和样式来创建独特的设计。 使用Arduino SSD1306 OLED显示屏的优点不只是它的高效能和易用性,还在于其开放性和扩展性。用户可以使用不同的软件库和驱动程序来创建自己的创新项目,或者使用可用的库和例子来快速上手。对于那些不熟悉编程的用户,也可以使用现成的图形库来轻松地创建复杂的图形和界面。 总的来说,Arduino SSD1306 OLED显示屏是一款多功能的单色显示屏,其灵活性和高效能使其成为DIY电子爱好者的首选。适用于各种类型的项目,包括智能家居、传感器网络、机器人、万花筒、数据可视化和可穿戴设备。 ### 回答3: Arduino ssd1306 oled显示屏是一种非常常见和实用的显示屏,其特点是高亮度、高对比度、低功耗、反应速度快等。这种显示屏采用SSD1306控制芯片,可以通过I2C接口与Arduino连接。SSD1306控制芯片集成了控制器和驱动器,可以通过软件控制屏幕内容。 要使用Arduino ssd1306 oled显示屏,首先需要下载并安装相应的库。在Arduino IDE中打开菜单“工具”-“库管理器”,搜索SSD1306并下载“Adafruit SSD1306”或者“U8g2”库。接下来,连接Arduino ssd1306 oled显示屏到Arduino板上,将VCC连接到5V,GND连接到GND,SDA连接到SDA,SCL连接到SCL。在Arduino IDE中选择正确的板子和端口,并打开一个新的示例程序。如果已安装了U8g2库,可以在示例中找到ssd1306的例子程序进行测试。 在程序中,可以通过调用相应函数来控制显示屏上显示内容,例如显示文本、图形、动画等。可以设置屏幕分辨率、字体大小、对齐方式等缩放和定位属性。可以使用函数来绘制点、线、矩形、圆形、多边形等基本图形,也可以导入和显示位图和动画等多媒体内容。 总的来说,Arduino ssd1306 oled显示屏是一种非常实用和常用的显示屏,可以用于各种跟踪、监控、测量、控制等应用场景。通过简单的硬件和软件设计,可以快速、方便、高效地实现其功能。在今后的开发中,Arduino ssd1306 oled显示屏将会得到更广泛的应用和发展。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值