STM32实现软件IIC协议操作OLED显示屏(2)

news2024/11/16 1:25:05

时间记录:2024/1/27

一、OLED相关介绍

(1)显示分辨率128*64点阵
(2)IIC作为从机的地址0x78
(3)操作步骤:主机先发送IIC起始信号S,然后发送OLED的地址0x78,然后获取校验位ACK,接着发送控制字节,告诉OLED接下来发送的一个字节数据是指令字节还是数据字节,Co=0,接下来只包含数据,D/C=0时,接下来的是指令字节,D/C=1时,接下来的是数据字节,最后发送一个IIC结束信号
OLED操作步骤
1.3.1 写指令代码

static void vOledWriteCmd(u8 cmd)
{
    vIICStart();
    vIICSendByte(0x78);
    vIICCheckAck();
    vIICSendByte(0x00);
    vIICCheckAck();
    vIICSendByte(cmd);
    vIICCheckAck();
    vIICStop();
}

1.3.2 写数据代码

static void vOledWriteData(u8 data)
{
    vIICStart();
    vIICSendByte(0x78);
    vIICCheckAck();
    vIICSendByte(0x40);
    vIICCheckAck();
    vIICSendByte(data);
    vIICCheckAck();
    vIICStop();
}

(4)显存GDDRAM大小为128*64
(5)每8COM组成一个Page,共有8Page,即64行
(6)每一个COM中有128个Segment,即128列
(7)在一个Segment中,发送的显示数据,数据高位在下,数据低位在上
Seg中数据显示

二、OLED指令+数据结合使用,先发送命令指令然后发送数据指令

(1)设置对比度,即屏幕亮度

命令数据
0x81对比度(0-255)0x00-0xFF,默认值0x7F(127)

实际是设置OLED的驱动电流,对比度设置越大,驱动电流越大,显示亮度就越高。
(2)OLED显示跟随GDDRAM,即向GDDRAM写入显示数据后是否立马改变显示

命令数据
0xA4:OLED跟随,0xA5:OLED显示固定,不跟随,默认值0xA4

(3)设置反色,即GDDRAM中0还是1表示显示

命令数据
0xA6:正常显示,1表示显示,0表示不显示,0xA7:反转显示,1表示不显示,0表示显示,默认值0xA6

(4)开启/关闭显示

命令数据
0xAE:关闭显示,进入睡眠模式,0xAF:开启显示,默认值0xAE

(5)设置显示列地址

命令数据
0x00-0x0F:设置列地址的低四位,默认值0x00,0x10-0x17:设置列地址的高四位,默认值0x10

此设置仅在页寻址模式下有效,两个设置共同决定了显示列的起始地址
(6)设置寻址模式

命令数据
0x200x00:行寻址模式,0x01:列寻址模式,0x02:页寻址模式,默认值0x02

2.6.1 页寻址模式,一行写入完毕向第1列覆盖显示
页寻址模式
2.6.2 水平/行寻址模式,一行写入完毕向下一行的第一列覆盖显示
行寻址模式
2.6.3 垂直/列寻址模式
列寻址模式
(7)设置列地址

命令数据
0x210-127,默认为0,0-127,默认为127

此设置仅在行/列寻址模式下有效,两个数据用于设置列起始地址和结束地址
(8)设置页地址

命令数据
0x220-7,默认0,0-7,默认7

此设置仅在行/列寻址模式下有效,两个数据用于设置页的起始地址和结束地址
(9)设置显示页的起始地址

命令数据
0xB0-0xB7,默认值0xB0

此设置仅在页寻址模式下有效,用于设置显示页的起始页地址
(10)设置显示开始行

命令数据
0x40-0x7F:对应64-0行,默认0x40

(11)设置列对于Segment的映射

命令数据
0xA0:Column0映射到Seg0,0xA1:Column127映射到Seg0,默认值0xA0

(12)设置通道数(分辨率)

命令数据
0xA80x01-0x3F,对应1-63,默认63

(13)设置COM Driver的扫描方向

命令数据
0xC0:从COM0扫描到COMN,0xC8:从COMN扫描到COM0,默认值0xC0

