STM32 I2C_OLED显示汉字及屏幕滚动

2023-05-16

STM32 I2C_OLED显示汉字及屏幕滚动


文章目录

  • STM32 I2C_OLED显示汉字及屏幕滚动
    • 一.I2C以及AHT20温湿度传感器介绍
    • 二.用0.96寸OLED屏幕显示数据
      • 1.OLED介绍
      • 2.样例测试
    • 三.汉字编码原理
    • 编码排序A0A0→A0FE A1A0→A2FE依次排列。
    • 四.实验步骤
      • 1.软件
      • 2.具体实现
        • ①.目录结构
        • ②.字模函数
        • ③.显示汉字
        • ④.屏幕滚动
        • ⑤.主函数
    • 五.实验结果
    • 六.程序源码


任务简介
学习I2C总线通信协议,使用STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出。具体任务:


  1. 显示自己的学号和姓名;

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

  3. 上下或左右的滑动显示长字符


一.I2C以及AHT20温湿度传感器介绍

这里可以看上一篇链接

二.用0.96寸OLED屏幕显示数据

1.OLED介绍

OLED器件由基板、阴极、阳极、空穴注入层(HIL)、电子注入层(EIL)、空穴传输层(HTL)、电子传输层(ETL)、电子阻挡层(EBL)、空穴阻挡层(HBL)、发光层(EML)等部分构成。其中,基板是整个器件的基础,所有功能层都需要蒸镀到器件的基板上;通常采用玻璃作为器件的基板,但是如果需要制作可弯曲的柔性OLED器件,则需要使用其它材料如塑料等作为器件的基板。阳极与器件外加驱动电压的正极相连,阳极中的空穴会在外加驱动电压的驱动下向器件中的发光层移动,阳极需要在器件工作时具有一定的透光性,使得器件内部发出的光能够被外界观察到;阳极最常使用的材料是ITO。空穴注入层能够对器件的阳极进行修饰,并可以使来自阳极的空穴顺利的注入到空穴传输层;空穴传输层负责将空穴运输到发光层;电子阻挡层会把来自阴极的电子阻挡在器件的发光层界面处,增大器件发光层界面处电子的浓度;发光层为器件电子和空穴再结合形成激子然后激子退激发光的地方;空穴阻挡层会将来自阳极的空穴阻挡在器件发光层的界面处,进而提高器件发光层界面处电子和空穴再结合的概率,增大器件的发光效率;电子传输层负责将来自阴极的电子传输到器件的发光层中;电子注入层起对阴极修饰及将电子传输到电子传输层的作用;阴极中的电子会在器件外加驱动电压的驱动下向器件的发光层移动,然后在发光层与来自阳极的空穴进行再结合。

  • 这里我的OLED模块是基于I2C通信的,一般还有SPI版本的也很常见

在这里插入图片描述
在这里插入图片描述

2.样例测试

  • 我们先以官方例程测试用软件I2C协议在OLED屏幕上显示
  • 线路连接
    在这里插入图片描述
  • 例程
  • 链接 提取码: 1234

  • 显示结果:
    在这里插入图片描述

三.汉字编码原理

所有的汉字或者英文都是下面的原理,
生成的字库说明:(以12×12例子)

  • 由左至右,每8个点占用一个字节,最后不足8个字节的占用一个字节,而且从最高位向最低位排列。
    在这里插入图片描述
  • 一个汉字占用字节数:12÷8=1····4也就是占用了2×12=24个字节。

编码排序A0A0→A0FE A1A0→A2FE依次排列。

  • 以12×12字库的“我”为例:“我”的编码为CED2,所以在汉字排在CEH-AOH=2EH区的D2H-A0H=32H个。所以在12×12字库的起始位置就是[{FE-A0}*2EH+32H]*24=104976开始的24个字节就是我的点阵模。

其他的类推即可。

英文点阵也是如此推理。


四.实验步骤

1.软件

  • 因为后文我们需要在OLED屏幕上显示汉字,所以我们需要一个取字模的软件PCtoLCD2002 提取码: 1234

  • 下面介绍字模提取的步骤“

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.具体实现

①.目录结构

在这里插入图片描述

②.字模函数

分析:
根据我们的任务,我们需要显示的字符有:数字,±号(数字前面的符号),以及几个汉字(“姓名”,‘温’,‘湿’,‘度’),在例程中OLED_Font.h已经有了数字以及特数字符的字模了,所以我们只需要自己取几个汉字的字模。汉字另外放在一个const数组里

