基于STM32的0.96OLED基本显示学习,及 上下或左右的滑动显示长字符(使用硬件刷屏模式),OLED显示变量值操作详细解析

  • 简   介
  • 一.项目说明
  • 二.学习入门
    • 1)开始了解例程
  • 三.实战过程
    • 1)连接好线路
    • 2)用OLED显示普通简单字符(自己的学号和姓名)
    • 3)用OLED显示变量(显示AHT20的温度和湿度;)
    • 4)基于软件刷屏模上下或左右的滑动显示长字符
    • 5)基于硬件件刷屏模上下或左右的滑动显示长字符
  • 四. 结语

简   介

  OLED为自发光材料,不需用到背光板,同时视角广、画质均匀、反应速度快、较易彩色化、用简单驱动电路即可达到发光、制程简单、可制作成挠曲式面板,符合轻薄短小的原则,应用范围属于中小尺寸面板。 显示方面:主动发光、视角范围大;响应速度快,图像稳定;亮度高、色彩丰富、分辨率高。 工作条件:驱动电压低、能耗低,可与太阳能电池、集成电路等相匹配。 适应性广:采用玻璃衬底可实现大面积平板显示;如用柔性材料做衬底,能制成可折叠的显示器。由于OLED是全固态、非真空器件,具有抗震荡、耐低温(-40℃)等特性。适用于工业设备、电力设备、指纹锁、医疗设备、小家电等行业。 各种尺寸供应,具体请联系深圳市岳邦电子科技有限公司刘荣钦先生
  通常我们所用的OLED屏有白色、蓝色、黄蓝双色等几种;屏的大小为0.96寸,像素点为128*64,所以我们也称之为0.96OLED屏或者12864屏。
内部驱动IC为SSD1306;通信方式一般为SPI或者I2C。如下图所示,配置哪种模式主要是根据BS0、BS1和BS2这三个管脚的电平逻辑来的。

一.项目说明

  博主将会带大家一起学习0.96的OLED的,以下是我们这次实战的基本目标。
例如:
1. 显示自己的学号和姓名;

2. 显示AHT20的温度和湿度;

3. 上下或左右的滑动显示长字符,比如“Hello,欢迎来到重庆交通大学物联网205实训室!”或者歌词、诗词。(最好使用硬件刷屏模)

二.学习入门

  博主是借鉴了淘宝商店里的例程,大家有兴趣可以去看看。链接: OLED淘宝商店.这些例程都是开源的大家可以去下载。
注意:不可用于商业用途
淘宝店铺首页

资料首页

1)开始了解例程

博主购买了该店的的4线的IIC 0.96OLED,所以博主下载了以下代码:

我们打开例程可以找到0,.96基于stm32的例程,所以我们的学习就从这里开始
  首先我们要了解OLED的函数分别的作用,其作用如下

OLED_Clear(0);OLED_ShowCHinese(6,0,0);//全 OLED_ShowCHinese(int x, int y,int i);x,y分别是表示字符在显示屏的坐标,而i是表示所要显示字模表中的位置OLED_ShowCHinese(26,0,1);//动OLED_ShowCHinese(46,0,2);//电OLED_ShowCHinese(66,0,3);//子OLED_ShowCHinese(86,0,4);//技OLED_ShowCHinese(106,0,5);//术OLED_ShowString(6,3,"0.96' OLED TEST",16);//OLED_ShowString(int x,int y,"字符串",字模大小))OLED_ShowString(0,6,"ASCII:",16);  OLED_ShowString(63,6,"CODE:",16);  OLED_ShowChar(48,6,t,16);//显示ASCII字符      t++;if(t>'~')t=' ';OLED_ShowNum(103,6,t,3,16);//显示ASCII字符的码值   delay_ms(50000);delay_ms(50000);delay_ms(50000);delay_ms(50000);OLED_Clear(0);OLED_DrawBMP(0,0,128,8,BMP1);  //图片显示(图片显示慎用,生成的字表较大,会占用较多空间,FLASH空间8K以下慎用)delay_ms(50000);

我们需要注意的是我们显示的时候,要先加入OLED_Clear(0);函数才能显示,并且我们要有相应的延时函数 delay_ms(50000);

三.实战过程

1)连接好线路

  
//=电源接线========//
// 5V 接DC 5V电源
// GND 接地
//OLED屏数据线接线====//
//本模块数据总线类型为IIC
// SCL 接PB13 // IIC时钟信号
// SDA 接PB14 // IIC数据信号

2)用OLED显示普通简单字符(自己的学号和姓名)

创建字库,这是字库函数的位置


