历史上的今天
返回首页

历史上的今天

今天是:2024年12月06日(星期五)

正在发生

2020年12月06日 | STM32 —— 中景园0.96寸OLED

2020-12-06 来源:eefocus

    OLED,即有机发光二极管(  Organic Light Emitting Diode )。 OLED 由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。


    LCD 都需要背光,而 OLED 不需要,因为它是自发光的。这样同样的显示 OLED 效果要来得好一些。以目前的技术,OLED 的尺寸还难以大型化,但是分辨率确可以做到很高。


    分辨率:128*64


    驱动方式:SPI/IIC,以下程序是IO口模拟IIC通信。


#ifndef __OLED_H

#define __OLED_H

 

typedef   signed           char int8_t;

typedef   signed short     int int16_t;

typedef   signed           int int32_t;

typedef   signed       __int64 int64_t;

 

 

/* exact-width unsigned integer types */

typedef unsigned           char uint8_t;

typedef unsigned short     int uint16_t;

typedef unsigned           int uint32_t;

typedef unsigned           int size_t;

typedef unsigned       __int64 uint64_t;

 

#define OLED_SCL_PORT        GPIOA

#define OLED_SCL_PIN         GPIO_Pin_5

#define OLED_SCL_CONFIG()    GPIOConfig(OLED_SCL_PORT, OLED_SCL_PIN, GPIO_Mode_Out_PP)

#define OLED_SCL_LOW()       GPIO_ResetBits(OLED_SCL_PORT, OLED_SCL_PIN) // SCL

#define OLED_SCL_HIGH()      GPIO_SetBits(OLED_SCL_PORT, OLED_SCL_PIN)

 

#define OLED_SDA_PORT        GPIOA

#define OLED_SDA_PIN         GPIO_Pin_7

#define OLED_SDA_CONFIG()    GPIOConfig(OLED_SDA_PORT, OLED_SDA_PIN, GPIO_Mode_Out_PP)

#define OLED_SDA_LOW()       GPIO_ResetBits(OLED_SDA_PORT, OLED_SDA_PIN) // SDA

#define OLED_SDA_HIGH()      GPIO_SetBits(OLED_SDA_PORT, OLED_SDA_PIN)

 

#define OLED_RES_PORT        GPIOA

#define OLED_RES_PIN         GPIO_Pin_6

#define OLED_RES_CONFIG()    GPIOConfig(OLED_RES_PORT, OLED_RES_PIN, GPIO_Mode_Out_PP)

#define OLED_RES_LOW()       GPIO_ResetBits(OLED_RES_PORT, OLED_RES_PIN) // RES

#define OLED_RES_HIGH()      GPIO_SetBits(OLED_RES_PORT, OLED_RES_PIN)

 

#define OLED_MODE 0

#define SIZE 8

#define XLevelL 0x00

#define XLevelH 0x10

#define Max_Column 128

#define Max_Row 64

#define Brightness 0xFF 

#define X_WIDTH 128

#define Y_WIDTH 64       

     

#define OLED_CMD  0 //写命令

#define OLED_DATA 1 //写数据

 

void IICStart(void);

void IICStop(void);

void I2CWriteCmd(uint8_t cmd);

void I2CWriteData(uint8_t data);

void I2CWriteByte(uint8_t byte);

void I2CWaitAck(void);

 

//OLED控制用函数

void OLEDWriteByte(uint8_t dat,uint8_t cmd);  

void OLEDDisplayOn(void);

void OLEDDisplayOff(void);             

void OLEDInit(void);

void OLEDClear(void);

void OLEDDrawPoint(uint8_t x,uint8_t y,uint8_t t);

void OLEDFill(uint8_t x1,uint8_t y1,uint8_t x2,uint8_t y2,uint8_t dot);

void OLEDShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t Char_Size);

void OLEDShowNum(uint8_t x,uint8_t y,uint32_t num,uint8_t len,uint8_t size);

void OLEDShowString(uint8_t x,uint8_t y, uint8_t *p,uint8_t Char_Size);  

void OLEDSetPos(uint8_t x, uint8_t y);

void OLEDShowCHinese(uint8_t x,uint8_t y,uint8_t no);

void OLEDDrawBMP(uint8_t x0, uint8_t y0,uint8_t x1,uint8_t y1,uint8_t BMP[]);

 

#endif  

#include "oled.h"

#include "stdlib.h"

#include "oledfont.h"

 

void IICStart(void)

{

  OLED_SCL_HIGH() ;

  OLED_SDA_HIGH();

  OLED_SDA_LOW();

  OLED_SCL_LOW();

}

 

void IICStop(void)

{

  OLED_SCL_HIGH() ;

  OLED_SDA_LOW();

  OLED_SDA_HIGH();

 

}

 

void I2CWaitAck(void)

{

  OLED_SCL_HIGH() ;

  OLED_SCL_LOW();

}

 

void I2CWriteByte(uint8_t byte)

{

  uint8_t i;

  uint8_t m, data;

 

  data = byte;

  OLED_SCL_LOW();

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

  {

    m = data;

    m = m & 0x80;

    if(m == 0x80)

    {

      OLED_SDA_HIGH();

    }

    else

    {

      OLED_SDA_LOW();

    }

    data = data << 1;

    OLED_SCL_HIGH();

    OLED_SCL_LOW();

  }

}

 

void I2CWriteCmd(uint8_t cmd)

{

  IICStart();

  I2CWriteByte(0x78);      //Slave address,SA0=0

  I2CWaitAck();

  I2CWriteByte(0x00);      //write command

  I2CWaitAck();

  I2CWriteByte(cmd);

  I2CWaitAck();

  IICStop();

}

 

void I2CWriteData(uint8_t data)

{

  IICStart();

  I2CWriteByte(0x78);      //D/C#=0; R/W#=0

  I2CWaitAck();

  I2CWriteByte(0x40);      //write data

  I2CWaitAck();

  I2CWriteByte(data);

  I2CWaitAck();

  IICStop();

}

 

void OLEDWriteByte(uint8_t dat, uint8_t cmd)

{

  if(cmd)

  {

    I2CWriteData(dat);

  }

  else

  {

    I2CWriteCmd(dat);

  }

}

 

//坐标设置

 

void OLEDSetPos(uint8_t x, uint8_t y)

{

  OLEDWriteByte(0xb0 + y, OLED_CMD);

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

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

}

//开启OLED显示

void OLEDDisplayOn(void)

{

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

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

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

}

//关闭OLED显示

void OLEDDisplayOff(void)

{

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

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

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

}

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

void OLEDClear(void)

{

  uint8_t i, n;

 

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

  {

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

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

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

    for(n = 0; n < 128; n++)

    {

      OLEDWriteByte(0, OLED_DATA);

    }

  } //更新显示

}

void OLED_On(void)

{

  uint8_t i, n;

 

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

  {

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

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

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

    for(n = 0; n < 128; n++)

    {

      OLEDWriteByte(1, OLED_DATA);

    }

  } //更新显示

}

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

//x:0~127

//y:0~63

//mode:0,反白显示;1,正常显示

//size:选择字体 16/12

void OLEDShowChar(uint8_t x, uint8_t y, uint8_t chr, uint8_t Char_Size)

{

  uint8_t c = 0, i = 0;

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

  if(x > Max_Column - 1)

  {

    x = 0;

    y = y + 2;

  }

  if(Char_Size == 16)

  {

    OLEDSetPos(x, y);

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

    {

      OLEDWriteByte(F8X16[c * 16 + i], OLED_DATA);

    }

    OLEDSetPos(x, y + 1);

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

    {

      OLEDWriteByte(F8X16[c * 16 + i + 8], OLED_DATA);

    }

  }

  else

  {

    OLEDSetPos(x, y);

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

    {

      OLEDWriteByte(F6x8[c][i], OLED_DATA);

    }

 

  }

}

 