(14)设置COM的偏移值,一般设置为0,保证屏幕的完整显示

命令数据
0xD30x00-0x3F,默认0

(15)设置时钟分频比和时钟频率

命令数据
0xDA[3:0]:设置时钟分频比,[7:4]:设置时钟频率,0x12:128x64OLED,0x02:128x32OLED

(16)操作充电泵

命令数据
0x8D0x10:关闭充电泵,0x14:打开充电泵

(17)设置预充电时间

命令数据
0xD90x00-0xFF

(18)设置电压级别

命令数据
0xDB默认值0x20,0.77xVCC

三、OLED函数实现

(1)初始化函数

void vOledInit(void)
{
    vIICInit();
    Delay_Ms(100);
    
    vOledWriteCmd(0xA8);//设置分辨率
    vOledWriteCmd(0x3F);//0x3f : 128*64  0x1f  128*32
    
    vOledWriteCmd(0xDA);//设置COM硬件引脚配置,适应分辨率
    vOledWriteCmd(0x12);//0x12 : 0.96->128*64  0x02 : 0.91->128*32
    
    vOledWriteCmd(0xD3);//设置显示偏移
    vOledWriteCmd(0x00);//默认无偏移
    vOledWriteCmd(0x40);//设置显示开始0-63
    vOledWriteCmd(0xA1);//段SEGMENT重映射对于IIC四角OLED要设置为0xA1
    vOledWriteCmd(0x81);//对比度设置
    vOledWriteCmd(0xFF);//亮度设置0x00-0xFF,数值越大亮度越大
    vOledWriteCmd(0xA4);//输出遵循RAM内容,0xA5输出忽略RAM内容
    vOledWriteCmd(0xA7);//显示方式正常显示,0xA7反向显示,逆码,0点亮还是1点亮
    
    vOledWriteCmd(0x8D);//充电泵设置
    vOledWriteCmd(0x14);//允许在显示开启的时候使用,0x10:不允许在开启前使用
    
    vOledWriteCmd(0x20);//设置内存地址模式 水平/垂直/页寻址(默认)
    vOledWriteCmd(0x02);//水平0x00   垂直0x01    页寻址0x02
    vOledWriteCmd(0xC8);//设置COM扫描方式0xC0上下反置左到右  0xC8正常右到左
    vOledWriteCmd(0xB0);//为页寻址模式设置开启地址0-7
    vOledWriteCmd(0x00);//设置低列地址
    vOledWriteCmd(0x10);//设置高列地址
    
    vOledWriteCmd(0xD9);//设置预充电时期
    vOledWriteCmd(0x22);//充电时间
    
    vOledWriteCmd(0xDB);//设置取消选择级别
    vOledWriteCmd(0x20);//默认0x20 0.77xvcc
    
    vOledWriteCmd(0xAF);//显示开启
}

(2)清屏函数

void vOledClear(void)
{
    for(u8 i=0;i<8;i++)
    {
        vOledWriteCmd(0xB0|i);
        vOledWriteCmd(0x00);
        vOledWriteCmd(0x10);
        for(u8 j=0;j<128;j++){
            vOledWriteData(0x00);
        }
    }
}

(3)开/关显示

void vOledOn(void)
{
    vOledWriteCmd(0x8D);//操作充电泵
    vOledWriteCmd(0x14);//打开
    vOledWriteCmd(0xAF);
}
void vOledOff(void)
{
    vOledWriteCmd(0x8D);
    vOledWriteCmd(0x10);//关闭
    vOledWriteCmd(0xAE);
}

(4)设置显示位置函数

static void vOledSetPos(int row,int col)//设置显示位置,8行*128列
{
    vOledWriteCmd(0xB0|row);
    vOledWriteCmd(col & 0x0F);//列低4位
    vOledWriteCmd(0x10+((col>>4)&0x0F));//列高4位
}

(5)显示一个英文字符函数

static void vOledShowChar(int row,int col,u8 charData)
{
	if(row>7 || col> 127) return;

    int index = charData-' ';//计算ASCII编码位置
    
    for(u8 i=0;i<2;i++){
        vOledSetPos(row+i,col);
        for(u8 j=0;j<8;j++){
            vOledWriteData(char8X16[index][i*8+j]);
        }
    }
}