使用字模工具,取字模,字模工具在之前下载的文件中有

打开字模工具

设置取字模(注意具体设置要参照,各家OLED的具体参数要求),设置完成之后就可以,确定,(一定要确定)然后在下面一栏中输入想要的字,然后点击生成字模便可

复制字模进入字模库

主函数调用即可


#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "bmp.h"
#include "stdlib.h"
#include "bsp_i2c.h"
#include "ATH20.h"
#include "stm32f10x.h"
#include "stm32f10x_usart.h"
#include "misc.h"
void GPIO_Configuration(void);
void RCC_Configuration(void);GPIO_InitTypeDef GPIO_InitStructure;int main(void){    int hcr=1;int i1=6,i2=26,i3=46,i4=66,i5=86,i6=106,   i7=126,i8=146,i9=166;uint8_t ret = 0;uint8_t LED_Stat = 0;float P,T,ALT;uint32_t CT_data[2];int  c1,t1;delay_init();            //延时函数初始化    NVIC_Configuration();      //设置NVIC中断分组2:2位抢占优先级,2位响应优先级   LED_Init();              //LED端口初始化OLED_Init();         //初始化OLED  OLED_Clear(0) ; RCC_Configuration();                     //设置系统时钟GPIO_Configuration();                       //IO口设OLED_WR_Byte(0x2E,OLED_CMD); OLED_ShowCHinese(6,0,24);OLED_ShowCHinese(26,0,25);OLED_ShowCHinese(46,0,21);OLED_ShowCHinese(66,0,6);OLED_ShowCHinese(86,0,7);OLED_ShowCHinese(106,0,8);OLED_ShowCHinese(6,3,22);OLED_ShowCHinese(26,3,23);OLED_ShowCHinese(46,3,21);OLED_ShowString(0,6,"631807030410",16);      }   

效果展示

博主这里以. 显示自己的学号和姓名来说明

3)用OLED显示变量(显示AHT20的温度和湿度;)

看过博主博客的小伙伴们应该还记得,博主在之前弄过一个AHT20的温度和湿度的学习过程,还没有看到但感兴趣的小伙伴们,可以关注博主然后关注一下博主的博客,博主接下来会持续更新干货附上博主之前开发的链接: 基于I2C软件件协议的AHT20温湿度传感器的数据采集(基于AHT20).
博主这里主要是把之前的写的部分代码加到了OLED显示这里

具体怎么加某一个函数,请参考博主这个博客:
基于I2C软件件协议的AHT20温湿度传感器的数据采集(基于AHT20).
这里就不多加赘述了==

博主这里修改了主函数部分,因为,博主之前是用的是串口输出,这里博主去掉了串口输出部分

部分代码如下:

