传送门:Arduino使用u8g2库函数驱动4线/6线OLED屏幕(I2C/SPI通讯)附带库函数详解 【点击进入】

一、0.96寸SSD1306原理图(默认为SPI)

二、OLED硬件介绍及控制方式
建议直接观看【正点原子】推出的视频讲解:【点击进入】

三、程序控制

  1. OLED 更新缓存,显示内容
u8 OLED_GRAM[128][8];
void OLED_Refresh_Gram(void)
{u8 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(OLED_GRAM[n][i],OLED_DATA); }
}
  1. 向OLED写入一个字节
//dat:要写入的数据/命令
//cmd:数据/命令标志 0,表示命令;1,表示数据;
void OLED_WR_Byte(u8 dat,u8 cmd)
{   u8 i;             if(cmd)OLED_RS_Set();else OLED_RS_Clr();        for(i=0;i<8;i++){             OLED_SCLK_Clr();if(dat&0x80)OLED_SDIN_Set();else OLED_SDIN_Clr();OLED_SCLK_Set();dat<<=1;   }                        OLED_RS_Set();
}

3.开启OLED显示

void OLED_Display_On(void)
{OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ONOLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON
}

4.关闭OLED显示

void OLED_Display_Off(void)
{OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFFOLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF
}

5.清屏函数

void OLED_Clear(void)
{  u8 i,n;  for(i=0;i<8;i++)for(n=0;n<128;n++)OLED_GRAM[n][i]=0X00;  OLED_Refresh_Gram();//更新显示
}

6.功能函数

//画点
//x:0~127
//y:0~63
//t:1 填充 0,清空
void OLED_DrawPoint(u8 x,u8 y,u8 t)
{u8 pos,bx,temp=0;if(x>127||y>63)return;//超出范围了.pos=7-y/8;bx=y%8;temp=1<<(7-bx);if(t)OLED_GRAM[x][pos]|=temp;else OLED_GRAM[x][pos]&=~temp;
}//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//mode:0,反白显示;1,正常显示
//size:选择字体 16/12
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode)
{                   u8 temp,t,t1;u8 y0=y;chr=chr-' ';//得到偏移后的值                 for(t=0;t<size;t++){   if(size==12)temp=oled_asc2_1206[chr][t];  //调用1206字体else temp=oled_asc2_1608[chr][t];        //调用1608字体                               for(t1=0;t1<8;t1++){if(temp&0x80)OLED_DrawPoint(x,y,mode);else OLED_DrawPoint(x,y,!mode);temp<<=1;y++;if((y-y0)==size){y=y0;x++;break;}}       }
}
//m^n函数
u32 oled_pow(u8 m,u8 n)
{u32 result=1;  while(n--)result*=m;    return result;
}
//显示2个数字
//x,y :起点坐标
//len :数字的位数
//size:字体大小
//mode:模式   0,填充模式;1,叠加模式
//num:数值(0~4294967295);
void OLED_ShowNumber(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,' ',size,1);continue;}else enshow=1; }OLED_ShowChar(x+(size/2)*t,y,temp+'0',size,1); }
}
//显示字符串
//x,y:起点坐标
//*p:字符串起始地址
//用16字体
void OLED_ShowString(u8 x,u8 y,const u8 *p)
{#define MAX_CHAR_POSX 122
#define MAX_CHAR_POSY 58          while(*p!='\0'){       if(x>MAX_CHAR_POSX){x=0;y+=16;}if(y>MAX_CHAR_POSY){y=x=0;OLED_Clear();}OLED_ShowChar(x,y,*p,12,1);    x+=8;p++;}
}

四、效果展示
1.主函数

int main(void)
{ Stm32_Clock_Init(9);            //=====系统时钟设置JTAG_Set(JTAG_SWD_DISABLE);     //=====关闭JTAG接口JTAG_Set(SWD_ENABLE);           //=====打开SWD接口 可以利用主板的SWD接口调试delay_init(72);                 //=====延时初始化OLED_Init();                     //=====OLED初始化while(1){    OLED_ShowString(50,0,"*****");OLED_ShowString(0,15,"*****");OLED_ShowString(35,30,"*****");OLED_ShowString(15,45,"*****");OLED_Refresh_Gram();delay_ms(50);}
}

2.引脚定义(oled.h)

#ifndef __OLED_H
#define __OLED_H
#include "sys.h"//-----------------OLED端口定义----------------
#define OLED_SCLK_Clr()  PBout(5)=0  //SCL
#define OLED_SCLK_Set()  PBout(5)=1   //SCL#define OLED_SDIN_Clr()  PBout(4)=0   //SDA
#define OLED_SDIN_Set()  PBout(4)=1   //SDA#define OLED_RST_Clr() PBout(3)=0   //RST
#define OLED_RST_Set() PBout(3)=1   //RST#define OLED_RS_Clr() PAout(15)=0    //DC
#define OLED_RS_Set() PAout(15)=1    //DC#define OLED_CMD  0   //写命令
#define OLED_DATA 1 //写数据
//OLED控制用函数
void OLED_WR_Byte(u8 dat,u8 cmd);
void OLED_Display_On(void);
void OLED_Display_Off(void);
void OLED_Refresh_Gram(void);
void OLED_Init(void);
void OLED_Clear(void);
void OLED_DrawPoint(u8 x,u8 y,u8 t);
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode);
void OLED_ShowNumber(u8 x,u8 y,u32 num,u8 len,u8 size);
void OLED_ShowString(u8 x,u8 y,const u8 *p);
#endif  

详情请关注亿航创客官方抖音账号:EhangGroup

STM32F103C8T6驱动6线OLED(SPI通讯)相关推荐

  1. Arduino使用u8g2库函数驱动4线/6线OLED屏幕(I2C/SPI通讯)附带库函数详解

    话不多说,直接入正题: 常见的OLED通常有两种样式,如下图所示,分别是4线和6线控制 本人几乎浏览了网上所有关于控制OLED模块的教程,并都经过了项目实测:大力推荐u8g2这个库函数来控制,文章末尾 ...

  2. stm32硬件SPI驱动3线SPI-LCD的方法

    1.基本控制原理 三线SPI LCD, 顾名思义,最少只需要3个IO控制LCD显示,如果采用硬件控制上电时序和背光,最少只需要接SCK,CS,MOSI三个引脚即可控制LCD,并且不管接不接其他引脚,控 ...

  3. STM32——驱动7引脚OLED

    STM32驱动7引脚的OLED 寒假在家里无聊又不能出门,开学可能还延迟了(新型肺炎最近比较猖狂)武汉加油!陕西加油!全国一起加油!一定要减少出门啊!!! 放假前带了一个OLED屏幕,想着刚好没有接触 ...

  4. 详细介绍GPIO、I2C、SPI通讯原理以及物理层原理

    目录 一. GPIO 1. 什么是GPIO? 2. GPIO组成原理 3. GPIO工作原理 二. I2C 1. 什么是I2C? 2. I2C组成原理 3. I2C的特性 4. I2C的通讯模式 5. ...

  5. 联盛德 HLK-W806 (六): I2C驱动SSD1306 128x64 OLED液晶屏

    目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...

  6. SPI通讯原理,SPI驱动程序编写,EEPROM,Tja1145,CAN收发器驱动程序,嵌入式,单片机,软件

    一.SPI通信原理讲解 0.架构讲解 1.通常CPU芯片(如TI的280049.英飞凌的TC234)中集成了SPI模块,CPU可使用SPI通讯模块实现与外部设备的通讯,如CPU与EEPROM模块的通讯 ...

  7. Linux驱动修炼之道-SPI驱动框架源码分析(上)

    Linux驱动修炼之道-SPI驱动框架源码分析(上)   SPI协议是一种同步的串行数据连接标准,由摩托罗拉公司命名,可工作于全双工模式.相关通讯设备可工作于m/s模式.主设备发起数据帧,允许多个从设 ...

  8. 加密芯片SPI通讯的调试

    SPI是串行外设接口(Serial Peripheral Interface)的缩写.是Motorola公司推出的一种同步串行接口技术,是一种高速的.全双工,同步的通信总线. SPI的通信原理很简单, ...

  9. SPI通讯协议详解 基于STM32

    SPI 协议简介 SPI 协议是由摩托罗拉公司提出的通讯协议 (Serial Peripheral Interface),即串行外围设备接口,是 一种高速全双工的通信总线.它被广泛地使用在 ADC.L ...

最新文章

  1. Rook存储:Kubernetes中最优秀的存储
  2. 基于耳-脑电图的脑机接口研究进展
  3. [恢]hdu 2077
  4. React + TypeScript 默认 Props 的处理
  5. leetcode176. 第二高的薪水(SQL)
  6. centos装java配件_CentOS安装JAVA
  7. Linux yum源码包安装和卸载
  8. android 的android httpClient详解
  9. android迷你世界助手52,迷你世界助手盒子刷迷你币
  10. Android人脸支付功能,OPPO Find X成为首款支持微信人脸支付的安卓手机
  11. jquery/zepto 圣诞节雪花飞扬
  12. python实现将不同的附件发邮件到不同的地区
  13. 最好用的 Base64 在线工具
  14. java SSM 框架 多数据源
  15. Java基础及API总结
  16. 华为回应员工辞职事件:否认规避劳动合同法
  17. WhatsUP启动出现错误解决办法
  18. XTTS迁移11g到19c
  19. Delphi/Lazarus/Pascal基于Castle Engine的IOS人体活动识别
  20. iOS 图表工具charts之LineChartView

热门文章

  1. Java架构师成长之路-100问
  2. 华为上交 | GAN 将古典人像变3D,视角可切换
  3. 问题--联通研究院面试
  4. 史上最详细店铺运营方案,新手必看!
  5. CentOS 7 分区方案
  6. 数据结构你真的懂了吗?————「基础概念篇」
  7. 2018年下半年系统集成项目管理工程师金色考点暨历年真题解析(09年到18年上半年)---软考中级最新
  8. [python] 开发一个跟随角色移动的地图游戏demo
  9. 如何铸造游戏中的NFT游戏角色
  10. 关于嵌套结构体大小的计算