取模格式
OLED取模格式
(6)格式化显示字符串函数

void vOledShowString(int row,int col,u8 *fmtStr,...)
{
    /******字符串格式化拼接********/
    int fmtPos = 0;
    char tempStr[STRMAX];
    memset(tempStr,0,sizeof(tempStr));
    int tempPos=0;
    
    va_list vaList;
    va_start(vaList,fmtStr);
    
    for(fmtPos=0;fmtPos<strlen((char*)fmtStr);fmtPos++){
        if(fmtStr[fmtPos] == '%' && fmtStr[fmtPos+1] == 'd'){//格式化输入整数
		    sprintf(tempStr,"%s%d",tempStr,va_arg(vaList,int));
		    tempPos = strlen(tempStr);
		    fmtPos++;
		}else if(fmtStr[fmtPos] == '%' && fmtStr[fmtPos+1] == 's'){//格式化输入字符串
			sprintf(tempStr,"%s%s",tempStr,va_arg(vaList,char*));
		    tempPos = strlen(tempStr);
		    fmtPos++;
		}else if(fmtStr[fmtPos] == '%' && fmtStr[fmtPos+1] == 'f'){//格式化输入小数,小数点后全部保留
			sprintf(tempStr,"%s%lf",tempStr,va_arg(vaList,double));
		    tempPos = strlen(tempStr);
		    fmtPos++;
		}else if(fmtStr[fmtPos] == '%' && fmtStr[fmtPos+1] == '.' && fmtStr[fmtPos+3] == 'f'){//格式化输入小数,小数后进行保留指定位
			switch(fmtStr[fmtPos+2]){//默认6位,选择1-5位保留
				case '1':
					sprintf(tempStr,"%s%.1lf",tempStr,va_arg(vaList,double));
					tempPos = strlen(tempStr);
					fmtPos+=3;
					break;
				case '2':
					sprintf(tempStr,"%s%.2lf",tempStr,va_arg(vaList,double));
					tempPos = strlen(tempStr);
					fmtPos+=3;
					break;
				case '3':
					sprintf(tempStr,"%s%.3lf",tempStr,va_arg(vaList,double));
					tempPos = strlen(tempStr);
					fmtPos+=3;
					break;
				case '4':
					sprintf(tempStr,"%s%.4lf",tempStr,va_arg(vaList,double));
					tempPos = strlen(tempStr);
					fmtPos+=3;
					break;
				case '5':
					sprintf(tempStr,"%s%.5lf",tempStr,va_arg(vaList,double));
					tempPos = strlen(tempStr);
					fmtPos+=3;
					break;
				default:
					sprintf(tempStr,"%s%lf",tempStr,va_arg(vaList,double));
				    tempPos = strlen(tempStr);
				    fmtPos+=3;
					break;
			}
		}else{
			tempStr[tempPos] = fmtStr[fmtPos];
			tempPos++;
		}
    }
    
    va_end(vaList);
    
    /******输出显示字符串*******/
    for(u8 i=0;i<strlen(tempStr);i++){
        vOledShowChar(row,8*i+col,tempStr[i]);
    }
}

(7)输出一个汉字函数,文件编码格式需要转换为ANSI编码

static void vOledShowOneChinese(int row,int col,u8 font[2])
{
    if(row>7 || col> 127) return;
    
    int fontCount = sizeof(chinaFont)/sizeof(ChineseStruct);
    
    for(int index=0;index<fontCount;index++){
        if(chinaFont[index].hz[0] == font[0] && chinaFont[index].hz[1] == font[1]){
            for(int i=0;i<2;i++){
                vOledSetPos(row+i,col);
                for(int j=0;j<16;j++){
                    vOledWriteData(chinaFont[index].hzHex[i*16+j]);
                }
            }
            break;
        }
    }
}

(8)显示汉字字符串函数