#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "bmp.h"
#include "stdlib.h"
#include "bsp_i2c.h"
#include "ATH20.h"
#include "stm32f10x.h"
#include "stm32f10x_usart.h"
#include "misc.h"
void GPIO_Configuration(void);
void RCC_Configuration(void);GPIO_InitTypeDef GPIO_InitStructure;int main(void){    int hcr=1;int i1=6,i2=26,i3=46,i4=66,i5=86,i6=106,   i7=126,i8=146,i9=166;uint8_t ret = 0;uint8_t LED_Stat = 0;float P,T,ALT;uint32_t CT_data[2];int  c1,t1;delay_init();            //延时函数初始化    NVIC_Configuration();      //设置NVIC中断分组2:2位抢占优先级,2位响应优先级   LED_Init();              //LED端口初始化OLED_Init();         //初始化OLED  OLED_Clear(0) ; RCC_Configuration();                     //设置系统时钟GPIO_Configuration();                       //IO口设
I2C_Bus_Init();ret = ATH20_Init();if(ret == 0)while(1){   OLED_Clear(0);OLED_ShowString(0,11,"631807030616",16);  delay_ms(2500);printf("ATH20传感器初始化错误\n");}while(1) {       for(hcr=0;hcr<=166;hcr+=20){while(ATH20_Read_Cal_Enable() == 0){ATH20_Init();//如果为0再使能一次delay_ms(25);}ATH20_Read_CTdata(CT_data);  //读取温度和湿度c1 = CT_data[0] * 1000 / 1024 / 1024;  //计算得到湿度值(放大了10倍,如果c1=523,表示现在湿度为52.3%)t1 = CT_data[1] * 200 *10 / 1024 / 1024 - 500;//计算得到温度值(放大了10倍,如果t1=245,表示现在温度为24.5℃)OLED_Clear(0);if((i1-hcr)>=0)OLED_ShowCHinese(6-hcr,0,9);//全if((i2-hcr)>=0)OLED_ShowCHinese(26-hcr,0,10);//欢if((i3-hcr)>=0)OLED_ShowCHinese(46-hcr,0,11);if((i4-hcr)>=0)OLED_ShowCHinese(66-hcr,0,12);//子if((i5-hcr)>=0)OLED_ShowCHinese(86-hcr,0,13);//技if((i6-hcr)>=0)OLED_ShowCHinese(106-hcr,0,14);//术if((i7-hcr)>=0&&(i7-hcr)<=106)OLED_ShowCHinese(126-hcr,0,15);//动if((i8-hcr)>=0&&(i8-hcr)<=106)OLED_ShowCHinese(146-hcr,0,16);//电if((i9-hcr)>=0&&(i9-hcr)<=106)OLED_ShowCHinese(166-hcr,0,17);//子OLED_ShowCHinese(6,3,18);//温OLED_ShowCHinese(26,3,20);//度OLED_ShowCHinese(46,3,21);//:OLED_ShowNum(66,3,c1,1,16);OLED_ShowCHinese(6,6,19);//湿OLED_ShowCHinese(26,6,20);//度OLED_ShowCHinese(46,6,21);//:OLED_ShowNum(66,6,t1,3,16);delay_ms(2500);delay_ms(2500);//每隔两秒读一次数if(LED_Stat == 0){LED_Stat = 1;GPIO_ResetBits(GPIOC, GPIO_Pin_2);//   GPIO_ResetBits(GPIOC, GPIO_Pin_1);}else{LED_Stat = 0;GPIO_SetBits(GPIOC, GPIO_Pin_2);// GPIO_SetBits(GPIOC, GPIO_Pin_1);}}}    }void RCC_Configuration(void)
{SystemInit();RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC| RCC_APB2Periph_GPIOD| RCC_APB2Periph_GPIOE , ENABLE);
}
void GPIO_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;                   //状态LED1GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;           //通用推挽输出模式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;            //输出模式最大速度50MHzGPIO_Init(GPIOC, &GPIO_InitStructure);
}

效果演示

4)基于软件刷屏模上下或左右的滑动显示长字符

软件滚屏原理其实是通过不断地刷新坐标实现的,缺点是画面不流畅
这是刷屏的部分代码部分代码如下:

 for(hcr=0;hcr<=166;hcr+=20){while(ATH20_Read_Cal_Enable() == 0){ATH20_Init();//如果为0再使能一次delay_ms(25);}ATH20_Read_CTdata(CT_data);  //读取温度和湿度c1 = CT_data[0] * 1000 / 1024 / 1024;  //计算得到湿度值(放大了10倍,如果c1=523,表示现在湿度为52.3%)t1 = CT_data[1] * 200 *10 / 1024 / 1024 - 500;//计算得到温度值(放大了10倍,如果t1=245,表示现在温度为24.5℃)OLED_Clear(0);if((i1-hcr)>=0)OLED_ShowCHinese(6-hcr,0,9);//全if((i2-hcr)>=0)OLED_ShowCHinese(26-hcr,0,10);//欢if((i3-hcr)>=0)OLED_ShowCHinese(46-hcr,0,11);if((i4-hcr)>=0)OLED_ShowCHinese(66-hcr,0,12);//子if((i5-hcr)>=0)OLED_ShowCHinese(86-hcr,0,13);//技if((i6-hcr)>=0)OLED_ShowCHinese(106-hcr,0,14);//术if((i7-hcr)>=0&&(i7-hcr)<=106)OLED_ShowCHinese(126-hcr,0,15);//动if((i8-hcr)>=0&&(i8-hcr)<=106)OLED_ShowCHinese(146-hcr,0,16);//电if((i9-hcr)>=0&&(i9-hcr)<=106)OLED_ShowCHinese(166-hcr,0,17);//子OLED_ShowCHinese(6,3,18);//温OLED_ShowCHinese(26,3,20);//度OLED_ShowCHinese(46,3,21);//:OLED_ShowNum(66,3,c1,1,16);OLED_ShowCHinese(6,6,19);//湿OLED_ShowCHinese(26,6,20);//度OLED_ShowCHinese(46,6,21);//:OLED_ShowNum(66,6,t1,3,16);delay_ms(2500);

效果演示

5)基于硬件件刷屏模上下或左右的滑动显示长字符

1.水平左右移

OLED_WR_Byte(0x2E,OLED_CMD);        //关闭滚动
OLED_WR_Byte(0x26,OLED_CMD);        //水平向左或者右滚动 26/27
OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
OLED_WR_Byte(0x00,OLED_CMD);        //起始页 0
OLED_WR_Byte(0x07,OLED_CMD);        //滚动时间间隔
OLED_WR_Byte(0x07,OLED_CMD);        //终止页 7
OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
OLED_WR_Byte(0xFF,OLED_CMD);        //虚拟字节
OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动

2.垂直和水平滚动

OLED_WR_Byte(0x2e,OLED_CMD);        //关闭滚动
OLED_WR_Byte(0x29,OLED_CMD);        //水平垂直和水平滚动左右 29/2a
OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
OLED_WR_Byte(0x00,OLED_CMD);        //起始页 0
OLED_WR_Byte(0x07,OLED_CMD);        //滚动时间间隔
OLED_WR_Byte(0x07,OLED_CMD);        //终止页 1
OLED_WR_Byte(0x01,OLED_CMD);        //垂直滚动偏移量
OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动

说明设置前需要先发关闭滚动的指令2E,接着发滚动指令29(向右)或2A(向左)。紧接着发5条参数设置指令,用来设置持续水平滚动参数和决定滚动开始页,结束页,滚动速度和垂直滚动偏移的,最后才发开始滚屏指令2F。
注意在发送开始滚屏(2F)前要先传输好显示数据,如果在滚屏的时候传输显示数据RAM中的内容可能被损坏,无法正常显示。
这是刷屏的部分代码部分代码如下:


int main(void){ int hcr=1;int i1=6,i2=26,i3=46,i4=66,i5=86,i6=106,   i7=126,i8=146,i9=166;uint8_t ret = 0;uint8_t LED_Stat = 0;float P,T,ALT;uint32_t CT_data[2];int  c1,t1;delay_init();            //延时函数初始化    NVIC_Configuration();      //设置NVIC中断分组2:2位抢占优先级,2位响应优先级   LED_Init();              //LED端口初始化OLED_Init();         //初始化OLED  OLED_Clear(0) ; RCC_Configuration();                     //设置系统时钟GPIO_Configuration();                       //IO口设OLED_WR_Byte(0x2E,OLED_CMD);        //关闭滚动OLED_WR_Byte(0x26,OLED_CMD);        //水平向左或者右滚动 26/27OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节OLED_WR_Byte(0x00,OLED_CMD);        //起始页 0OLED_WR_Byte(0x07,OLED_CMD);        //滚动时间间隔OLED_WR_Byte(0x07,OLED_CMD);        //终止页 7OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节OLED_WR_Byte(0xFF,OLED_CMD);OLED_ShowCHinese(6,0,9);OLED_ShowCHinese(26,0,10);OLED_ShowCHinese(46,0,11);OLED_ShowCHinese(66,0,12);OLED_ShowCHinese(86,0,13);OLED_ShowCHinese(106,0,14);OLED_ShowCHinese(6,3,15);OLED_ShowCHinese(26,3,16);OLED_ShowCHinese(46,3,17);OLED_WR_Byte(0x2F,OLED_CMD);}

效果演示

四. 结语

OLED开发的优点是更简单,易用,上手,适合新手使用。oled的开发可玩性很强大,所以希望在开发的过程中,朋友们能对嵌入式有更深刻的理解,以及·能够提高自己的兴趣,这个对我们有很多的便利,所以博主在这里希望各位也要好好学习,争取掌握这个知识点。博主觉得这次开发其实很简单,希望大家在以后的学习中,善于使用我们的工具还有现成的资料。一定会事半功倍,还有就是希望各位有问题可以联系博主,博主很乐意和各位一起学习。请您关注我个人的微信公众号,微信搜索h生活剪影很期待您的关注,我们一起进步。

基于STM32的0.96OLED基本显示学习,及 上下或左右的滑动显示长字符(使用硬件刷屏模式),OLED显示变量值操作详细解析相关推荐

  1. 关于基于stm32的0.96寸oled显示屏的学习理解心得。

    关于基于stm32的0.96寸oled显示屏的学习理解心得. oled粗了解 如何理解OLED分辨率? 这里0.96寸OLED分辨率是12864;即OLED显示是128行64列; 但是由于OLED不能 ...

  2. 基于STM32的0.96寸OLED显示屏显示数据和滚动显示

    文章目录 一.SPI 二.OLED显示屏显示数据 2.1 代码实现 2.2 结果展示 三.0.96寸OLED滚动显示数据 3.1 滚动方式 3.2 对显示文字进行取模 3.3 代码实现 3.4 结果展 ...

  3. 基于stm32、0.96寸OLED实现的贪吃蛇小游戏(详细源码注释)

    简介:本实验基于stm32最小系统.0.96寸OLED(68*128)和摇杆实现一个经典的贪吃蛇小游戏.项目源码地址:点击下载. 硬件设计: 普通摇杆,0.96寸OLED 单色屏幕(SPI协议通讯), ...

  4. 基于stm32、0.96寸OLED实现的俄罗斯方块小游戏(详细源码注释)

    概述:本实验基于stm32最小系统.0.96寸OLED(68*128)和摇杆实现一个经典的俄罗斯方块小游戏.项目源码地址:点击下载. 硬件要求: 普通摇杆,两个电位器和一个开关组成,左右摇动控制一个电 ...

  5. 基于STM32的0.96寸OLED屏显示学号姓名和滚动显示

    文章目录 **一.SPI(串行外设接口)** **二.使用0.96寸OLED显示屏显示学号姓名** **三.0.96寸OLED在STM32f103上实现滚动显示长字符** **四.参考资料** 一.S ...

  6. 基于STM32的0.96寸OLED显示屏显示固定数据、滑动数据、温湿度数据

    目录 OLED显示原理 一.实验工具 二.OLED显示固定数据 1.显示数据相关函数 2.main函数 3.总显示函数 4.取字模 5.实现效果如下: 三.OLED实现滑动显示数据 1.添加滑动命令 ...

  7. 基于STM32的0.96寸OLED显示屏显示汉字+数字

    文章目录 一.SPI协议 1.什么是SPI协议 2. SPI 协议的物理层和协议层 二.0.96寸OLED屏 三.使用OLED屏显示数据 1.下载程序 2.打开工程 3.部分代码 4.编译并烧录 5. ...

  8. 基于TensorFlow 2.0的中文深度学习开源书来了!GitHub趋势日榜第一,斩获2K+星

    十三 发自 凹非寺  量子位 报道 | 公众号 QbitAI TensorFlow 2.0 发布已有一个半月之久,你会用了吗? 近日,一个叫做深度学习开源书的项目在火了.GitHub趋势日榜排名全球第 ...

  9. 基于stm32硬件IIC的oled显示

    一 stm32硬件IIC 硬件IIC特性架构 ①通讯引脚 查看对应开发板芯片的原理图可以查看对应IIC外设引脚的位置 这里代码采用的是stm32f103c8t6,硬件IIC的外设引脚为PB6 PB7, ...

最新文章

  1. python自动补全库_叼炸天的库! 自动补全 Python 代码,能节省 60% 敲码时间
  2. 计算机科普知识主题,科普知识3
  3. 一文告诉你 Java RMI 和 RPC 的区别!
  4. Android 通过 “隐式意图” 打开 系统的浏览器 访问 百度页面
  5. 激活函数:sigmoid、Tanh、ReLU
  6. KMP算法中next数组的理解与算法的实现(java语言)
  7. python网页保存为图片_使用Python保存网页上的图片或者保存页面为截图
  8. C语言试题六十一之请编写函数fun:将s所指字符串中下标为偶数的字符删除,串中剩余字符形成新串放在t所指数组中。
  9. 内部简单二进制编码(SBE)
  10. 异常:This application has no explicit mapping for /error, so you are seeing this as a fallback.
  11. 使用回调技术实现局部刷新
  12. Java数组实现五子棋功能
  13. python万年历实验报告_Python实现的简单万年历例子分享
  14. regsvr32.exe进程注册dll文件
  15. 不会代码也想做酷炫大屏?30份精美可视化模板送给你
  16. 正点原子 潘多拉stlink驱动_「正点原子Linux连载」第五十六章Linux自带的LED灯驱动实验...
  17. 最小二乘法及其代码实现
  18. 家庭wifi部署建议
  19. 计算机网络拨号,个人拨号上网宽带连接设置图文方法
  20. 《跟开涛学SpringMVC》学习笔记

热门文章

  1. Jetson Xavier gpio编程 (8)
  2. 职称计算机应用cad考试,职称计算机CAD复习试题「附答案」
  3. P4956 [COCI2017-2018#6] Davor
  4. 阿里云日志服务发布历史
  5. Linux系统最受欢迎的邮件客户端
  6. 银鑫科技--智能电子桌牌产品
  7. 05 react img css修改svg图片样式
  8. android 逐帧动画自动播放以及逐帧动画与渐变动画结合的停止问题
  9. android视频播放器轮播,嵌入 ViewPager 的视频播放器
  10. 中兴wcdma模块 linux拨号流程,Linux下ppp拨号+3G模块(evdo 中兴MC8630模块)