文章目录

  • 一、SPI介绍
    • 1.SPI的定义
    • 2.SPI的连接方式
    • 3.SPI的通讯过程
  • 二、OLED介绍
  • 三、显示自己的学号和姓名
    • 3.1 文字取模
    • 3.2 编写代码
    • 3.3 实验结果
  • 四、显示AHT20的温度和湿度
    • 4.1 编写代码
    • 4.2 实验结果
    • 五、上下或左右的滑动显示长字符
    • 5.1 滚屏设置
    • 5.2 编写代码
    • 5.3 实验结果
  • 六、总结
  • 七、参考资料

一、SPI介绍

1.SPI的定义

SPI(Serial Peripheral Interface)就是串行外围设备接口。
SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚。SPI 是一个环形总线结构,由 ss(cs)、sck、sdi、sdo 构成,时序主要是在 sck 的控制下,两个双向移位寄存器进行数据交换。
上升沿发送、下降沿接收、高位先发送。
上升沿到来的时候,sdo 上的电平将被发送到从设备的寄存器中。
下降沿到来的时候,sdi 上的电平将被接收到主设备的寄存器中。

2.SPI的连接方式


SS( Slave Select):从设备选择信号线,常称为片选信号线。
SCK (Serial Clock):时钟信号线,用于通讯数据同步。
MOSI (Master Output, Slave Input):主设备输出/从设备输入引脚。
MISO(Master Input,,Slave Output):主设备输入/从设备输出引脚。

3.SPI的通讯过程


MOSI 与 MISO 的信号只在 NSS 为低电平的时候才有效,在 SCK 的每个时钟周期 MOSI 和 MISO 传输一位数据。

二、OLED介绍

OLED即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display, OELD)。OLED 由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。
我使用的是 ALINETEK 的 OLED 显示模块,该模块有以下特点:
1)模块有单色和双色两种可选,单色为纯蓝色,而双色则为黄蓝双色。
2)尺寸小,显示尺寸为 0.96 寸,而模块的尺寸仅为 27mmx26mm 大小。
3)高分辨率,该模块的分辨率为128x64。
4)多种接口方式,该模块提供了总共 5 种接口包括:6800、8080 两种并行接口方式、3线或 4 线的穿行 SPI 接口方式、IIC 接口方式(只需要 2 根线就可以控制 OLED 了)。
5)不需要高压,直接接 3.3V 就可以工作了。
注意该模块不和 5.0V 接口兼容,所以在使用的时候一定要小心,勿直接接到 5V 的系统上去,否则可能烧坏模块。

三、显示自己的学号和姓名

理论介绍:
点阵汉字的字模读取与显示

3.1 文字取模

软件初始设置:

在文字输入区输入目标文字,并ctrl+enter,得到显示图:

点击C51格式,即可生成点阵:

3.2 编写代码

内容显示 TEST_MainPage函数->test.c文件:

void TEST_MainPage(void)
{
//  GUI_ShowString(28,0,"abc",16,1);//英文姓名GUI_ShowCHinese(28,20,16,"郭新宇",1);//中文姓名GUI_ShowString(4,48,"632007030611",16,1);//数字详细delay_ms(1500);        delay_ms(1500);
}

文字存储(举例)->oledfont.h文件:

const typFNT_GB16 cfont16[] =
{"系",0x00,0xF8,0x3F,0x00,0x04,0x00,0x08,0x20,0x10,0x40,0x3F,0x80,0x01,0x00,0x06,0x10,0x18,0x08,0x7F,0xFC,0x01,0x04,0x09,0x20,0x11,0x10,0x21,0x08,0x45,0x04,0x02,0x00,/*"系",0*/"统",0x10,0x40,0x10,0x20,0x20,0x20,0x23,0xFE,0x48,0x40,0xF8,0x88,0x11,0x04,0x23,0xFE,0x40,0x92,0xF8,0x90,0x40,0x90,0x00,0x90,0x19,0x12,0xE1,0x12,0x42,0x0E,0x04,0x00,/*"统",1*/"设",0x00,0x00,0x21,0xF0,0x11,0x10,0x11,0x10,0x01,0x10,0x02,0x0E,0xF4,0x00,0x13,0xF8,0x11,0x08,0x11,0x10,0x10,0x90,0x14,0xA0,0x18,0x40,0x10,0xA0,0x03,0x18,0x0C,0x06,/*"设",2*/"置",0x7F,0xFC,0x44,0x44,0x7F,0xFC,0x01,0x00,0x7F,0xFC,0x01,0x00,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,0xFF,0xFE,0x00,0x00,/*"置",3*/
};

