一.实现功能:

指定位置在OLED中显示中文,英文,数字,图片BMP

直接上代码
二.IIC代码

//-----------------OLED IIC端口定义----------------                         #define OLED_SCLK_Clr() GPIO_ResetBits(GPIOD,GPIO_Pin_6)//SDA IIC接口的时钟信号
#define OLED_SCLK_Set() GPIO_SetBits(GPIOD,GPIO_Pin_6)#define OLED_SDIN_Clr() GPIO_ResetBits(GPIOD,GPIO_Pin_7)//SCL IIC接口的数据信号
#define OLED_SDIN_Set() GPIO_SetBits(GPIOD,GPIO_Pin_7)#define OLED_CMD  0   //写命令
#define OLED_DATA 1 //写数据

开始信号

void IIC_Start()
{OLED_SCLK_Set() ;OLED_SDIN_Set();OLED_SDIN_Clr();OLED_SCLK_Clr();
}

停止信号

void IIC_Stop()
{
OLED_SCLK_Set() ;
//  OLED_SCLK_Clr();OLED_SDIN_Clr();OLED_SDIN_Set();}

等待应答

void IIC_Wait_Ack()
{OLED_SCLK_Set() ;OLED_SCLK_Clr();
}

写一个字节

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();
}

写数据

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);}}

OLED操作代码

满屏操作

void fill_picture(unsigned char fill_Data)
{unsigned char m,n;for(m=0;m<8;m++){OLED_WR_Byte(0xb0+m,0);      //page0-page1从第1页到第8页OLED_WR_Byte(0x00,0);      //low column start address开始地址OLED_WR_Byte(0x10,0);     //high column start addressfor(n=0;n<128;n++)//第0列到127{OLED_WR_Byte(fill_Data,1);}}
}

坐标设置

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);//设置哪列,高4位地址OLED_WR_Byte((x&0x0f),OLED_CMD);// 低4位地址
}

开始和关闭显示

//开启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); } //更新显示
}

以下是显示一个字符,字符串,中文,图片函数
说明:对于8*16字体,都是从设置的位置开始,先送上8列数据,完之后换页送下八列这样一个字符就完成

显示一个字符(X代表列,Y代表页数)

void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size)
{       unsigned char c=0,i=0;    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210417174841645.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI0MDkzMDgx,size_16,color_FFFFFF,t_70)int t=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);}

显示字符串

