NO.10 1.3寸OLED显示屏IIC通信(12864驱动芯片)

发布时间:2022-12-21  

  对于单片机来说,有一个良好的人机交互界面是很重要的。那么我们常用的单片机显示设备有什么呢?OLED屏是一个不错选择。

  

  OLED能显示我们的相对应的信息,使得我们的电子设计顿时高大上许多。

  OLED是啥呢?OLED跟LED差不多,简单点说,就是一个个小小的LED组合起来,控制每一个小小的LED灯像素的亮灭来进行显示,这样就可以显示任意字符了。

  对于OLED来说,单位面积内像素点的个数直接决定了我们显示屏的分辨率。像我在某宝购买的OLED显示屏,是1.3寸内有128*64个像素点。

  显然我们是不可能搞这么多的GPIO口来控制这个OLED的,那么我们该如何控制呢?

  前人早就为我们想好的解决措施,人家造了专门控制这种OLED的芯片方便我们使用,我们只需要按照芯片所需要的通信协议跟芯片通信就可以操作这个OLED了。

  那么我们应该用什么通信协议呢?这个芯片支持IIC和SPI两种通信方式,这里我们主要使用讲解IIC。

   I2C 总线是一种串行数据总线,只有二根信号线,一根是双向的数据线SDA,另一根是时钟线SCL,两条线可以挂多个设备。 IIC设备(绝大多数)里有个固化的地址,只有在两条线上传输的值等于IIC设备的固化地址时,其才会作出响应。通常我们为了方便把IIC设备分为主设备和从设备,基本上谁控制时钟线(即控制SCL的电平高低变换)谁就是主设备。

  我们操作OLED显示屏就是属于最简单的一种IIC应用。我们只需要向OLED发送数据,而不需要接收OLED发送的数据。

  IIC的具体通信协议我就不详细说了,主要分为起始信号,应答信号,结束信号,同时向设备发送数据或者接收数据。

  对于我们的MSP432中,其实是自带了IIC的库,但是为了我们方便理解(才不是我老是发送不了数据呢),我们使用软件模拟IIC。

  那什么又是软件模拟IIC呢?就是拿GPIO口当做SCL和SDA,自己来控制传输线的高低电平!

  我们万能的某宝卖家写了利用51和STM32操作OLED例程,我们只需要对其修改下就可以运用到我们的MSP432中。

  下面我列出所有核心函数:

//起始信号

void I2C_Start(void)

{

    GPIO_write(CONFIG_GPIO_SDA,1);

    GPIO_write(CONFIG_GPIO_SCL,1);

    GPIO_write(CONFIG_GPIO_SDA,0);

    GPIO_write(CONFIG_GPIO_SCL,0);

}


//结束信号

void I2C_Stop(void)

{

    GPIO_write(CONFIG_GPIO_SDA,0);

    GPIO_write(CONFIG_GPIO_SCL,1);

    GPIO_write(CONFIG_GPIO_SDA,0);

}


//等待信号响应

void I2C_WaitAck(void) //测数据信号的电平

{

    GPIO_write(CONFIG_GPIO_SDA,1);

    GPIO_write(CONFIG_GPIO_SCL,1);

    GPIO_write(CONFIG_GPIO_SCL,0);

}


//写入一个字节

void Send_Byte(uint8_t dat)

{

  uint8_t i;

  for(i=0;i<8;i++)

  {

    GPIO_write(CONFIG_GPIO_SCL,0);//将时钟信号设置为低电平

    if(dat&0x80)//将dat的8位从最高位依次写入

    {

        GPIO_write(CONFIG_GPIO_SDA,1);

    }

    else

    {

        GPIO_write(CONFIG_GPIO_SDA,0);

    }

    GPIO_write(CONFIG_GPIO_SCL,1);

    GPIO_write(CONFIG_GPIO_SCL,0);

    dat<<=1;

  }

}


//发送一个字节

//向SSD1306写入一个字节。

//mode:数据/命令标志 0,表示命令;1,表示数据;

void OLED_WR_Byte(uint8_t dat,uint8_t mode)

{

  I2C_Start();

  Send_Byte(0x78);

  I2C_WaitAck();

  if(mode){Send_Byte(0x40);}

  else{Send_Byte(0x00);}

  I2C_WaitAck();

  Send_Byte(dat);

  I2C_WaitAck();

  I2C_Stop();

}


//坐标设置

void OLED_Set_Pos(uint8_t x, uint8_t y)

{

  OLED_WR_Byte(0xb0+y,OLED_CMD);

  OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);

  OLED_WR_Byte((x&0x0f),OLED_CMD);

}


//开启OLED显示

void OLED_Display_On(void)

{

  OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令

  OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON

  OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON

}

//关闭OLED显示

void OLED_Display_Off(void)

{

  OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令

  OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFF

  OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF

}

//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!

void OLED_Clear(void)

{

  uint8_t i,n;

  for(i=0;i<8;i++)

  {

    OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)

    OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址

    OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址

    for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);

  } //更新显示

}


//在指定位置显示一个字符,包括部分字符

//x:0~127

//y:0~63

//sizey:选择字体 6x8  8x16

void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t sizey)

{

  uint8_t c=0,sizex=sizey/2;

  uint16_t i=0,size1;

  if(sizey==8)size1=6;

  else size1=(sizey/8+((sizey%8)?1:0))*(sizey/2);

  c=chr-' ';//得到偏移后的值

  OLED_Set_Pos(x,y);

  for(i=0;i  {

    if(i%sizex==0&&sizey!=8) OLED_Set_Pos(x,y++);

    if(sizey==8) OLED_WR_Byte(asc2_0806[c][i],OLED_DATA);//6X8字号

    else if(sizey==16) OLED_WR_Byte(asc2_1608[c][i],OLED_DATA);//8x16字号

    //      else if(sizey==xx) OLED_WR_Byte(asc2_xxxx[c][i],OLED_DATA);//用户添加字号

    else return;

  }

}

//m^n函数

uint32_t oled_pow(uint8_t m,uint8_t n)

{

  uint32_t result=1;

  while(n--)result*=m;

  return result;

}

//显示数字

//x,y :起点坐标

//num:要显示的数字

//len :数字的位数

//sizey:字体大小

void OLED_ShowNum(uint8_t x,uint8_t y,uint32_t num,uint8_t len,uint8_t sizey)

{

  uint8_t t,temp,m=0;

  uint8_t enshow=0;

  if(sizey==8)m=2;

  for(t=0;t  {

    temp=(num/oled_pow(10,len-t-1))%10;

    if(enshow==0&&t    {

      if(temp==0)

      {

        OLED_ShowChar(x+(sizey/2+m)*t,y,' ',sizey);

        continue;

      }else enshow=1;

    }

    OLED_ShowChar(x+(sizey/2+m)*t,y,temp+'0',sizey);

  }

}

//显示一个字符号串

void OLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_t sizey)

{

  uint8_t j=0;

  while (chr[j]!='

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    精英STM32F103开发板试用体验:+OLED屏显示功能的实现;鉴于STM32F103开发板没有配置显示屏,因此要显示一些信息除了借助串行通讯,就必须为其添加相应的显示器件了。在初步掌握GPIO......
    LCD1602工作原理 LCD1602液晶屏原理图 LCD1602显示控制;LCD液晶屏显示原理 液晶(Liquid Crystal)是一种高分子材料,因为其特殊的物理、化学、光学特性,20世纪中叶开始广泛应用在轻薄型显示......
    智能手机上获取图片信息,并将信息通过电子墨水屏显示出来,实现图片刷新。 2.图像显示 :采用“微胶囊电泳显示”技术进行图像显示,其基本原理是悬浮在液体中的带电纳米粒子受到电场作用而产生迁移。电子纸显示屏靠反射环境光来显示......
    LCD和OLED到底哪个好?; 随着显示光电技术和科技的不断发展,我们的生活也越来越离不开各种电子产品。而在这些电子产品中,是最为重要的组成部分之一。目前市场上主流的显示屏有两种,一种是(液晶显示屏......
    柱式LED显示屏以其新颖、视角范围大、成本低、功耗小等优点引起人们的关注。这种显示屏的显示原理较为简单:将若干个LED排成一列构成一个LED线阵,当这个LED线阵绕与其平行的轴旋转时可形成柱面,按正......
    唯一一种成熟的柔性屏幕材料就成了折叠屏唯一的材料选择,加之其他优秀的特性,使得OLED屏幕开始全面替换LCD屏幕。   大致了解了LCD和OLED显示原理,下面就让我们来对详细比一下LCD和OLED的优......
    )的新型自发光显示技术,显示原理是将OLED中的有机自发光二极管替换成无机材料的LED灯珠,并将LED结构薄膜化、小型化(像素级)、矩阵化,并在一个芯片上高度集成的固体自发光显示技术。MicroLED......
    通过分区背光取得更加优秀的对比度和亮度表现,显示效果优于LED屏幕。 MiniLED技术准确来说,应该叫做MiniLED背光技术,主要作用于LCD的背光源。 MiniLED显示原理LCD屏幕能够显示......
    还具备手机APP远程控制开窗器进而控制窗户开关的功能,系统使用OLED显示屏显示界面,能够实时显示当前的环境信息和窗户开关的信息。在未来,即使出门在外也能随时随地了解家里的情况并可以随意操控家居环境,科技改变未来。 ......
    使用OLED显示屏显示界面,能够实时显示当前的环境信息和窗户开关的信息。在未来,即使出门在外也能随时随地了解家里的情况并可以随意操控家居环境,科技改变未来。 ......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>