STM32——驱动7引脚OLED

STM32驱动7引脚的OLED

寒假在家里无聊又不能出门,开学可能还延迟了(新型肺炎最近比较猖狂)武汉加油!陕西加油!全国一起加油!一定要减少出门啊!!!

放假前带了一个OLED屏幕,想着刚好没有接触过这个模块。以后比赛啥的可能会用到该模块所以就研究一哈如何使用。我想着应该不难的,因为正点原子的教程中有。结果,正点原子的教程用的是16引脚的,我手上的是7引脚的。(奔溃,没有资料了啊)
在单片机论坛里看到了一些资料,该模块默认的是SPI通讯。之前学习过SPI的相关内容,不过一直没有用过理解的不深。恰好通过这一次来熟悉一下SPI
,SPI可以接四根线(发数据与读数据)或者是接三线(只发数据)。
四根线分别是:SDI(数据输入),SDO(数据输出)SCLK(时钟)CS(片选)

  1. SDO/MOSI:主设备发送数据,从设备接受数据
  2. SDI/MISO:主设备接受数据,从设备发送数据
  3. SCLK:时钟信号,由主设备产生
  4. CS:当从设备有很多时,每个设备都有一个CS引脚连接到主设备,当主设备想要连接到A从设备但是又不想连接到B的从设备时,就可以通过拉低A设备的CS引脚而不拉低B设备的CS引脚来控制不同的从设备是否工作盗一张图SPI通讯的开始与结束比IIC简单多了,CS为低就开始,CS为高就结束。

然后就是时钟极性(CPOL)与时钟相位(CPHA)了,感觉是不是听上去就高大上主机和从机的时钟极性时钟相位必须一样,时钟极性与时钟相位通过不通过01组合,一共有四种模式
1.mode0:CPOL = 0,CPHA = 0,CPOL=0,CPHA=0:此时空闲态时,SCLK处于低电平,数据采样是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在上升沿,数据发送是在下降沿。
2.mode1:CPOL= 0,CPHA = 1,CPOL=0,CPHA=1:此时空闲态时,SCLK处于低电平,数据发送是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在下降沿,数据发送是在上升沿。
3.mode2:CPOL= 1,CPHA = 0,CPOL=1,CPHA=0:此时空闲态时,SCLK处于高电平,数据采集是在第1个边沿,也就是SCLK由高电平到低电平的跳变,所以数据采集是在下降沿,数据发送是在上升沿。
4.mode3:CPOL = 1,CPHA = 1,CPOL=1,CPHA=1:此时空闲态时,SCLK处于高电平,数据发送是在第1个边沿,也就是 SCLK由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿。SPI的时钟极性和时钟相位一般都是是从机出场时就设定好的,主机根据从机去配。
以上是我对SPI的简单理解,那么接下来说一说OLED。
OLED的7个引脚分别为GND,VCC(3.3-5V)D0(时钟线)D1(数据线)RES(复位线)DC(数据命令选择线)和CS(SPI片选线)手上的OLED用的驱动芯片是SSD1306,那么就先从最基础的SPI与SSD1306通讯开始主要就是这么一个函数OLED_WR_Byte();首先传来两个数据,一个dat,一个cmd,如果cmd是1的话说明发送的是指令,要将DC拉高。DC确定完后拉低CS确定从机。之后开始传输数据。数据从高到低发送,数据手册上有说明按照次序将数据线至高至低,每次循环完一次后将时钟拉高,数据左移一位。这是SPI的时钟极性和时钟相位的所规定,总之SPI通讯是这么一回事,具体还得看手册。通过介绍可以得出OLED显示需要的相关步骤:
1)设置 STM32F1 与 OLED 模块相连接的 IO。这一步,先将我们与 OLED 模块相连的 IO 口设置为输出,具体使用哪些 IO 口,这里需要根据连接电路以及 OLED 模块所设置的通讯模式来确定。
2)初始化 OLED 模块。
其实这里就是上面的初始化框图的内容,通过对 OLED 相关寄存器的初始化,来启动 OLED的显示。为后续显示字符和数字做准备。
3)通过函数将字符和数字显示到 OLED 模块上。这里就是通过我们设计的程序,将要显示的字符送到 OLED 模块就可以了。
线路连接:

VCC 3.3V
CS PD3
DC PD5
RES PD4
DI PD7
D0 PD6
GND GND

接下来介绍几个重要的函数吧!

一:在oled.c文件下的OLED_Init()的函数
该函数的结构比较简单,开始是对 IO 口的初始化,这里我们用了宏定义
OLED_MODE 来决定要设置的 IO 口,其他就是一些初始化序列了,我们按照厂家提供的资料来做就可以。最后要说明一点的是,因为 OLED 是无背光的,在初始化之后,我们把显存都清空了,所以我们在屏幕上是看不到任何内容的!
二:显示ASCII字符的值

void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size)
{          
 u8 t,temp;
 u8 enshow=0;         
 for(t=0;t<len;t++)
 {
  temp=(num/oled_pow(10,len-t-1))%10;
  if(enshow==0&&t<(len-1))
  {
   if(temp==0)
   {
    OLED_ShowChar(x+(size/2)*t,y,' ');
    continue;
   }else enshow=1; 
     
  }
   OLED_ShowChar(x+(size/2)*t,y,temp+'0'); 
 }
} 

三:显示字符串函数

void OLED_ShowString(u8 x,u8 y,u8 *chr)
{
 unsigned char j=0;
 while (chr[j]!='\0')
 {  OLED_ShowChar(x,y,chr[j]);
   x+=8;
  if(x>120){x=0;y+=2;}
   j++;
 }
}

四:显示汉子函数

void OLED_ShowCHinese(u8 x,u8 y,u8 no)
{             
 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;
      }     
}

OLED主要是显示一些是简单的字符和数据的,对于汉字的显示使用的并不多。

最后来看看效果吧

Alt
尽管有了效果,但是很多地方理解的不是特别透彻,只能简单的改一改代码。关于中文字库的添加下来还得研究一下。

最后把工程文件放到自己的资源中心,希望对大家有帮助!

发布了37 篇原创文章 · 获赞 92 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44895651/article/details/104168008