//显示一个字符号串
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size)//Y(0-6),X(0-120)
{unsigned char j=0;while (chr[j]!='\0'){        OLED_ShowChar(x,y,chr[j],Char_Size);//显示完一个字符x+=8;//列坐标加8开始写入if(x>120){x=0;y+=2;}//两页写完后下页开始j++;//下个字符}
}

显示中文

//显示汉字
void OLED_ShowCHinese(u8 x,u8 y,u8 no)//Y(0-6),X(0-112)
{                   u8 t,adder=0;OLED_Set_Pos(x,y);    //设置开始for(t=0;t<16;t++){OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);//把数组写入上8列
//              adder+=1;}    OLED_Set_Pos(x,y+1);//换页   for(t=0;t<16;t++){    OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);//把数组写入下8列
//              adder+=1;}
}

显示图片

/***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/
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_6|GPIO_Pin_7;     //PD3,PD6推挽输出  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHzGPIO_Init(GPIOD, &GPIO_InitStructure);      //初始化GPIOD3,6GPIO_SetBits(GPIOD,GPIO_Pin_6|GPIO_Pin_7);   //PD3,PD6 输出高//除了像素点作为数据写入显存外与命令有关的设置皆为命令型OLED_WR_Byte(0xAE,OLED_CMD);//--display off关OLED_WR_Byte(0x00,OLED_CMD);//---set low column address列起始位置OLED_WR_Byte(0x10,OLED_CMD);//---set high column address列起始位置OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  行起始位置OLED_WR_Byte(0xB0,OLED_CMD);//--set page address从第一页开始OLED_WR_Byte(0x81,OLED_CMD); // contract control对比控制度OLED_WR_Byte(0xFF,OLED_CMD);//--   对比控制度为256OLED_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 direction垂直翻转OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset设置向上偏移OLED_WR_Byte(0x00,OLED_CMD);//偏移0OLED_WR_Byte(0xD5,OLED_CMD);//set osc division设置分频OLED_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开显示
}  

OLED——IIC四引脚驱动相关推荐

  1. STM32实现0.96寸OLED显示模拟IIC和IIC四种实现(标准库和HAL库)

    目录 本文通过四种方法实现OLED显示 设备选择 OLED介绍 接线表设计 OLED应用 1.标准库模拟IIC实现OLED显示 2.标准库IIC实现OLED显示 3.HAL库模拟IIC实现OLED显示 ...

  2. 1.3寸OLED IIC驱动右方出现两列像素白边的解决方法

    问题 因为1.3寸OLED IIC驱动资源网上少很多,买来时以为和0.96寸OLED的驱动一样,没在意,但使用0.96寸的程序调试中,却出现右方一直有两列白边. 思考 在排除其他接线.取模显示等因素后 ...

  3. Android Sensor Driver(四)——IIC总线和驱动

    IIC是手机中主要的传感器总线,当时IIC的设备驱动想对于IIC总线来说则简单的多.IIC设备驱动本来这里我打算说一下IIC设备的数据传输函数,但是工作需要我去研究java,为了吃饭,这个sensor ...

  4. IIC总线式驱动开发(mpu6050)

    目录 一.I2C总线背景知识 二.Exynos4412 I2C收发实现之裸机版 2.1 发送 2.2 接收 三.Linux内核对I2C总线的支持 四.MPU6050 五.应用层直接使用I2C通道 5. ...

  5. STM32F103C8T6制作舵机测试仪详细图文教程 | 定时器触发ADC | DMA传输 | PWM输出 | RTC实时时钟 | USART串口输出 | OLED IIC显示

    自主学习STM32已有一周,先实现一个小demo,算是给自己一个动力叭,有目标的学习收获会更多.虽然本科也修了嵌入式课程,但那种走马观花式的学习,最后真正得到的知识实在寥寥无几.个人理解,学习STM3 ...

  6. 单片机IO引脚驱动能力的提高

    早期的51单片机,驱动能力很低.P1.P2和P3口只能驱动3个LSTTL输入端,P0口可驱动8个.如果想要驱动更多的器件,就要用到"总线驱动芯片".经常用的就是74LS244(单向 ...

  7. 论单片机IO引脚驱动能力的提高

    单片机IO引脚驱动能力的提高 早期的51单片机,驱动能力很低.P1.P2和P3口只能驱动3个LSTTL输入端,P0口可驱动8个.如果想要驱动更多的器件,就要用到"总线驱动芯片".经 ...

  8. 基于博通bcm2835芯片手册进行简单的树莓派引脚驱动

    目录 1.配置寄存器 2.设置寄存器的地址 3.编写驱动代码 4.编写应用层代码 5.编译 6.测试 1.配置寄存器 我们要进行树莓派引脚的驱动就要对树莓派的引脚进行一些配置,比如我想把树莓派的某个 ...

  9. STM32F103C8T6控制的OLED IIC 4针

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

最新文章

  1. Win32 串口编程(一)
  2. 第2年,倒数第3天,1.5万票,感动!
  3. 运算符的优先级总能起作用吗?
  4. Go Web 编程--如何确保Cookie数据的安全传输
  5. jquery 引号问题
  6. 如何使用MIME类型
  7. VS2015下载地址和安装教程(图解)
  8. 第 2 届河北省大学生程序设计竞赛(河北省赛)-Problem C. icebound 的账单-题解
  9. Hello World~Miracle is coming!!!
  10. JavaScript lambda 表达式介绍
  11. GBase 8c 技术白皮书 六
  12. L1-078 吉老师的回归 (15 分) C语言
  13. panda3d python教程_图解 Panda3D引擎开发入门
  14. dof景深matlab,CG制作景深(DOF)的方法
  15. 肯塔基大学计算机科学,西肯塔基大学计算机专业
  16. Python 解释器
  17. outlook html邮件变成纯文本,outlook 2007 收到邮件变成纯文本
  18. 看懂领导的这三个想法,能让领导刮目相看
  19. 【调剂】上海海事大学2022年硕士研究生调剂公告
  20. 本题要求编写程序计算某年某月某日是该年中的第几天。

热门文章

  1. 视频领域 CLIP4clip:An Empirical Study of CLIP for End to End Video Clip Retrieval
  2. 家用机器人扫机外毛刷_家用扫地机毛刷的选择技巧
  3. python编程入门
  4. 刽子手游戏(Hangman Judeg,Uva 489)
  5. # diskgenius 记录一次 RAID1 硬盘盒数据恢复的经历
  6. 笔记本电脑无法连接公司网络时你应该这样做
  7. windows 环境下(win10win7)Java8(jdk8)的下载+安装+环境变量设置全过程(超详细图文教程亲测版)
  8. 【渝粤题库】陕西师范大学152204 国家公务员制度
  9. havok物理引擎快速入门指南翻译
  10. lvm扩容root目录实战