OLED——IIC四引脚驱动
一.实现功能:
指定位置在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四引脚驱动相关推荐
- STM32实现0.96寸OLED显示模拟IIC和IIC四种实现(标准库和HAL库)
目录 本文通过四种方法实现OLED显示 设备选择 OLED介绍 接线表设计 OLED应用 1.标准库模拟IIC实现OLED显示 2.标准库IIC实现OLED显示 3.HAL库模拟IIC实现OLED显示 ...
- 1.3寸OLED IIC驱动右方出现两列像素白边的解决方法
问题 因为1.3寸OLED IIC驱动资源网上少很多,买来时以为和0.96寸OLED的驱动一样,没在意,但使用0.96寸的程序调试中,却出现右方一直有两列白边. 思考 在排除其他接线.取模显示等因素后 ...
- Android Sensor Driver(四)——IIC总线和驱动
IIC是手机中主要的传感器总线,当时IIC的设备驱动想对于IIC总线来说则简单的多.IIC设备驱动本来这里我打算说一下IIC设备的数据传输函数,但是工作需要我去研究java,为了吃饭,这个sensor ...
- IIC总线式驱动开发(mpu6050)
目录 一.I2C总线背景知识 二.Exynos4412 I2C收发实现之裸机版 2.1 发送 2.2 接收 三.Linux内核对I2C总线的支持 四.MPU6050 五.应用层直接使用I2C通道 5. ...
- STM32F103C8T6制作舵机测试仪详细图文教程 | 定时器触发ADC | DMA传输 | PWM输出 | RTC实时时钟 | USART串口输出 | OLED IIC显示
自主学习STM32已有一周,先实现一个小demo,算是给自己一个动力叭,有目标的学习收获会更多.虽然本科也修了嵌入式课程,但那种走马观花式的学习,最后真正得到的知识实在寥寥无几.个人理解,学习STM3 ...
- 单片机IO引脚驱动能力的提高
早期的51单片机,驱动能力很低.P1.P2和P3口只能驱动3个LSTTL输入端,P0口可驱动8个.如果想要驱动更多的器件,就要用到"总线驱动芯片".经常用的就是74LS244(单向 ...
- 论单片机IO引脚驱动能力的提高
单片机IO引脚驱动能力的提高 早期的51单片机,驱动能力很低.P1.P2和P3口只能驱动3个LSTTL输入端,P0口可驱动8个.如果想要驱动更多的器件,就要用到"总线驱动芯片".经 ...
- 基于博通bcm2835芯片手册进行简单的树莓派引脚驱动
目录 1.配置寄存器 2.设置寄存器的地址 3.编写驱动代码 4.编写应用层代码 5.编译 6.测试 1.配置寄存器 我们要进行树莓派引脚的驱动就要对树莓派的引脚进行一些配置,比如我想把树莓派的某个 ...
- STM32F103C8T6控制的OLED IIC 4针
简介 介绍一个c8t6驱动OLED的程序,之前做设计的时候,在网上找的内容较少,所以和大家分享下.分享下采用C8T6设计时出现的问题,避免大家走弯路.由于能力有限,程序大部分来自网路,只用于学习交流. ...
最新文章
- Win32 串口编程(一)
- 第2年,倒数第3天,1.5万票,感动!
- 运算符的优先级总能起作用吗?
- Go Web 编程--如何确保Cookie数据的安全传输
- jquery 引号问题
- 如何使用MIME类型
- VS2015下载地址和安装教程(图解)
- 第 2 届河北省大学生程序设计竞赛(河北省赛)-Problem C. icebound 的账单-题解
- Hello World~Miracle is coming!!!
- JavaScript lambda 表达式介绍
- GBase 8c 技术白皮书 六
- L1-078 吉老师的回归 (15 分) C语言
- panda3d python教程_图解 Panda3D引擎开发入门
- dof景深matlab,CG制作景深(DOF)的方法
- 肯塔基大学计算机科学,西肯塔基大学计算机专业
- Python 解释器
- outlook html邮件变成纯文本,outlook 2007 收到邮件变成纯文本
- 看懂领导的这三个想法,能让领导刮目相看
- 【调剂】上海海事大学2022年硕士研究生调剂公告
- 本题要求编写程序计算某年某月某日是该年中的第几天。
热门文章
- 视频领域 CLIP4clip:An Empirical Study of CLIP for End to End Video Clip Retrieval
- 家用机器人扫机外毛刷_家用扫地机毛刷的选择技巧
- python编程入门
- 刽子手游戏(Hangman Judeg,Uva 489)
- # diskgenius 记录一次 RAID1 硬盘盒数据恢复的经历
- 笔记本电脑无法连接公司网络时你应该这样做
- windows 环境下(win10win7)Java8(jdk8)的下载+安装+环境变量设置全过程(超详细图文教程亲测版)
- 【渝粤题库】陕西师范大学152204 国家公务员制度
- havok物理引擎快速入门指南翻译
- lvm扩容root目录实战