最近在研究四针的OLED 先上个效果图
总工程文件评论区留下邮箱我会发送

硬件部分
有开发板的直接用开发板就好 没有的去某宝买一块STM32F103C8T6(10元左右)
类似这种

接线部分
OLED一共有四个接口 本别是SCL(时钟),SDA(数据),GND(电源负),VCC3.3(注意是接3.3V, 5V会烧坏)
电源正负随便接是3.3V就OK SCL,SDA接单片机IO口 具体配置看原理图 我这个芯片的对应的是PB6,7用排线连接就好

硬件部分结束。

软件部分
源码是借鉴的 亲测能用 不得不说 站在巨人的肩膀上真的很舒服 现在分享主和OLED C文件 总工程文件评论区留下邮箱我会发送

//主c文件
#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "bmp.h"
int main(void){ u8 t;delay_init();           //延时函数初始化    NVIC_Configuration();      //设置NVIC中断 //  delay_ms(8000);OLED_Init();         OLED_Clear()    ; t=' ';//显示汉字OLED_ShowCHinese(18,0,0);//OLED_ShowCHinese(36,0,1);//OLED_ShowCHinese(72,0,2);//OLED_ShowCHinese(90,0,3);//while(1) {     OLED_Clear();OLED_ShowCHinese(18,0,0);OLED_ShowCHinese(36,0,1);OLED_ShowCHinese(72,0,2);OLED_ShowCHinese(90,0,3);OLED_ShowString(6,3,"0.96' OLED TEST",16);OLED_ShowString(0,6,"ASCII:",16);  OLED_ShowString(63,6,"CODE:",16);  OLED_ShowChar(48,6,t,16);//显示字符   t++;if(t>'~')t=' ';OLED_ShowNum(103,6,t,3,16);delay_ms(8000);delay_ms(8000);delay_ms(8000);delay_ms(8000);delay_ms(8000);OLED_DrawBMP(0,0,128,8,BMP1);  //显示图片delay_ms(8000);delay_ms(8000);delay_ms(8000);delay_ms(8000);OLED_DrawBMP(0,0,128,8,BMP1);delay_ms(8000);delay_ms(8000);delay_ms(8000);delay_ms(8000);}      }
//oled c文件
void IIC_Start()
{OLED_SCLK_Set() ;OLED_SDIN_Set();OLED_SDIN_Clr();OLED_SCLK_Clr();
}/**********************************************
//IIC Stop
**********************************************/
void IIC_Stop()
{
OLED_SCLK_Set() ;
//  OLED_SCLK_Clr();OLED_SDIN_Clr();OLED_SDIN_Set();}void IIC_Wait_Ack()
{//GPIOB->CRH &= 0XFFF0FFFF;    //设置PB12为上拉输入//GPIOB->CRH |= 0x00080000;
//  OLED_SDA = 1;
//  delay_us(1);//OLED_SCL = 1;//delay_us(50000);
/*  while(1){if(!OLED_SDA)              //判断是否接收到应答{//GPIOB->CRH &= 0XFFF0FFFF; //设置PB12为推挽输出//GPIOB->CRH |= 0x00030000;return;}}
*/OLED_SCLK_Set() ;OLED_SCLK_Clr();
}
/**********************************************
// IIC Write byte
**********************************************/void Write_IIC_Byte(unsigned char IIC_Byte)
{unsigned char i;unsigned char m,da;da=IIC_Byte;OLED_SCLK_Clr();for(i=0;i<8;i++)     {m=da;//   OLED_SCLK_Clr();m=m&0x80;if(m==0x80){OLED_SDIN_Set();}else OLED_SDIN_Clr();da=da<<1;OLED_SCLK_Set();OLED_SCLK_Clr();}}void Write_IIC_Command(unsigned char IIC_Command)
{IIC_Start();Write_IIC_Byte(0x78);            //Slave address,SA0=0IIC_Wait_Ack(); Write_IIC_Byte(0x00);           //write commandIIC_Wait_Ack();  Write_IIC_Byte(IIC_Command); IIC_Wait_Ack();    IIC_Stop();
}
/**********************************************
// IIC Write Data
**********************************************/
void Write_IIC_Data(unsigned char IIC_Data)
{IIC_Start();Write_IIC_Byte(0x78);          //D/C#=0; R/W#=0IIC_Wait_Ack();   Write_IIC_Byte(0x40);           //write dataIIC_Wait_Ack(); Write_IIC_Byte(IIC_Data);IIC_Wait_Ack();    IIC_Stop();
}
void OLED_WR_Byte(unsigned dat,unsigned cmd)
{if(cmd){Write_IIC_Data(dat);}else {Write_IIC_Command(dat);}}/********************************************
// fill_Picture
********************************************/
void fill_picture(unsigned char fill_Data)
{unsigned char m,n;for(m=0;m<8;m++){OLED_WR_Byte(0xb0+m,0);      //page0-page1OLED_WR_Byte(0x00,0);      //low column start addressOLED_WR_Byte(0x10,0);     //high column start addressfor(n=0;n<128;n++){OLED_WR_Byte(fill_Data,1);}}
}/***********************Delay****************************************/
void Delay_50ms(unsigned int Del_50ms)
{unsigned int m;for(;Del_50ms>0;Del_50ms--)for(m=6245;m>0;m--);
}void Delay_1ms(unsigned int Del_1ms)
{unsigned char j;while(Del_1ms--){  for(j=0;j<123;j++);}
}//坐标显示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);
}
//开启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
}
//关闭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
}
//清屏函数
void OLED_Clear(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(0,OLED_DATA); } //更新显示
}
void OLED_On(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(1,OLED_DATA); } //更新显示
}
//在指定位置显示一个字符
//x:0~127
//y:0~63
//mode: 0反白显示 1正常显示
//size:选择字体16/12
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size)
{       unsigned char c=0,i=0;    c=chr-' ';//得到偏移后的值          if(x>Max_Column-1){x=0;y=y+2;}if(Char_Size ==16){OLED_Set_Pos(x,y); for(i=0;i<8;i++)OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);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);}
}
//m^n函数
u32 oled_pow(u8 m,u8 n)
{u32 result=1;  while(n--)result*=m;    return result;
}
//显示两个数字
//x,y :起点坐标
//len :数字的位数
//size:字体的大小
//mode:0填充模式 1叠加模式
//num:数值(0~4294967295);
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2)
{           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+(size2/2)*t,y,' ',size2);continue;}else enshow=1; }OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2); }
}
//显示一个字符
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size)
{unsigned char j=0;while (chr[j]!='\0'){        OLED_ShowChar(x,y,chr[j],Char_Size);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;}
}
/***********显示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);          }}
} //初始化SSD1306
void OLED_Init(void)
{   GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG, ENABLE);     //ʹÄÜPC,D,G¶Ë¿ÚʱÖÓGPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_3|GPIO_Pin_8;   //PD3,PD6ÍÆÍìÊä³ö  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50HZGPIO_Init(GPIOD, &GPIO_InitStructure);      //初始化GPIOD3,6GPIO_SetBits(GPIOD,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_3|GPIO_Pin_8);   //PD3,PD6 Êä³ö¸ß#if OLED_MODE==1GPIO_InitStructure.GPIO_Pin =0xFF; //PC0~7 推挽输出GPIO_Init(GPIOC, &GPIO_InitStructure);GPIO_SetBits(GPIOC,0xFF); //PC0~7输出高GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;              //PG13,14,15 OUT推挽输出GPIO_Init(GPIOG, &GPIO_InitStructure);GPIO_SetBits(GPIOG,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);                      //PG13,14,15 OUT  输出高#elseGPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;                 //PC0,1 OUT推挽输出GPIO_Init(GPIOC, &GPIO_InitStructure);GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1);                         //PC0,1 OUT  输出高GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;                 //PG15 OUT 推挽输出      RSTGPIO_Init(GPIOG, &GPIO_InitStructure);GPIO_SetBits(GPIOG,GPIO_Pin_15);                      //PG15 OUT  输出高#endif
delay_ms(200);OLED_WR_Byte(0xAE,OLED_CMD);//--display offOLED_WR_Byte(0x00,OLED_CMD);//---set low column addressOLED_WR_Byte(0x10,OLED_CMD);//---set high column addressOLED_WR_Byte(0x40,OLED_CMD);//--set start line address  OLED_WR_Byte(0xB0,OLED_CMD);//--set page addressOLED_WR_Byte(0x81,OLED_CMD); // contract controlOLED_WR_Byte(0xFF,OLED_CMD);//--128   OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverseOLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 dutyOLED_WR_Byte(0xC8,OLED_CMD);//Com scan directionOLED_WR_Byte(0xD3,OLED_CMD);//-set display offsetOLED_WR_Byte(0x00,OLED_CMD);//OLED_WR_Byte(0xD5,OLED_CMD);//set osc divisionOLED_WR_Byte(0x80,OLED_CMD);//OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode offOLED_WR_Byte(0x05,OLED_CMD);//OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge PeriodOLED_WR_Byte(0xF1,OLED_CMD);//OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartionOLED_WR_Byte(0x12,OLED_CMD);//OLED_WR_Byte(0xDB,OLED_CMD);//set VcomhOLED_WR_Byte(0x30,OLED_CMD);//OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enableOLED_WR_Byte(0x14,OLED_CMD);//OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
}  

代码部分结束 总工程文件评论区留下邮箱我会发送
2020.12.3
又针对代码做出了一些改良 实现了通过按键实现翻页 按键部分是搬运的正点原子的代码 现贴出主函数

#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "key.h"int main(void){   u8 key=0;delay_init();         //延时函数初始化     NVIC_Configuration();     //设置nvic中断          OLED_Init();            //oled初始化OLED_Clear();           //清屏  KEY_Init();             //按键初始化  OLED_ShowCHinese(18,0,0);//OLED_ShowCHinese(36,0,1);//OLED_ShowCHinese(72,0,0);//OLED_ShowCHinese(90,0,1);//while(1){key=KEY_Scan(0);  //µÃµ½¼üÖµ
//        if(key)
//      {                          switch(key){              case WKUP_PRES:                    OLED_Init();    OLED_Clear();OLED_ShowCHinese(18,0,2);OLED_ShowCHinese(36,0,3);OLED_ShowCHinese(72,0,4);OLED_ShowCHinese(90,0,5);break; case KEY1_PRES:  OLED_Init();   OLED_Clear();OLED_ShowCHinese(18,0,7);OLED_ShowCHinese(36,0,8);OLED_ShowCHinese(72,0,9);OLED_ShowCHinese(90,0,10);break;case KEY0_PRES: break;}
//      }else delay_ms(10); }
}

效果如图


完结

STM32F103系列控制的OLED IIC 4针相关推荐

  1. STM32F103C8T6控制的OLED IIC 4针

    简介 介绍一个c8t6驱动OLED的程序,之前做设计的时候,在网上找的内容较少,所以和大家分享下.分享下采用C8T6设计时出现的问题,避免大家走弯路.由于能力有限,程序大部分来自网路,只用于学习交流. ...

  2. 1.3寸IIC OLED SSD1106控制的oled显示问题解决方案

    1.3寸IIC OLED SSD1106 控制的oled显示问题解决方案 首先鸣谢:电子发烧友论坛帖子和1.3寸OLED IIC驱动右方出现两列像素白边的解决方法 1.3和0.96oled图形库显示资 ...

  3. STM32F103系列_OLED屏幕(SSD1306、SSD1315驱动)SPI驱动【DMA】(高刷)

    STM32F103系列_OLED屏幕(SSD1306.SSD1315驱动)SPI驱动[DMA](高刷) 一.SSD1306和SSD1315 二.电路原理图(SPI接法) 三.STM32_SPI 四.S ...

  4. STM32 0.96寸OLED IIC通信

    STM32 0.96寸OLED IIC通信 OLED选取 IDE选择 配置流程 oled.c文件 oled.h文件 oledfont.h文件 OLED选取 四针(GND VCC SCL SDA)的II ...

  5. fpga驱动oled iic显示代码_【接口时序】6、IIC总线的原理与Verilog实现

    欢迎FPGA工程师加入官方微信技术群 点击蓝字关注我们FPGA之家-中国最好最大的FPGA纯工程师社群 一. 软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:ISE ...

  6. STM32F103系列芯片的地址和寄存器映射原理、LED轮流闪烁实现

    STM32F103系列芯片的地址和寄存器映射原理.LED轮流闪烁实现 文章目录 STM32F103系列芯片的地址和寄存器映射原理.LED轮流闪烁实现 1 51单片机和STM32的不同点 2 寄存器 2 ...

  7. STM32F103系列的单片机一共有11个定时器

    STM32F103系列的单片机一共有11个定时器,其中: 2个高级定时器 4个普通定时器 2个基本定时器 2个看门狗定时器 1个系统嘀嗒定时器 出去看门狗定时器和系统滴答定时器的八个定时器列表; 8个 ...

  8. STM32F103系列的单片机定时器

    STM32F103系列的单片机一共有11个定时器,且所有定时器的技数频率均为72MHZ,其中: 2个高级定时器 4个普通定时器 2个基本定时器 2个看门狗定时器 1个系统嘀嗒定时器 出去看门狗定时器和 ...

  9. stm32单片机实现多个闹钟_基于STM32F103系列单片机的11个定时器解析

    STM32F103系列的单片机一共有11个定时器,其中: 2个高级定时器 4个普通定时器 2个基本定时器 2个看门狗定时器 1个系统嘀嗒定时器 除去看门狗定时器和系统滴答定时器的八个定时器列表; 8个 ...

  10. stm32c8t6+dht11+MQ系列环境检测模块+oled显示屏(基于物联网的家庭环境检测系统设计)

    元件清单: stm32f103c8t6.mq2 检测烟雾浓度(模拟量输出).mq7 检测一氧化碳浓度.mq135 检测空气质量.OLED屏幕(四引脚仅支持iic协议通信).dht11检测温湿度(数字量 ...

最新文章

  1. halcon算子翻译——set_framegrabber_param
  2. linux ssh 隧道 tunnel 一般场景用法
  3. mysql主从字符集不一致_MySQL多字节字符集造成主从数据不一致问题
  4. 软件工程实践2017第二次作业
  5. p4 是否能自动merge
  6. ucore操作系统实验笔记 - Lab1
  7. 微信遇到特殊服务器,解决微信网页授权,出现errcode:40163,errmsg:codebeenused,看似微信访问了2次这个回调接口的问题...
  8. 数据库设计指南【转】
  9. java解压zip压缩包
  10. 搭建以太坊私有链-单机2节点
  11. 中国电信短信网关程序源码
  12. 《Targeted Backdoor Attacks on Deep Learning Systems Using Data Poisoning》论文总结
  13. 王思聪他们家到底是干什么的
  14. verilog语言的ps2键盘驱动设计
  15. k8s安装tekton,编写task
  16. 解决Vue中重复点击相同路由控制台报错问题
  17. Linux 目录详解 树状目录结构图
  18. cmd的发送 mmc_SPI模式下MMC卡的读写机制
  19. matlab建模 太阳敏感器,超分相机和太阳敏感器 首颗软件定义卫星载荷“青岛造”...
  20. Unity 模拟协程实现计时器功能

热门文章

  1. 有赞云支付php接口,Erphpdown wordpress插件集成有赞云支付的接口申请方法[已失效]...
  2. 不到100行代码制作各种证件照
  3. office各版本网盘免费下载
  4. CCNA考试题库中英文翻译版及答案6
  5. java双重循环去重_java 中 list集合去重
  6. 双向循环链表讲解及实现
  7. ev3pid巡线_基于LEGO使用PID算法进行单光巡线机器人设计的心得体会
  8. 3D打印Gcode文件命令详解
  9. Win11怎么设置鼠标箭头图案?Win11更换鼠标图案的方法
  10. opencv图像处理学习(五十七)——峰值信噪比和结构相似性