//m^n函数

uint32_t oled_pow(uint8_t m, uint8_t n)

{

  uint32_t result = 1;

  while(n--)

  {

    result *= m;

  }

  return result;

}

//显示2个数字

//x,y :起点坐标

//len :数字的位数

//size:字体大小

//mode:模式 0,填充模式;1,叠加模式

//num:数值(0~4294967295);

void OLEDShowNum(uint8_t x, uint8_t y, uint32_t num, uint8_t len, uint8_t size2)

{

  uint8_t t, temp;

  uint8_t 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)

      {

        OLEDShowChar(x + (size2 / 2)*t, y, ' ', size2);

        continue;

      }

      else

      {

        enshow = 1;

      }

 

    }

    OLEDShowChar(x + (size2 / 2)*t, y, temp + '0', size2);

  }

}

//显示一个字符号串

void OLEDShowString(uint8_t x, uint8_t y, uint8_t *chr, uint8_t Char_Size)

{

  uint8_t j = 0;

 

  while (chr[j] != '')

  {

    OLEDShowChar(x, y, chr[j], Char_Size);

    x += 8;

    if(x > 120)

    {

      x = 0;

      y += 2;

    }

    j++;

  }

}

//显示汉字

void OLEDShowCHinese(uint8_t x, uint8_t y, uint8_t no)

{

  uint8_t t;

  OLEDSetPos(x, y);

  for(t = 0; t < 16; t++)

  {

    OLEDWriteByte(chinese[2 * no][t], OLED_DATA);

  }

  OLEDSetPos(x, y + 1);

  for(t = 0; t < 16; t++)

  {

    OLEDWriteByte(chinese[2 * no + 1][t], OLED_DATA);

  }

}

 

/***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/

void OLEDDrawBMP(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t BMP[])

{

  uint32_t j = 0;

  uint8_t x, y;

 

  if(y1 % 8 == 0)

  {

    y = y1 / 8;

  }

  else

  {

    y = y1 / 8 + 1;

  }

  for(y = y0; y < y1; y++)

  {

    OLEDSetPos(x0, y);

    for(x = x0; x < x1; x++)

    {

      OLEDWriteByte(BMP[j++], OLED_DATA);

    }

  }

}

 

static void oled_delay(uint32_t ms)

{

  while(--ms);

}

 

void OLEDInit(void)

{

  OLED_SCL_CONFIG();

  OLED_SDA_CONFIG();

  OLED_RES_CONFIG();

  OLED_SCL_HIGH();

  OLED_SDA_HIGH();

 

  OLED_RES_LOW();

  oled_delay(20000000);

  OLED_RES_HIGH();

  oled_delay(50000000);

推荐阅读

史海拾趣

GuangDong Province MengCo Semiconductor Co., Ltd公司的发展小趣事
如过流、过压等报警,可能与制动电路的控制逻辑或硬件故障有关。
DEWALT公司的发展小趣事

在第二次世界大战期间,DEWALT公司面临了巨大的挑战。由于战争的影响,许多原材料和零部件供应中断,生产受到严重影响。然而,DEWALT公司凭借自身的技术实力和创新能力,成功克服了这些困难。公司还积极为军队提供所需的电动工具产品,为战争胜利做出了贡献。这些经历使DEWALT公司更加坚定了技术创新和品质控制的信念。

登丰微(GSTEK)公司的发展小趣事

随着电子行业的快速发展和市场需求的不断变化,歌普电子也在积极调整战略布局,以应对未来的挑战和机遇。公司不仅在现有产品领域持续深耕细作,还积极探索新的业务领域和增长点。通过多元化布局和不断创新,歌普电子致力于成为电子行业的领军企业之一。未来,歌普将继续秉承“创新、高效、尊重、负责”的文化理念,为客户提供更加优质的产品和服务,共同推动电子行业的繁荣发展。

Eureka Microelectronics Inc公司的发展小趣事

Eureka在追求经济效益的同时,也积极履行社会责任。公司注重环保和可持续发展,致力于减少生产过程中的能源消耗和废弃物排放。同时,Eureka也积极参与公益活动,为社会做出积极贡献。这些努力不仅提升了公司的社会形象,也促进了公司的可持续发展。

请注意,以上故事仅为虚构,并非Eureka公司的实际历史。如有需要,请查阅相关公开资料或联系Eureka公司以获取准确信息。

DIALIGHT公司的发展小趣事

DIALIGHT公司的故事始于1938年的纽约布鲁克林,当时该公司专注于为飞机生产仪表板灯。随着技术的不断进步和市场的变化,公司在1971年,即LED推出仅一年后,推出了他们的第一个LED产品。这一举措标志着DIALIGHT正式从传统的飞机仪表板灯制造转向LED照明技术的研发和应用。从此,DIALIGHT彻底改变了LED的用途,将其广泛应用于世界各地的交通控制、指示灯、结构塔和工业场所,为全球提供了优质的照明解决方案。

Blue Creation公司的发展小趣事

随着国内市场的饱和,Blue Creation公司决定将目光投向海外市场。公司制定了一系列国际化战略,包括设立海外研发中心、拓展销售渠道、加强品牌推广等。经过几年的努力,Blue Creation的产品逐渐打入国际市场,赢得了众多海外客户的认可。同时,公司也积极吸收国际先进技术和管理经验,不断提升自身的竞争力。

问答坊 | AI 解惑

MSP430 JTAG原理图

本帖最后由 paulhyde 于 2014-9-15 09:18 编辑 bu cuo  …

查看全部问答>

请教:有关博客的问题

博客里面的文章可不可以统一的一批划归为某一类。 假如说: 1、2、3、4、5为单片机 6、7、8、9、10为PIC单片机 。。。 。。。 。。。 写完文章后我想批量移到某一类中,也可以添加某一类,类似网易的博客。 这样的话可以做到么?今天暂时没 ...…

查看全部问答>

电脑角落又发现一个宝贝

关于模拟设计的一些要注意的地方,虽然很简短,但是很有用哦!…

查看全部问答>

刚浏览新闻看到一个信息,给大家看看——Windows 7电源管理方面9个重要的改进

微软近期对外公布了Windows 7的电源管理技术是如何降低电能消耗。如果你想了解Windows 7究竟是如何省电的,以下内容会告诉你Windows 7节能的主要途径。   1.Windows7典型应用的优化方案   除了上述列出的改进外,微软还把目光转向一些特定的 ...…

查看全部问答>

高集成度LLC控制器FSFR2100

飞兆半导体公司的高集成度绿色Green FPS功率开关FSFR2100能够在电信电源、高端音频放大器、大型激光打印机和LCD及PDP TV电源等谐振转换器设计中,提高效率和系统可靠性,并缩短宝贵的设计时间.该功率开关提供“系统级封装(system-in-a-package)”方法 ...…

查看全部问答>

windows ce

怎样用光盘启动xp…

查看全部问答>

单片机控制tc35发送短信的问题

各位大侠你们,最近在研究用单片机控制TC35模块发送短信的东西,自己在万能板上都焊接好了,用超级终端可以正常发送短信,但是我想通过单片机直接发送短信,就是程序弄不好,希望的大侠指点下,下面是我的程序。 #include //#include #include ...…

查看全部问答>

GetCurrentThreadID的问题。

coredll.dll中有没有GetCurrentThreadID这个函数啊。 我用.Net 2003,WinCE4.1。 想获得当前的线程号。 哪位大虾帮帮忙啊。…

查看全部问答>

叨叨两句,侃侃论坛

在论坛潜水了一年多,做斑竹半年多了,从EEWORLD得到了很多,认识了很多的朋友,这段期间很开心,真的把EEWORLD的当做家一样吗,就算在忙 没有时间看帖,也要打开论坛的网站挂着,不为什么,可能就是这样感觉心里舒服些吧!~ 首先不得不夸一下咱们 ...…

查看全部问答>