主函数->main.c文件:

int main(void)
{   delay_init();                  //延时函数初始化      OLED_Init();                   //初始化OLED  OLED_Clear(0);             //清屏(全黑)while(1) { TEST_MainPage();         //界面显示}
}

3.3 实验结果

四、显示AHT20的温度和湿度

4.1 编写代码

温湿度显示read_AHT20函数->bsp_i2c.c文件

void read_AHT20(void)
{uint8_t   i;for(i=0; i<6; i++){readByte[i]=0;}//-------------I2C_Start();I2C_WriteByte(0x71);ack_status = Receive_ACK();readByte[0]= I2C_ReadByte();Send_ACK();readByte[1]= I2C_ReadByte();Send_ACK();readByte[2]= I2C_ReadByte();Send_ACK();readByte[3]= I2C_ReadByte();Send_ACK();readByte[4]= I2C_ReadByte();Send_ACK();readByte[5]= I2C_ReadByte();SendNot_Ack();//Send_ACK();I2C_Stop();//--------------if( (readByte[0] & 0x68) == 0x08 ){H1 = readByte[1];H1 = (H1<<8) | readByte[2];H1 = (H1<<8) | readByte[3];H1 = H1>>4;H1 = (H1*1000)/1024/1024;T1 = readByte[3];T1 = T1 & 0x0000000F;T1 = (T1<<8) | readByte[4];T1 = (T1<<8) | readByte[5];T1 = (T1*2000)/1024/1024 - 500;AHT20_OutData[0] = (H1>>8) & 0x000000FF;AHT20_OutData[1] = H1 & 0x000000FF;AHT20_OutData[2] = (T1>>8) & 0x000000FF;AHT20_OutData[3] = T1 & 0x000000FF;}else{AHT20_OutData[0] = 0xFF;AHT20_OutData[1] = 0xFF;AHT20_OutData[2] = 0xFF;AHT20_OutData[3] = 0xFF;printf("lyy");}/*通过串口显示采集得到的温湿度printf("\r\n");printf("温度:%d%d.%d",T1/100,(T1/10)%10,T1%10);printf("湿度:%d%d.%d",H1/100,(H1/10)%10,H1%10);printf("\r\n");*/t=T1/10;t1=T1%10;a=(float)(t+t1*0.1);h=H1/10;h1=H1%10;b=(float)(h+h1*0.1);sprintf(strTemp,"%.1f",a);   //调用Sprintf函数把DHT11的温度数据格式化到字符串数组变量strTemp中  sprintf(strHumi,"%.1f",b);    //调用Sprintf函数把DHT11的湿度数据格式化到字符串数组变量strHumi中  GUI_ShowCHinese(16,00,16,"温湿度显示",1);GUI_ShowCHinese(16,20,16,"温度",1);GUI_ShowString(53,20,strTemp,16,1);GUI_ShowCHinese(16,38,16,"湿度",1);GUI_ShowString(53,38,strHumi,16,1);delay_ms(1500);     delay_ms(1500);
}

点阵显示文字