const uint8_t OLED_F10x16[][40]=
{
0x00,0x00,0x00,0x00,0xFC,0x84,0x84,0xA4,0xA4,0xA4,0xFC,0xA4,0xA4,0x94,0x84,0x04,
0xFE,0x00,0x00,0x00,0x00,0x40,0x20,0x1C,0x03,0x00,0x00,0x1F,0x12,0x12,0x12,0x12,
0x1E,0x1F,0x40,0x40,0x7F,0x00,0x00,0x00,/*"周",0*/
	
0x00,0x00,0x08,0xF0,0x00,0x00,0xFE,0x00,0x00,0xF0,0x10,0x10,0xFE,0xFE,0x10,0x10,
0xF0,0x10,0x00,0x00,0x00,0x80,0x40,0x27,0x10,0x0E,0x01,0x00,0x00,0x0F,0x00,0x00,
0xFF,0x7F,0x08,0x08,0x0F,0x00,0x00,0x00,/*"帅",1*/
	
0x00,0x00,0x00,0xFC,0x78,0x88,0xA8,0xA8,0xA8,0xA8,0xFA,0xA6,0xA8,0xA8,0xA8,0xE8,
0x84,0x44,0x00,0x00,0x00,0x40,0x30,0x0F,0x00,0x20,0x20,0x16,0x1A,0x4A,0x7F,0x02,
0x06,0x1A,0x1A,0x2B,0x64,0x44,0x00,0x00,/*"康",2*/
	
	
0x00,0x20,0x40,0x04,0x0C,0xE0,0x10,0x00,0xFC,0x94,0x94,0x94,0x94,0x94,0x94,0xFC,
0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x7C,0x43,0x40,0x7E,0x42,0x42,0x42,0x7E,0x42,
0x42,0x7E,0x42,0x42,0x7E,0x42,0x40,0x00,/*"温",0*/


	
0x00,0x20,0x62,0x44,0x8C,0x60,0x10,0x00,0xFC,0x94,0x54,0x54,0x54,0x94,0x54,0x54,
0xFC,0x00,0x00,0x00,0x00,0x04,0x34,0x7E,0x01,0x40,0x42,0x4C,0x58,0x40,0x7F,0x40,
0x40,0x7F,0x50,0x48,0x44,0x43,0x42,0x00,/*"湿",0*/

0x00,0x00,0x00,0xF8,0x28,0x28,0x28,0x28,0xF8,0x28,0x26,0x24,0x28,0xF8,0x38,0x28,
0x28,0x24,0x00,0x00,0x00,0x40,0x38,0x87,0x80,0x80,0x40,0x42,0x45,0x2B,0x33,0x13,
0x33,0x2B,0x46,0x40,0x40,0x40,0x40,0x00,/*"度",1*/
};


③.显示汉字

  • 我们把汉字的字模放在一个数组里,用下标来找到对应汉字

  • 传入参数中Num指的是向显示的汉字在数组当中的位置,比如上面‘周’对应Num就是0

void OLED_ShowCN(uint8_t Line, uint8_t Column, uint8_t Num)  
{      	
	uint8_t i;
	uint8_t wide=20;//字宽
	
	OLED_SetCursor((Line-1)*2, (Column-1)*wide);		//参数1:把光标设置在第几页. 参数2:把光标设置在第几列
	for (i = 0; i < wide; i++)
	{
		OLED_WriteData(OLED_F10x16[Num][i]);			//显示上半部分内容
	}
	
	OLED_SetCursor((Line-1)*2+1,(Column-1)*wide);		
	for (i = 0; i < wide; i++)
	{
		OLED_WriteData(OLED_F10x16[Num][i+wide]);		//显示下半部分内容
	}

}

④.屏幕滚动

			OLED_WriteCommand(0x2E); //关闭滚动
			OLED_WriteCommand(0x26); //水平向左或者右滚动 26/27
			OLED_WriteCommand(0x00); //虚拟字节
			OLED_WriteCommand(0x00); //起始页 0
			OLED_WriteCommand(0x07); //滚动时间间隔,数字越大转动越慢
			OLED_WriteCommand(0x03); //终止页 3
			OLED_WriteCommand(0x00); //虚拟字节
			OLED_WriteCommand(0xFF); //虚拟字节
			OLED_WriteCommand(0x2F); //开启滚动

⑤.主函数

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "AHT20-21_DEMO_V1_3.h"

int main(void)
{
	volatile float  c1=0,t1=0;
	uint32_t CT_data[2];
	Init_I2C_Sensor_Port();//初始化SDA,SCL的IO口
	Delay_1ms(500);
	OLED_Init();
	if((AHT20_Read_Status()&0x18)!=0x18)
	{
	AHT20_Start_Init(); //重新初始化寄存器
	Delay_1ms(10);
	}

	//下面显示汉字	
	OLED_ShowCN(1,1,0); //周
	OLED_ShowCN(1,2,1); //帅
	OLED_ShowCN(1,3,2); //康
	OLED_ShowString(2,1,"632007060321"); //学号
	OLED_ShowCN(3,1,3);//温
	OLED_ShowCN(3,2,5);//度
	OLED_ShowCN(4,1,4);//湿
	OLED_ShowCN(4,2,5);//度
	while(1)
	{
		
			//屏幕滚动
			OLED_WriteCommand(0x2E); //关闭滚动
			OLED_WriteCommand(0x26); //水平向左或者右滚动 26/27
			OLED_WriteCommand(0x00); //虚拟字节
			OLED_WriteCommand(0x00); //起始页 0
			OLED_WriteCommand(0x07); //滚动时间间隔,数字越大转动越慢
			OLED_WriteCommand(0x03); //终止页 3
			OLED_WriteCommand(0x00); //虚拟字节
			OLED_WriteCommand(0xFF); //虚拟字节
			OLED_WriteCommand(0x2F); //开启滚动
	
	 //AHT20_Read_CTdata(CT_data);       //不经过CRC校验,直接读取AHT20的温度和湿度数据    推荐每隔大于1S读一次
	 AHT20_Read_CTdata_crc(CT_data);  //crc校验后,读取AHT20的温度和湿度数据 
		
	 while(CT_data[0]==0x00&&CT_data[1]==0x00) //如果CRC校验不通过
	 {
	 	AHT20_Read_CTdata_crc(CT_data);
	 }
	 c1 = CT_data[0]*100*10/1024/1024;  //计算得到湿度值c1(放大了10倍)
	 t1 = CT_data[1]*200*10/1024/1024-500;//计算得到温度值t1(放大了10倍)
	下一步客户处理显示数据,
		
			Delay_1ms(1000);
			OLED_Showfloat(3,7,t1/10.00,2,1);
			
			OLED_Showfloat(4,7,c1/10.00,2,1);
	}
	
	
}

五.实验结果

请添加图片描述

六.程序源码

链接: https://pan.baidu.com/s/1WErBaAsek_QvCTCDn8GOWQ?pwd=1234 提取码: 1234

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 I2C_OLED显示汉字及屏幕滚动 的相关文章

  • rt-thread studio中新建5.0不能用

    文章目录 一 版本对比 二 文件和文件夹打斜杠 在使用RT Thread studio创建新工程5 0版本的时候 结果发现新建完成之后程序不能正常运行 但是创建4 10版本的时候却能运行 那肯定是新版本出现了BUG 一 版本对比 首先对比了
  • 毕业设计 江科大STM32的智能温室控制蓝牙声光报警APP系统设计

    基于STM32的智能温室控制蓝牙声光报警APP系统设计 1 项目简介 1 1 系统构成 1 2 系统功能 2 部分电路设计 2 1 stm32f103c8t6单片机最小系统电路设计 2 2 LCD1602液晶显示电路设计 2 2 风
  • STM32F103概要

    The STM32F103x4 STM32F103x6 STM32F103xC STM32F103xD and STM32F103xE are a drop in replacement for STM32F103x8 B medium d
  • [屏驱相关]【SWM166-SPI-Y1.28C1测评】+ 有点惊艳的开箱

    耳闻华芯微特许久了 看到论坛得评测活动赶紧上了末班车 毕竟对有屏幕得板子也是很喜欢得 京东快递小哥客客气气 微笑着把快递给了我 好评 直接拆了包 在此之前没看过视频号 所以这个圆盘盘得模具还是有点惊喜的 正面照如下 开机有灯光秀 还有动画
  • [MM32硬件]搭建灵动微MM32G0001A6T的简易开发环境

    作为学习单片机的经典 自然是通过GPIO点亮LED 或者是响应按钮的外部中断例程 这我们看看SOP8封装的芯片MM32G0001A6T得引脚 除了VDD和GND固定外 我们可以使用PA14 PA1 PA13 PA15 PA2 PA3这六个G
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • 在 Atollic TrueStudio、STM32CubeMX 中导入 C 库

    我目前正在开发 STM32F767ZI Nucleo 板和一个小安全芯片 microchip atecc508a 通过 i2c 连接进行连接 该芯片有一个可用的库加密验证库 https github com MicrochipTech cr
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • STM32的HAL中实现单按、长按和双按功能

    我正在尝试实现单击 双击和长按功能来执行不同的功能 到目前为止 我已经理解了单击和长按的逻辑 但我不知道如何检测双击 至于代码 我使用计数器实现了单击和长按 但代码仅停留在第一个 if 条件上 bool single press false
  • 无法使用 OpenOCD 找到脚本文件

    我正在尝试按照本教程将 OpenOCD 与我的 ST 发现板一起使用 https japaric github io discovery README html https japaric github io discovery READM
  • 毕设开题分享 单片机智能教室系统(智能照明+人数统计)

    1 简介 Hi 大家好 今天向大家介绍一个学长做的单片机项目 单片机智能教室系统 智能照明 人数统计 大家可用于 课程设计 或 毕业设计 项目分享 https gitee com feifei1122 simulation project
  • Windows IoT 和 DS3231 RTC 时钟

    对于我的项目 我需要当前时间和日期 不幸的是 当 RP2 关闭时 它就会失去一切 接下来的事情是 我将没有互联网连接来使用 NTP 为此 我需要实现 DS3231 RTC 模块 所有设备的通信都通过 I2C 运行 Raspberry Ard
  • CMSIS & STM32,如何开始? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 STM32 上使用 CMSIS 启动项目 网上一搜 没找到具体的教程 有些使用 SPL 开始项
  • 嵌入式开发--STM32G4系列片上FLASH的读写

    这个玩意吧 说起来很简单 就是几行代码的事 但楞是折腾了我大半天时间才搞定 原因后面说 先看代码吧 读操作 读操作很简单 以32位方式读取的时候是这样的 data IO uint32 t 0x0800F000 需要注意的是 当以32位方式读
  • 库函数点亮Led

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 例如 随着人工智能的不断发展 机器学习这门
  • 核心耦合内存在 STM32F4xx 上可执行吗?

    尝试从 STM32F429s CCM 运行代码 但每当我命中 CCM 中的第一条指令时 我总是会遇到硬故障 并且 IBUSERR 标志被设置 该指令有效且一致 STM32F4xx 是否可能不允许从 CCM 执行 数据访问效果良好 alios
  • 是什么让 SPI 比 I2C 协议更快 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我了解 I2C 和 SPI 通信的基础知识 因为两者都是同步协议 我想知道是什么让 SPI 比 I2C 更快 如果我没记错的话 使用 I2
  • STM32 Nucleo 上的上升沿中断多次触发

    我正在使用 STM32 NUCLEO F401RE 微控制器板 我有一个扬声器 经过编程 当向上 向下推操纵杆时 可以按设定的量改变频率 我的问题是 有时 通常 当向上 向下推动操纵杆时 频率会增加 减少多次 这意味着 ISR 正在执行多次
  • 为什么 i2c_smbus 函数不可用? (I2C——嵌入式Linux)

    有很多参考使用i2c smbus 开发嵌入式 Linux 软件时在 I2C 总线上进行通信的函数 什么时候i2c smbus函数如i2c smbus read word data在软件项目中引用了 ARM8 处理器错误 例如 i2c smb