void vOledShowChinaese(int row,int col,u8 *cFont)
{
    int index=0;
    u8 tempChina[2];
    
    while(cFont[index]!='\0'){
        tempChina[0] = cFont[index];
        tempChina[1] = cFont[index+1];
        vOledShowOneChinese(row,index/2*16+col,tempChina);
        index+=2;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1415404.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java servlet运输公司管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web运输公司管理系统是一套完善的java web信息管理系统 serlvetdaobean mvc 模式开发 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主 要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5…

Linux服务器配置与管理(第二次实验)

实验目的及具体要求 目的 1.掌握基于命令行的文件操作 2.掌握基于命令行的目录操作 3.掌握用户账户的命令行操作 4.掌握组账户的命令行操作 5.熟悉磁盘分区操作 6.掌握调整优先级的方法 具体要求 1.掌握基于命令行的文件和目录操作 ①创建测试目录 ②创建文件 ③复…

3DGS 其二:Street Gaussians for Modeling Dynamic Urban Scenes

3DGS 其二&#xff1a;Street Gaussians for Modeling Dynamic Urban Scenes 1. 背景介绍1.1 静态场景建模1.2 动态场景建模 2. 算法2.1 背景模型2.2 目标模型 3. 训练3.1 跟踪优化 4. 下游任务 Reference&#xff1a; Street Gaussians for Modeling Dynamic Urban Scenes 1.…

JavaGUI之SWT框架【Button】

文章目录 1. 按钮类型1.1 普通按钮1.2 单选按钮1.3 多选按钮 2. 文字风格3. 按钮外观风格 录制的视频 按钮Button&#xff0c;SWT框架中常见的组件。针对Button的设置分为三个层面&#xff0c;分别是按钮类型&#xff0c;按钮文字对齐风格&#xff0c;按钮外观风格 1. 按钮类型…

SpringBoot将第三方的jar中的bean对象自动注入到ioc容器中

新建一个模块&#xff0c;做自动配置 config&#xff1a;需要准备两个类&#xff0c;一个自动配置类&#xff0c;一个配置类 CommonAutoConfig&#xff1a;此类用于做自动配置类它会去读取resoutces下的META-INF.spring下的org.springframework.boot.autoconfigure.AutoConfig…

NoSQL基本内容

第一章 NoSQL 1.1 什么是NoSQL NoSQL&#xff08;Not Only SQL&#xff09;即不仅仅是SQL&#xff0c;泛指非关系型的数据库&#xff0c;它可以作为关系型数据库的良好补充。随着互联网web2.0网站的兴起&#xff0c;非关系型的数据库现在成了一个极其热门的新领域&#xff0c;…

苹果macOS 恶意软件家族被曝光:通过破解软件分发,可窃取敏感信息

卡巴斯基安全实验室近日发布博文&#xff0c;发现了一种针对苹果 macOS 设备的新型恶意软件家族&#xff0c;并提醒苹果 Mac 用户谨慎下载破解软件。 报告称这种新型恶意软件家族高度复杂&#xff0c;主要伪装成为各种知名 macOS 软件的破解版分发&#xff0c;用户下载恶意 PKG…

InitVerse:为云计算服务带来更高的透明度和可验证性

InitVerse&#xff1a;为云计算服务带来更高的透明度和可验证性 在云计算服务领域&#xff0c;透明度和可验证性是构建信任的关键要素。传统的云计算市场往往缺乏透明度&#xff0c;用户难以了解其数据和计算资源的实际使用情况。然而&#xff0c;通过利用区块链技术&#xff0…

2024.1.27 GNSS 学习笔记

1.精确的描述轨道的一组数据(星历)是实现精确定位与导航的基础。 2.GNSS卫星广播星历的提供方式一般有两种&#xff1a;一种是提供开普勒轨道参数和必要的轨道摄动改正项参数&#xff0c;如GPS、BDS、Galileo三大系统采用此种模式&#xff0c;还有QZSS系统&#xff1b;另一种是…

苹果提审被拒反馈崩溃日志.text | iOS 审核被拒crashLog

iOS审核人员拒绝后每个截图&#xff0c;只给了几个text文件&#xff0c;这种情况就是审核的时候运行你的代码&#xff0c;崩溃了。 仅仅看text文件&#xff0c;是看不出所以然来的&#xff0c;所以我们要将日志转换成.crash格式 1.将.text文件下载下来&#xff0c;将 .text手动…

快快销ShopMatrix 分销商城多端uniapp可编译5端-代理商收益管理:差价奖励和销售额统计

代理商收益管理是一种针对代理商的利润分配模式&#xff0c;主要通过差价奖励和销售额统计来实现。这种模式的核心思想是通过激励代理商的销售行为&#xff0c;提高代理商的积极性和销售效率&#xff0c;从而实现整个销售网络的增长。 差价奖励是代理商收益管理中的一种常见方…

Pyecharts 风采:从基础到高级,打造炫酷象形柱状图的完整指南【第40篇—python:象形柱状图】

文章目录 引言安装PyechartsPyecharts象形柱状图参数详解1. Bar 类的基本参数2. 自定义图表样式3. 添加标签和提示框 代码实战&#xff1a;绘制多种炫酷象形柱状图进阶技巧&#xff1a;动态数据更新与交互性1. 动态数据更新2. 交互性设计 拓展应用&#xff1a;结合其他图表类型…

MySQL的外键和连接,如何做到关联查询?

目录 一、MySQL介绍 二、什么是外键 三、什么是连接 四、如何实现关联查询 一、MySQL介绍 MySQL是一种开源的关系型数据库管理系统&#xff0c;它是目前最流行的数据库之一。MySQL由瑞典MySQL AB公司开发&#xff0c;后被Sun Microsystems收购&#xff0c;随后又被Oracle收…

Java基础知识-异常

资料来自黑马程序员 异常 异常&#xff0c;就是不正常的意思。在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点不同,该部位的功能将受影响.在程序中的意思就是&#xff1a; 异常 &#xff1a;指的是程序在执行过程中&#xff0c;出现的非正常的情况&#xff0c;…

【单片机】使用AD2S1210旋变芯片读取转子位置和速度

历时两周的反复调试&#xff0c;终于跑通了。只能说第一次做这种小工程确实缺乏经验&#xff0c;跟书本上学的还是有些出入。做下记录&#xff0c;方便后面来查看。 0. 实验要求 基于STM32单片机&#xff0c;使用AD2S1210旋变芯片读取电机转子位置和速度。   硬件设施&#x…

生信技能树--转录组--个人笔记

这周主要内容是学习转录组的比对&#xff0c;选择的软件为hisat2&#xff0c;该笔记仅供个人参考谨慎搬运代码。 # hisat2 可以快速准确地将测序得到的 RNA 片段&#xff08;reads&#xff09;比对到参考基因组&#xff0c;从而确定这些RNA 片段在基因组上的精确位置&#xff…

MYSQL表的约束详解!

文章目录 前言一、空属性二、默认值三、列描述四、zerofill五、主键六、自增长七、唯一键八、外键 前言 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要有一些额外的约束&#xff0c;更好的保证数据的合法性&#xff0c;从业务逻辑角度保证数据…

excel统计分析——卡方检验(基本原理)

参考资料&#xff1a;生物统计学 卡方检验&#xff08;chi-square test&#xff09;又称检验&#xff0c;是英国数理统计学家Karl Pearson推导出来的&#xff0c;该方法是处理分类变量或离散型数据的一类重要方法。分类变量或离散型数据时生物学和医学领域常见的数据类型。 1、…

ETCD高可用架构涉及常用功能整理

ETCD高可用架构涉及常用功能整理 1. etcd的高可用系统架构和相关组件1.1 Quorum机制1.2 Raft协议 2. etcd的核心参数2.1 常规配置2.2 特殊优化配置2.2.1 强行拉起新集群 --force-new-cluster2.2.2 兼容磁盘io性能差2.2.3 etcd存储quota 3. etcd常用命令3.1 常用基础命令3.1.1 列…

人脸识别 FaceNet人脸识别(一种人脸识别与聚类的统一嵌入表示)

人脸识别 FaceNet人脸识别&#xff08;一种人脸识别与聚类的统一嵌入表示&#xff09; FaceNet的简介Facenet的实现思路训练部分 FaceNet的简介 Facenet的实现思路 import torch.nn as nndef conv_bn(inp, oup, stride 1):return nn.Sequential(nn.Conv2d(inp, oup, 3, stride…