"温",0x00,0x00,0x23,0xF8,0x12,0x08,0x12,0x08,0x83,0xF8,0x42,0x08,0x42,0x08,0x13,0xF8,0x10,0x00,0x27,0xFC,0xE4,0xA4,0x24,0xA4,0x24,0xA4,0x24,0xA4,0x2F,0xFE,0x00,0x00,/*"温",0*/"度",0x01,0x00,0x00,0x80,0x3F,0xFE,0x22,0x20,0x22,0x20,0x3F,0xFC,0x22,0x20,0x22,0x20,0x23,0xE0,0x20,0x00,0x2F,0xF0,0x24,0x10,0x42,0x20,0x41,0xC0,0x86,0x30,0x38,0x0E,/*"度",0*/"湿",0x00,0x00,0x27,0xF8,0x14,0x08,0x14,0x08,0x87,0xF8,0x44,0x08,0x44,0x08,0x17,0xF8,0x11,0x20,0x21,0x20,0xE9,0x24,0x25,0x28,0x23,0x30,0x21,0x20,0x2F,0xFE,0x00,0x00,/*"湿",0*/"显",0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x04,0x40,0x44,0x44,0x24,0x44,0x14,0x48,0x14,0x50,0x04,0x40,0xFF,0xFE,0x00,0x00,/*"显",0*/"示",0x00,0x00,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x01,0x00,0x01,0x00,0x11,0x10,0x11,0x08,0x21,0x04,0x41,0x02,0x81,0x02,0x05,0x00,0x02,0x00,/*"示",0*/

主函数main.c文件

#include "delay.h"
#include "usart.h"
#include "bsp_i2c.h"
#include "sys.h"#include "oled.h"
#include "gui.h"
#include "test.h"int main(void)
{   delay_init();                  //延时函数初始化          uart_init(115200);     IIC_Init();NVIC_Configuration();      //设置NVIC中断分组2:2位抢占优先级,2位响应优先级     OLED_Init();                     //初始化OLED  OLED_Clear(0); while(1){//printf("温度湿度显示");read_AHT20_once();OLED_Clear(0); delay_ms(1500);}
}

4.2 实验结果

显示AHT20的温度和湿度

五、上下或左右的滑动显示长字符

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);        //开启滚动

垂直和水平滚动

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);        //开启滚动

在发送开始滚屏前要先传输好显示数据,如果在滚屏的时候传输显示数据RAM中的内容可能被损坏,无法正常显示。

5.2 编写代码

在添加文字字模代码->oledfont.h文件
OLED显示函数test.c

void TEST_MainPage(void)
{   GUI_ShowCHinese(10,20,16,"夜空中最亮的星",1);delay_ms(1500);       delay_ms(1500);
}

主函数main.c文件

#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "gui.h"
#include "test.h"
int main(void)
{   delay_init();                  //延时函数初始化      NVIC_Configuration();        //设置NVIC中断分组2:2位抢占优先级,2位响应优先级     OLED_Init();                     //初始化OLED  OLED_Clear(0);             //清屏(全黑)OLED_WR_Byte(0x2E,OLED_CMD);        //关闭滚动OLED_WR_Byte(0x27,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);        //虚拟字节TEST_MainPage();OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动
}

5.3 实验结果

滑动显示长字符

六、总结

通过本次实验完成了基于OLED显示文字的实验。OLED是一个很有意思的外设,在之后完成更多硬件项目时,可以利用OLED进行调试显示,帮助会很大。

七、参考资料

【嵌入式16】STM32+OLED屏显应用实例
【问题解决】Keil报错:error: #8: missing closing quote

STM32+OLED屏显应用实例相关推荐

  1. 【STM32+OLED屏显应用实例】

    一,相关技术 .1.1关于SPI协议 SPI 协议是由摩托罗拉公司提出的通讯协议 (Serial Peripheral Interface) ,即串行外围设 备接口,是一种高速全双工的通信总线.它被广 ...

  2. 使用STM32实现OLED屏显

    目录 一.SPI协议的介绍 1.概述 2.特点 3.通信原理 4.通讯过程 二.OLED的介绍 1.概述 2.优点及实物图 (1)功耗低 (2)响应速度快 (3)较宽的视角 (4)能实现高分辨率显示 ...

  3. 基于STM32的OLED屏显实例

    文章标题 一.SPI协议 1.什么是SPI 2.SPI物理层 3.SPI协议层 4.SPI特点 5.通讯引脚 二.OLED屏显原理 1.简介 2.OLED屏显原理 三.OLED屏显实例 1.显示自己的 ...

  4. 基于SPI协议OLED屏显实例

    目录 一.SPI协议 1.1 SPI简介 1.2 SPI四线 1.3 SPI四种工作模式 1.4 SPI时序图 二.项目实现 2.1 实验准备 2.2 字模提取 2.3 程序代码 2.4 硬件连接 2 ...

  5. 【嵌入式系统开发16】基于OLED屏显和汉字点阵编码原理显示姓名学号,湿度温度,滚动长字符

    要求 理解OLED屏显和汉字点阵编码原理,使用STM32F103的SPI或IIC接口实现以下功能: 显示自己的学号和姓名: 显示AHT20的温度和湿度: 上下或左右的滑动显示长字符,比如"H ...

  6. OLED屏显+汉字点阵

    stm32采用SPI实现OLED屏显 简介 OLED屏显例子 一.准备工作 二.显示学号和姓名 三.滑动显示 四.显示温湿度 总结+参考 简介 SPI SPI是串行外设接口(Serial Periph ...

  7. OLED屏显+实践操作

    目录 一.题目要求 二.SPI介绍 2.1 SPI简介 2.2 SPI特点 三.OLED介绍 3.1 OLED概述 3.2 OLED模块描述 3.2 OLED模块原理图 四.STM32+OLED显示个 ...

  8. OLED屏显传感器数据显示到OLED上

    前言 目录 一.SPI介绍 Ⅰ.什么是SPI Ⅱ.SPI接口介绍 Ⅲ.数据传输 Ⅳ.工作模式 Ⅴ.优缺点 二.OLED屏显字模提取 Ⅰ.OLED定义 Ⅱ.OLED模块介绍 Ⅲ .获取资料途径 三.字模 ...

  9. OLED屏显实现字体显示

    目录 1.什么是SPI ①.SPI协议概括 2.任务 3.从官网获取参考资料 4.获取字模 5.显示自己的学号和姓名 ①.找到项目 ②.修改代码 修改 test.c 下的 TEST_MainPage ...

最新文章

  1. 《JavaScript应用程序设计》一一2.3 lambdas
  2. java se 7u67_Linux下安装jdk-7u67-linux-x64.rpm
  3. 数据流分析:可用表达式的计算+活跃变量计算+到达定值。
  4. Goland设置Go相关环境
  5. python 之 从list中随机抽取元素
  6. Symfony2插件StofDoctrineExtensionsBundle的使用说明
  7. Linux CentOS下安装Oracle
  8. .NET加水印/验证码的NuGet包
  9. ibm db2获取目标时间与当前时间的差值_【学术论文】高帧频视觉实时目标检测系统...
  10. webpack打包vue2.0项目时必现问题
  11. javaweb实训第五天上午——Spring基础
  12. HDU4370 0 or 1 最短路
  13. paip.python错误解决19
  14. 能ping通,TCP就一定能连通吗?
  15. 斗鱼实名认证 mysql_我告诉你斗鱼实名认证怎么取消
  16. 共同创业五年,技术总监却突然就这么离职了
  17. doris core安装报错Makefile:158: recipe for target 'processor.o' failed make: *** [processor.o] Error 1
  18. 基于AM437x的FPGA与ARM通信测试
  19. Excel中文本替换函数
  20. SAP PS 第八节 PS 常见问题处理-来源于SAP EPPM分享

热门文章

  1. C# error MSB3171: 生成清单时出现问题。未能加载文件或程序集,Windows.winmd
  2. 格灵深瞳:人脸识别工业级大规模人脸识别实践探讨 | 百万人学AI
  3. ROS软路由如何配置PPTP实现不同WIFI不同地址
  4. 快速使用CSS 弹性盒子
  5. CSDN ARIMA R语言_SPSS做不了主成分分析,那就换R语言实现全过程吧
  6. kali_Linux百度网盘下载
  7. WIN10系统设置了软件开机启动,但重启后软件无法启动
  8. Navicat Preminum免费版下载及补丁
  9. 帝国理工学院的计算机专业怎样,帝国理工学院计算机专业介绍
  10. Revit二次开发之点、线