随机推荐

  • RS485总线究竟能挂接多少个设备?

    N年前做门禁系统上位机软件开发的时候突击培训过串口通信编程基础 后来在我的脑海里一直认为RS485总线能且只能挂接256个设备 xff08 因为地址是1byte xff0c 取值范围也就0 255 xff09 后来经过几个项目的了解 xff
  • Python Raw Socket使用示例(发送TCP SYN数据包)

    python view plain copy import sys import time import socket import struct import random def SendPacketData Buffer 61 Non
  • mysql-server 依赖 mysql-server-5.5 解决方案

    问题 ubuntu14 04 3安装mysql时报错 xff1a sudo apt get install mysql server mysql client 正在读取软件包列表 完成 正在分析软件包的依赖关系树 正在读取状态信息 完成 有
  • 生成aruco码方法

    有两种方法得到想要的aruco码 xff1a 1 直接通过网址得到 http chev me arucogen xff08 不过只有四个格式 xff09 网页截图为 xff1a 2 通过运行C 43 43 代码得到 利用C 43 43 生成
  • 超详细c语言简化tcp通信接口(多线程实现一个服务端处理多个客户端服务)

    超详细c语言tcp通信接口 1 可下载源码 xff08 客户端 服务端通信 xff09 2 说明3 接口代码4 客户端通信main client demo c5 服务端通信main server demo c 1 可下载源码 xff08 客
  • 怎么在视频上叠加字幕和Logo--技术实现1

    这篇文章我给大家讲解的这种字幕叠加和Logo叠加方法是在渲染视频的时候 画 上去的 xff0c 其实是通过某种API将OSD和Logo绘制到显卡缓存 xff0c 然后提交缓存到屏幕 我们知道渲染视频有几种常用的API xff1a GDI x
  • opencv源码编译及配置完整版教程(win10+vs2019+opencv-4.4.0+opencv_contrib-4.4.0)

    opencv源码编译及配置完整版教程 xff08 win10 43 vs2019 43 opencv 4 4 0 43 opencv contrib 4 4 0 xff09 一 下载vs2019 官网下载 xff1a https visua
  • c++使用多个库的头文件内容里有名字相同问题

    首先说下结构体 xff0c 如果两个头文件定义的结构体内容不一样 xff0c 但名字一样 xff0c 当一个文件同时包含着两个头文件的时候 xff0c 就会报如下错误 xff1a 此时 xff0c 在不修改头文件的情况下 最好不要改动 xf
  • 蓝牙模块 HC08_两个STM32开发板无线通信

    一 HC08重要参数 蓝牙4 0 xff0c BLE xff0c 主从一体 xff1b 模块上电后 xff0c 启动需要150ms xff1b UART波特率 xff1a 9600默认 xff1b 空中速率 xff1a 1Mbps 与HC0
  • STM32 --- 使用内部FLASH存储数据

    本文记录了对一些知识点的理解 操作方法 xff0c 如有错误 xff0c 请务必批评指正 xff01 xff01 最终的测试截图 xff1a 目录 一 内部FLASH要点 关于地址 xff1a 关于解锁 xff1a 关于擦除 xff1a 关
  • Keil 代码自动格式化对齐整理 AStyle设置图解

    代码对齐 xff0c 使用前后效果 xff1a 建议 设置成快捷键 xff1a CTRL 43 S xff0c 即可保存 43 对齐 一 下载插件 https sourceforge net projects astyle files as
  • keil5 烧录程序到单片机的方法

    Keil是一种常用的单片机开发工具 xff0c 支持多种单片机芯片 下面详细说明Keil5如何烧录程序到单片机的方法 编译程序 首先 xff0c 在Keil5中打开编写好的程序工程 xff0c 进行编译 编译生成的可执行文件是 hex或 b
  • 基于STM32 + SYN6288语音播报

    完整代码下载 https download csdn net download zhouml msn 85592868 一 接线示例 xff1a 二 模块重点 xff1a 1 xff1a 5V供电 xff0c 功耗约120mA 带图中小喇叭
  • STM32开发---ADC单通道电压采集

    代码zip下载 xff1a https download csdn net download zhouml msn 86666457 spm 61 1001 2014 3001 5501 STM32 ADC单通道电压数据采集 xff0c 直
  • Keil仿真调试Debug不能放断点_图解

    前提 xff1a 正常连接了调试器 43 开发板 xff0c 才能进入Debug模式 xff01 xff01 xff01 一 正常情况 当Keil进入Debug模式 xff0c 正常可以放置断点时的界面 xff0c 是下面这样的 xff1a
  • 无人机(2)_电机

    型号值 如2212 前两位 电机外径 后两位 转子高度KV值 电机空转 时 电压每提高1V 电机转速提高 800转 分钟无刷电机 电机分有刷和无刷 无人机都是无刷 电机 贵 力气大 耐用 电池节数 很重要 一节是4 2V电调大小 A越大越好
  • Linux下运用opencv的简单图像编程

    文章目录 Linux下运用opencv的简单图像编程一 编写一个打开图片进行特效显示的代码 一 用普通方式编译程序1 准备工作 xff1a 2 准备一张图片 xff0c 移到相同目录下3 编译程序4 运行程序 二 用make 43 make
  • 简单stm32程序编写以及调试

    简单stm32程序编写以及调试 一 环境配置 1 MDK的安装 MDK xff08 Microcontroller Development Kit xff09 是针对ARM处理器 xff0c 特别是Cortex M内核处理器的最佳开发工具
  • STM32以中断的方式点亮LED小灯(标准库)

    STM32以中断的方式点亮LED小灯 xff08 标准库 xff09 文章目录 STM32以中断的方式点亮LED小灯 xff08 标准库 xff09 一 认识中断1 中断优先级 xff1a 2 中断嵌套 xff1a 3 中断执行流程4 中断
  • STM32 I2C_OLED显示汉字及屏幕滚动

    STM32 I2C OLED显示汉字及屏幕滚动 文章目录 STM32 I2C OLED显示汉字及屏幕滚动一 I2C以及AHT20温湿度传感器介绍二 用0 96寸OLED屏幕显示数据1 OLED介绍2 样例测试 三 汉字编码原理编码排序A0A