| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> 基于STC8G2K64S4单片机通过I2C硬件控制OLED屏幕 -> 正文阅读 |
|
[嵌入式]基于STC8G2K64S4单片机通过I2C硬件控制OLED屏幕 |
#前言本文主要是讲解了如何使用STC8G2K64S4单片机自带I2C硬件来控制OLED屏幕 写这篇文章主要是为了之后的模拟量光敏调节参数,使参数直接显示在OLED屏幕中更方便调节 在刚学习之时,查遍很多关于I2C通讯的文章,基本都说的很笼统,甚至还有的翻译错的,这里就根据个人的学习经历来讲解 硬件方面1、STC8G2K64S4单片机主控板一块 (需要有P24和P25引脚,用来I2C通讯,芯片手册中有写) 2、5v输出可调电源(也可以用电池接稳压模块) 3、0.96寸OLED显示屏模块(SCL接P25 SDA接P24?) OLED屏幕可以理解成由很多的LED组成,我用的是128*64的,所以就是128*64个LED,如下图所示 OLED发光的原理就是亮灯,把这个128*64个灯分组,分为8大行和128列,所以每组就是8个LED灯,所以之后就是发送8位二进制数来控制屏幕输出。通过取模软件可以直接生成数组 软件方面I2C通讯I2C是由 Philips 公司开发的两线式串行总线,用于连接微控制器及其外围设备。I2C总线简单而有效,占用的 PCB空间很小,芯片引脚数量少,设计成本低.I2C总线是一种多主机总线,连接在 I2C总线上的器件分为主机和从机。之后用到的函数需要OLED的从机地址。 组成 I2C 总线的两个信号为数据线 SDA 和时钟 SCL,如果使用软件I2C通讯则可以选用任意引脚。 SCL为高电平时,SDA由高变低表示起始信号;SCL为高电平时,SDA由低变高表示停止信号;起始信号和停止信号都是由主机发出,起始信号产生后总线处于占用状态,停止信号产生后总线被释放,处于空闲状态。 下面是数据传播的结构图? 这里做几点说明? Slave?Address(从机地址):从属地址为0111100或者0111101,其中这段二进制字节中最后的0或1是由硬件SA0决定的。最后一位R/W#是读写位,当此位是0 时,IIC为写模式 因为函数里写了向左移位,所以地址是0x3c(111100) Control byte:Co为0时,那么接下来的信息将包含数据字节。D/C#位决定数据字节时命令还是数据。当D/C#为0时,紧接着的数据字节为命令,当D/C#为1时,紧接着的数据字节为储存在GDDRAM的数据 所以命令是:0x80;数据时0x40 所以说每次发送的单个的信息是有三个数组成的,如下
SSD1306命令 ?SSD1306是屏幕里的芯片,主要是处理单片机通过I2C协议发送过去的信息,然后来判断并执行命令 1、 0x81:调节屏幕对比度,也就是亮度,范围是0x00~0xff,用法是给从机发送连续的两个数据,如下
2、0xa4/a5: 控制输出内容,当选择0xa4时,屏幕显示的是内部存储的RAM值;当选择0xa5时,屏幕将输出显示,不论内部存储RAM的值是多少,也就是全亮
3、0xa6/a7:控制内部存储的RAM值像素点开或者关,当选择0XA6时,RAM处存储的0,是像素点关,1是像素点开;当选择0XA7时,RAM处存储的0,是像素点开,1是像素点关 就是说如果RAM里存储值全是0,那么发送0xa6就是黑屏的状态,发送0xa7,那么屏幕就是点亮的状态,就好比相反一下,亮变暗,暗变亮
4、0xae/af:控制屏幕开关,ae就是打开屏幕,af就是关闭屏幕;这是显示前必不可少的一条命令
接下是寻址模式的选择,主要有三种,水平寻址模式,垂直寻址模式,页寻址模式。这个也需要通过发送命令去选择 选址命令为0x20,在每次发送选址类型时前都要发送这个,要告诉从机我要进行选址
1、 0x02页选址模式:当处于此模式时, 在GDDRAM访问后,列地址指针将自动增加1。如果列地址指针到达列终止地址,列地址指针将复位到列起始地址,但页地址指针不会改变。如果需要下一页访问则需再发送一条选择页指令
2、0x01垂直寻址模式:当处于此模式时, 在GDDRAM访问后,页地址指针将自动增加1。如果页地址指针到达页终止地址,页地址指针将复位到页起始地址,且列地址指针将自动增加1
3、0x00水平寻址模式:当处于此模式时,在GDDRAM访问后,列地址指针将自动增加1。如果列地址指针到达列终止地址, 列地址指针将复位到列起始地址, 且页地址指针将自动增加1
然后是如何选择对应的页和列 0x21:选择列,接着继续发送选择的列数据,例子如下:
0x22:选择页,接着继续发送选择的列数据,例子如下:
这些都是要在对应的寻址模式下来使用 还有一些滚动什么的指令因为没有用到所以这里就不一一解释,有兴趣的可以搜别的博文或者芯片手册去了解 取模软件这个csdn或者百度一搜索就有,有很多种,都可以使用。这个是方便于生成文字的数组或者数字以及图片的数组,这样不用一个个去敲代码了 keil程序程序中使用了逐飞科技的库函数,所以就直接调用了,大家可以去git上下载。经过优化,每个字符的函数都可以随机的选取位置显示。在前面一定要初始化屏幕,其实就是类似打开屏幕和调节亮度这些必不可少的操作,少了的话屏幕亮不起来的 屏幕初始化
屏幕清洁
通过取模软件生成的字符数组
这里要注意,由于我用的单片机内存大小问题,不能创建很多数组,所以图片显示不了了。大家若是用其他单片机可以尝试显示图片? 字符“模”的显示
屏幕显示内容
这样写完屏幕就会亮了,就能显示我们所要的内容了 #总结做OLED的初衷是用来显示模拟量光敏的模拟值,从而在竞赛准备时候更快的调试。因为前几次比赛中经常因为赛场当地的光线导致循迹不稳或者来不调节,之后会写结合模拟量光敏的文章。最初以为跟普通串口通讯一样,只要发送字符就行。没想到这么多操作,后来学了才发现,希望这些能对大家有用 本人小白,有问题交流讨论,虚心受教 |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 23:36:45- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |